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 是一个高性能的 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 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
如何选择Nginx版本?
nginx的英文官方网站是:http://www.nginx.org/在这里我们可以直接查看Nginx的各个版本号。Nginx的软件有三种版本:稳定版,开发板,和历史稳定版。开发板更新的较快,包含最近的功能和BUG修复,但同时也可能会遇到新的BUG,开发板的更新一旦稳定下来就会被纳入稳定版中。稳定版更新的较慢,但是软件的BUG会很少,可以作为企业的首选,因此通常建议使用稳定版。当然在实际工作中,选择稳定版时,尽量避免使用最新的版本,选择比已出来的最近版晚6-10个月的版本比较好。在本章我们选择1.12.2稳定版本
Nginx的安装非常简单,具体的操作如下:
1)检查并安装Nginx基础依赖包pcre-devel openssl-devel
名称中带有”devel”字符串的软件包是必须要安装的
2)安装pcre-devel以及openssl-devel
[root@yankerp ~]# yum install -y openssl-devel pcre-devel
3)开始安装Nginx 操作命令如下:
[root@yankerp ~]# mkdir -p /home/yankerp/tools
-p选项表示不提示目录是否存在,循环的向下创建所有的层级目录,如果存在就忽略。
[root@yankerp ~]# cd /home/yankerp/tools/
进入/home/yankerp/tools目录
[root@yankerp tools]# wget http://nginx.org/download/nginx-1.12.2.tar.gz
下载软件包,进入http://nginx.org/download/复制对应版本的下载链接地址。
[root@yankerp tools]# ls -l nginx-1.12.2.tar.gz -rw-r--r--. 1 root root 981687 10月 17 21:20 nginx-1.12.2.tar.gz [root@yankerp tools]# useradd -M -s /sbin/nologin nginx [root@yankerp tools]# tar zxf nginx-1.12.2.tar.gz [root@yankerp tools]# cd nginx-1.12.2/
在我们编译安装前我们可以隐藏Nginx软件名称以及版本号如下:
[root@yankerp nginx-1.12.2]# pwd /home/yankerp/tools/nginx-1.12.2 [root@yankerp nginx-1.12.2]# vim src/core/nginx.h
修改HTTP头信息中的connection字段,防止回显具体版本号
[root@yankerp nginx-1.12.2]# vim src/http/ngx_http_header_filter_module.c
有时候我们页面程序出现错误,Nginx会代我们返回相应的错误代码,回显的时候,会带上nginx和版本号,我们把他隐藏起来
[root@yankerp nginx-1.12.2]# vim src/http/ngx_http_special_response.c
以上修改完成后正式安装如下:
./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
–with-http_dav_module #增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法
–with-http_stub_status_module #获取Nginx的状态统计信息
–with-http_addition_module #作为一个输出过滤器,支持不完全缓冲,分部分相应请求
–with-http_sub_module #允许一些其他文本替换Nginx相应中的一些文本
–with-http_flv_module #提供支持flv视频文件支持
–with-http_mp4_module #提供支持mp4视频文件支持,提供伪流媒体服务端支持
–with-http_ssl_module #启用ngx_http_ssl_module
安装完成后的优化:
[root@yankerp nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
启动Nginx
nginx [root@yankerp nginx-1.12.2]# netstat -anput | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 42330/nginx: master
此时Nginx服务正式安装完成,我们开放80端口,在windows打开浏览器输入http://192.168.xx.xx也就是nginx服务器的IP地址如果看到以下图片,就表示Nginx已经启动了。
开放80端口
windows访问测试:
测试是否隐藏了版本和软件名
以上图中证明我们修改成功,再次测试返回错误的信息,如下:
Nginx的配置优化
[root@yankerp nginx-1.12.2]# ps -ef | grep nginx root 42347 1 0 14:26 ? 00:00:00 nginx: master process nginx nginx 42348 42347 0 14:26 ? 00:00:00 nginx: worker process
在这里我们还可以看到在查看的时候,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@yankerp nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
修改完成后重新加载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@yankerp conf]# vim /etc/security/limits.conf
[root@yankerp ~]# vim /usr/local/nginx/conf/nginx.conf
(2) Nginx事件处理模型
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
nginx采用epoll事件模型,处理效率高
work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际我们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接