引言
近期需要重新部署一套小程序的后端,公司重新申请了一台阿里云ECS
,因此顺带写个Nginx
的部署文档。
Nginx是俄罗斯人编写的十分轻量级的HTTP
服务器。Nginx
,它的发音为“engine X”,是一个高性能的HTTP
和反向代理服务器,同时也是一个IMAP/POP3/SMTP
代理服务器。Nginx
是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发。
Nginx以事件驱动(epoll)的方式编写,所以有非常好的性能,同时也是一个非常高效的反向代理、负载均衡。但是Nginx
并不支持cgi
方式运行,原因是可以减少由此带来的一些程序上的漏洞。所以必须使用FastCGI
方式来执行PHP
程序。
由于Nginx本身的一些优点:轻量,开源,易用,越来越多的公司使用Nginx
作为自己公司的Web
应用服务器,本文详细介绍Nginx
源码安装的同时并对Nginx
进行优化配置。
Nginx的历史回看
为什么要选择Nginx?
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有很多非常优越的特性:
作为
Web
服务器:相比Apache
,Nginx
使用更少的资源,支持更多的并发连接,体现更高的效率,这点使Nginx
尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.作为负载均衡服务器:Nginx 既可以在内部直接支持
Rails
和PHP
,也可以支持作为HTTP
代理服务器对外进行服务。Nginx 用C
编写, 不论是系统资源开销还是CPU
使用效率都比Perlbal
要好的多。作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl
语法),Bugs
非常少的服务器: Nginx 启动特别容易,并且几乎可以做到724*不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
如何选择Nginx版本?
Nginx的英文官方网站是:http://www.nginx.org/
在网址里我们可以直接查看Nginx的各个版本号。
Nginx的软件有三种版本:稳定版,开发板,和历史稳定版。
开发板更新的较快,包含最近的功能和BUG修复,但同时也可能会遇到新的BUG,开发板的更新一旦稳定下来就会被纳入稳定版中。
稳定版更新的较慢,但是软件的BUG会很少,可以作为企业的首选,因此通常建议使用稳定版。当然在实际工作中,选择稳定版时,尽量避免使用最新的版本,选择比已出来的最近版早6-10个月的版本比较好。在本章我们选择1.12.2稳定版本
Nginx的安装
1)检查并安装Nginx基础依赖包pcre-devel
openssl-devel
nginx:[root@OzanZone /]# rpm -qa openssl-devel openssl
openssl-1.0.2k-8.el7.x86_64
[root@OzanZone /]# rpm -qa pcre-devel pcre
pcre-8.32-17.el7.x86_64
名称中带有"devel"字符串的软件包是必须要安装的
2)如果查询不到上面的两个devel
包,则安装pcre-devel
以及openssl-devel
[root@OzanZone /]# yum install -y openssl-devel pcre-devel
安装后查看下
[root@OzanZone /]# rpm -qa openssl-devel openssl
openssl-devel-1.0.2k-12.el7.x86_64
openssl-1.0.2k-12.el7.x86_64
[root@OzanZone /]# rpm -qa pcre-devel pcre
pcre-devel-8.32-17.el7.x86_64
pcre-8.32-17.el7.x86_64
3)开始安装Nginx 操作命令如下:
[root@OzanZone /]# mkdir -p /home/ozan/tools/
-p选项表示不提示目录是否存在,循环的向下创建所有的层级目录,如果存在就忽略。
[root@OzanZone /]# cd /home/ozan/tools/
进入/home/ozan/tools/目录
[root@OzanZone tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
下载软件包,进入http://nginx.org/download/复制对应版本的下载链接地址。
[root@OzanZone tools]# ls -l nginx-1.12.2.tar.gz
-rw-r--r-- 1 root root 981687 Oct 17 2017 nginx-1.12.2.tar.gz
[root@OzanZone tools]# useradd -M -s /sbin/nologin nginx
[root@OzanZone tools]# tar zxf nginx-1.12.2.tar.gz
[root@OzanZone tools]# cd nginx-1.12.2
./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx --group=nginx
make && make install
#增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法
--with-http_dav_module
#获取Nginx的状态统计信息
--with-http_stub_status_module
#作为一个输出过滤器,支持不完全缓冲,分部分相应请求
--with-http_addition_module
#允许一些其他文本替换Nginx相应中的一些文本
--with-http_sub_module
#提供支持flv视频文件支持
--with-http_flv_module
#提供支持mp4视频文件支持,提供伪流媒体服务端支持
--with-http_mp4_module
#启用ngx_http_ssl_module
--with-http_ssl_module
安装完成后的优化:
[root@OzanZone nginx]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
启动Nginx
[root@OzanZone sbin]# nginx
[root@OzanZone sbin]# netstat -anput|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21041/nginx: master
此时Nginx
服务正式安装完成,我们开放80端口,在windows打开浏览器输入http://xx.xx.xx.xx也就是nginx服务器的IP
地址如果看到以下图片,就表示Nginx已经启动了。
windows访问测试:
Nginx的配置优化
[root@OzanZone sbin]# ps -ef | grep nginx
root 21041 1 0 14:22 ? 00:00:00 nginx: master process nginx
nginx 21042 21041 0 14:22 ? 00:00:00 nginx: worker process
root 21052 18032 0 14:27 pts/0 00:00:00 grep --color=auto nginx
在这里我们还可以看到在查看的时候,work进程是nginx程序用户,但是master进程还是root,其中,master是监控进程,也叫主进程,work是工作进程,部分还有cache相关进程,关系如图:
可以直接理解为master是管理员,work进程才是为用户提供服务的!
nginx运行工作进程个数,一般我们设置为cpu核心或者核心数x2
如果不了解cpu的核数,我们可以使用top命令来查看,之后在按1就可以看出来,同时也可以查看/etc/cpuinfo/文件,这里我就用top命令了如下:
假设我有四核那么我们修改nginx
主配置 nginx.conf
文件
Nginx运行CPU亲和力,比如四核:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
八核如下:
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
[root@OzanZone conf]# vi nginx.conf
#user nobody;
worker_processes 2;
worker_cpu_affinity 01 10;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
修改完成后重新加载nginx
配置文件查看,如下:
[root@OzanZone conf]# vi nginx.conf
[root@OzanZone conf]# nginx -s reload
[root@OzanZone conf]# ps -ef|grep nginx
root 21085 1 0 14:46 ? 00:00:00 nginx: master process nginx
nginx 21105 21085 0 14:50 ? 00:00:00 nginx: worker process
nginx 21106 21085 0 14:50 ? 00:00:00 nginx: worker process
root 21112 18032 0 14:50 pts/0 00:00:00 grep --color=auto nginx
设置Nginx最多打开的文件数
worker_rlimit_nofile 65535;
这个指令是指当一个nginx
进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx
进程数相除,但是nginx
分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
文件资源限制的配置可以在/etc/security/limits.conf
设置,针对root/user
等各个用户或者*
代表所有用户来设置。
* soft nofile 65535
* hard nofile 65535
用户重新登录生效再查看ulimit -n
[root@OzanZone security]# vim /etc/security/limits.conf
# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
[root@OzanZone local]# su -l
Last login: Mon Jul 9 15:10:39 CST 2018 from 58.222.192.194 on pts/1
[root@OzanZone ~]# ulimit -n
65535
然后修改nginx.conf文件vim /usr/local/nginx/conf/nginx.conf
#user nobody;
worker_processes 2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 65535;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
Nginx事件处理模型
#user nobody;
worker_processes 2;
worker_cpu_affinity 01 10;
worker_rlimit_nofile 65535;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
-
nginx
采用epoll
事件模型,处理效率高 -
work_connections
是单个worker
进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker
进程数乘以work_connections
(实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了)! -
multi_accept
告诉nginx
收到一个新连接通知后接受尽可能多的连接,默认是on
,设置为on
后,多个worker
按串行方式来处理连接,也就是一个连接只有一个worker
被唤醒,其他的处于休眠状态,设置为off
后,多个worker
按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
示例