Nginx是当今最流行的WEB服务器一,其特性主要有以下几点:
1.模块化设计、较好的扩展性
Nginx虽然支持模块化,但尚不能向HTTPD那样支持动态模块加载
2.高可靠
Nginx工作时,由主控进程master直接生成多个worker进程,主控进程负责解析配置文件,并启动子进程,子进程直接负责处理客户端连接请求。
3.低内存消耗
Nginx采用了分阶段资源分配技术,使得其cpu和内存占用率极低,官方宣称10000个keepalive的nginx连接只需要2.5M内存。
4.支持热部署
在不停机的情况下可更新配置文件、实现日志滚动甚至更新程序版本。
5.支持事件驱动机制、AIO、mmap
Nginx能很好地支持事件驱动机制、异步IO机制和内存映射机制
Nginx的重要功能:
1.成为静态资源的WEB服务器
Nginx也可以向HTTPD一样成为静态页面服务器,但需要安装http模块
2.支持http、smtp、pop3协议的反向代理
可设置Nginx把来自基于http、smtp、pop3协议的请求修改后发送给其他服务器。
3.支持缓存和负载均衡机制
支持缓存加速且可把来自客户端的请求发送给后端的多台服务器,以实现负载均衡的机制。
4.支持FCGI,UWCGI模块
可以基于FCGI模式把动态内容发送给后端的php服务器,或者基于UWCGI模式把python编写的WEB应用程序发给后端的python解释服务器。
5.支持SSL
可以基于SSL提供HTTPS服务
接下来就将对Nginx的配置以实验的方式进行演示
场景一:Nginx扮演静态页面服务器的角色工作
1.配置各种虚拟主机
(1) 编辑配置文件/etc/nginx/nginx.conf在http{}部分内添加如下内容
server { listen 172.16.35.4:80; server_name www.nginx.com; root "/var/nginx/nginx.com"; index index.html index.php; } server { listen 172.16.35.6:80; server_name www.nginx1.com; root "/var/nginx/nginx.com1"; index index.html index.php; } server { listen 172.16.35.6:8080; server_name www.nginx2.com; root "/var/nginx/nginx.com2"; index index.html index.php; } server { listen 172.16.35.4:80; server_name www.nginx3.com; root "/var/nginx/nginx.com3"; index index.html index.php; }
(2) 新建虚拟主机目录,并提供主页和修改权限
#创建虚拟主机目录
[root@localhost ~]# mkdir -pv /var/nginx/{nginx.com,nginx.com1,nginx.com2,nginx.com3} mkdir: created directory `/var/nginx/nginx.com' mkdir: created directory `/var/nginx/nginx.com1' mkdir: created directory `/var/nginx/nginx.com2' mkdir: created directory `/var/nginx/nginx.com3'
#:为各虚拟主机提供配置文件
[root@localhost ~]# touch "this is nginx.com">/var/nginx/nginx.com/index.html [root@localhost ~]# echo "this is nginx.com1">/var/nginx/nginx.com1/index.html [root@localhost ~]# echo "this is nginx.com2">/var/nginx/nginx.com2/index.html [root@localhost ~]# echo "this is nginx.com3">/var/nginx/nginx.com3/index.html
#:修改属主和属组
[root@localhost ~]# chown -R nginx.nginx /var/nginx/
(3) 配置网卡子接口和重启服务并测试
#配置网卡子接口
[root@localhost ~]# ifconfig eth0:1 172.16.35.6/16 [root@localhost ~]# ifconfig eth0:2 172.16.35.4/16
#测试nginx配置文件语法后
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
#通知nginx重读配置文件
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload
#测试
修改/etc/hosts
测试
2.自定义定向错误页面和访问控制
(1) 自定义定向错误页面
# 修改配置文件
#在根目录下新建此文件,并添加内容
[root@localhost nginx.com]# echo "o no the sources is not find you get some information from www.nginx.org">/var/nginx/nginx.com/404page.html
#测试
(2)访问控制
#基于客户端的访问控制
设置拒绝物理机(172.16.250.121)访问
用物理机测试
#基于用户的访问控制
修改配置文件
使用htpasswd命令向文件中增加用户信息
测试
(3)使用Nginx+SSL实现HTTPS
#生成证书
生成自签证书
[root@localhost CA]# (umask 077;openssl genrsa -out private/cakey.pem) [root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650#根据提示输入相关信息 [root@localhost CA]# touch index.txt [root@localhost CA]# echo "01">serial [root@localhost CA]# mkdir /etc/nginx/ssl [root@localhost CA]# cd /etc/nginx/ssl [root@localhost ssl]# (umsak 077;openssl genrsa -out nginx.key 2014) [root@localhost ssl]# cd /etc/pki/CA/ [root@localhost CA]# openssl ca -in /etc/nginx/ssl/nginx.csr -out /etc/nginx/ssl/nginx.crt -days 3650
#修改配置文件
在主配置文件的http{}部分内添加如下一行
include /etc/nginx/conf.d/ssl.conf;
修改ssl配置文件/etc/nginx/conf.d/ssl.conf
server { listen 443; server_name www.ssl.com ; root /var/www/ssl ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt;#证书存放位置 ssl_certificate_key /etc/nginx/ssl/nginx.key;#私钥存放位置 ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; }
新建虚拟主机目录并为其提供主页
[root@localhost CA]# mkdir /var/www/ssl [root@localhost CA]# echo "ssl test" >/var/www/ssl/index.html
重启服务测试
[root@localhost CA]# nginx -s reload
场景二:反向代理动态请求至动态页面服务器
在此以Linux+Nginx+MariaDB+PHP演示如何编译安装
#编译Nginx
下载并解压Nginx源码文件到/usr/local目录下
安装pcre-devel包,有时还需要安装其他包,读者可根据提示操作即可
[root@localhost nginx-1.4.7]# yum install pcre-devel -y
添加用于运行Nginx的系统用户
[root@localhost nginx-1.4.7]# useradd -r nginx
执行./configure
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
然后安装
make && make install
添加bash查找路径
[root@localhost ~]# echo "export PATH=/usr/local/nginx/sbin:$PATH" >/etc/profile.d/nginx.sh [root@localhost ~]# . /etc/profile.d/nginx.sh
#编译PHP
解压php包后切换目录至php目录
[root@localhost php-5.4.26]# ./configure --prefix=/usr/local/php --enable-fpm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr/ --enable-xml --enable-sockets --with-mcrypt --with-bz2 --with-config-file-path=/etc/php/php.ini --with-config-file-scan-dir=/etc/php.d/ [root@bogon php-5.6.8]# make && make install
注:可能需要配置epel源安装libmcrypt、libmcrypt-devel包
围php提供运行脚本
[root@localhost php-5.4.26]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm [root@localhost php-5.4.26]# chmod +x /etc/rc.d/init.d/php-fpm#:给脚本执行权 [root@localhost php-5.4.26]# chkconfig --add php-fpm#添加到chkconfig列表,[root@localhost php-5.4.26]# chkconfig php-fpm on#设置开机自启动
为PHP提供配置文件
[root@localhost php-5.4.26]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
编辑配置文件,修改一下几项
Pm.max_children = 50#:设置最多子进程数量为50 Pm_start_servers = 5#:设置预先启动的进程数为5个 Pm.min_spare_servers = 2#:设置最少空闲子进程数为2 Pm.max_spare_servers = 8#:设置最多空闲子进程数为8 Pid = /usr/local/php/var/run/php-fpm.pid#:设置进程文件位置
启动服务测试:
[root@localhost php-5.4.26]# service php-fpm restart
Mairadb安装使用通用二进制安装即可,在此不多做介绍,可参考http://7703592.blog.51cto.com/7693592/1649948
#修改配置文件,实现LNP结合
修改Nginx主配置文件/etc/nginx/nginx.conf,启用如下配置,并修改其代理文件的位置
编辑/usr/local/nginx/html/index.php,使其内容如下
重启服务并测试
[root@localhost html]# service php-fpm restart [root@localhost html]# nginx -s reload