nginx是一个高并发web服务器,所以没有很好的优化配置可能会产生性能瓶颈与安全问题。
1.隐藏nginx版本号,防止根据某个软件版本漏洞来攻击服务器
在http模块中添加server_tokens off;
或者在nginx编译安装前改掉所有涉及版本号的文件,具体有哪些文件有版本号如果不知道很好办全局搜索下,没有办不到只有想不到
[root@localhost nginx-1.14.0]# find . -type f | xargs grep '1.14.0'
./src/core/nginx.h:#define nginx_version 1014000
./src/core/nginx.h:#define NGINX_VERSION "1.14.0"
./CHANGES.ru:Изменения в nginx 1.14.0 17.04.2018
./CHANGES:Changes with nginx 1.14.0 17 Apr 2018
看搜索的结果便知道哪个文件了(CHANGES.ru和CHANGES文件是软件更新记录一个是俄语一个是英文版可以直接忽略这两个文件)。
2.nginx进程数(worker_processes)
这个参数一般根据系统cpu数目和cpu核数来决定。 查看我们的物理cpu总个数
[root@localhost nginx-1.14.0]# grep 'physical id' /proc/cpuinfo | uniq | wc -l
4
查看我们的cpu总核数(说明我们的系统是每个物理cpu为4核)
[root@localhost nginx-1.14.0]# grep processor /proc/cpuinfo | uniq | wc -l
16
所以这里worker_processes我们可以设置为4或者为8,16 当然我觉得设置为1-16之间的数也是可以。
我们根据自己服务器并发量选择较为合适的。为了能够合理的分配nginx在cpu的占用可以指定cpu的序号
worker_processes 4
worker_cpu_affinity 0001 0010 0100 1000
3.worker_connections
高并发必然产生高tcp连接数而且nginx默认是60s才断开连接,每个tcp连接都是一次文件的打开,这里就涉及到系统限制了。
worker_connections 这个参数是单个nginx进程的连接数。这里就涉及到系统最大句柄数 。
查看系统单进程的最大连接数(这里系统有的默认1024,阿里云好像默认都是65535,这里系统调优不再叙述了日后再写单独详述)
[root@iZbp15rphz5qsw8uy3yt20Z ~]# ulimit -n
65535
所以这里我们根据系统可设置worker_connections 65535
那么我们nginx最大并发量就是worker_processes* worker_connections = 262140。
4.事件I/O模型
nginx的连接处理机制不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop。 centos7.0选择如下模型
events {
use epoll;
}
5.keepalive_timeout
tcp连接失效时间,默认60s,60s后再次请求会经过三次握手。
6.高效文件传输模式
http {
sendfile on;
sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提升nginx工作效率。
7.gzip压缩
资源压缩的原理是通过ngx_http_gzip_module模块拦截请求,并对需要做gzip的类型做gzip,ngx_http_gzip_module是Nginx默认集成的,直接开启即可。
gzip on; #表示开启压缩功能
gzip_min_length 1k; #表示允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩,小于1K则不会压缩
gzip_buffers 4 32k; #设置压缩缓冲区大小
gzip_http_version 1.1; #设置针对http协议版本
gzip_comp_level 9; #压缩比率
gzip_types text/css text/xml application/javascript; #指定压缩的类型
gzip_vary on; #vary header支持