高并发场景中nginx的优化方案
本文主要从以下几点讲解如何优化Nginx,以增强高并场景中Nginx的吞吐量。
- 调整worker_processes和worker_connections参数
- 关闭access.log日志打印
- 使用Gzip压缩
- 缓存静态文件
- TCP Fast Open
Nginx的优化主要是基于nginx.conf文件中的属性做修改,所以比较简单,但是由于服务器配置、环境以及所承载的服务的不同,导致配置的属性参数并不一定要按照本文中所给的做修改,最好的建议是根据自己服务器的情况,逐一修改参数并做测试。
优化Nginx之前,请确保备份了nginx.conf文件。
1. 调整worker_processes和worker_connections
worker_processes和worker_connections的优化,是为了确保nginx同一时间最大连接数达到最优1) worker_processes
worker_processes指Nginx的工作进程,这个值是直接受到服务器CPU核数量影响的(当然也有其他影响),Nginx默认配置为auto,意思是会自动检测CPU核做修改,建议worker_processes的值直接修改为CPU的核数。
Linux系统可通过命令lscpu查看cpu核数,假如为4,则:worker_processes: 4
2) worker_connections
worker_connections指单个进程能并发处理的最大连接数,包含了所有的Nginx链接(不仅仅来源于web客户端),默认值是
768,在一些(瞬间)并发量较高的场景中,这个值是远远不够用的。
Nginx官方示例中给定单个进程的worker_connections设置是1024,可以根据worker_processes的值做调整。
即:worker_connections = worker_processes * 1024
建议按照服务器的实际情况来调整worker_connections的值。
3) worker_rlimit_nofile、use epoll、multi_accept on
除了worker_processes和worker_connections,还需要关注以下几个概念:
- worker_rlimit_nofile
- use epoll
- multi_accept on
worker_rlimit_nofile: 代表worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样Nginx就不会有“too many open files”问题了
use epoll: use指Nginx的链接处理方式,Linux服务器可以配置为epoll,其他参数的使用可参看链接
multi_accept on: 告诉Nginx收到一个新连接通知后接受尽可能多的连接
其中,worker_rlimit_nofile默认值是2000,可以将这个值增大到worker_processes*worker_connections
,具体可更根据服务器情况调整,但是要注意worker_connections的值不能超过worker_rlimit_nofile。
参考示例:
... worker_processes 4; worker_rlimit_nofile 16384; ... events { use epoll; multi_accept on; worker_connections 4096; } ...
2. 关闭access.log日志打印
关闭access.log操作比较简单,只需要将对应的代码注释掉,然后添加 access_log off;
参考示例:
# access_log /var/log/nginx/access.log; access_log off;
假如Nginx只是做代理服务,建议去掉access.log的打印。
3. 使用Gzip压缩
Nginx的Gzip模块提供了对http传输数据(诸如:文本、json、js、css、xml等)的压缩,默认配置中gzip是关闭了的,开启需要去掉Gzip压缩命令的注释即可。
参考示例:
gzip on; gzip_min_length 1024; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml; gzip_disable msie6;
gzip_min_length: gzip压缩的http响应的最小长度。通过读取Content-Length中数值判断是否需要被压缩,建议设置为1k以上,小于1k的数据可能会越压越大
gzip_proxied: Nginx作为反向代理的时候使用,具体用法可以直接使用官方默认的配置。
gzip_types: 压缩数据类型,可以根据自己的服务删减
gzip_disable: 为指定的客户端禁用gzip功能。可以设置成IE6或者更低版本以使我们的方案能够广泛兼容。
更多Gzip设置可以参考链接
4. 缓存静态文件
PC互联网时代,很多站长都会选择生成静态网页存放到服务器对应路径的方式来组织自己的网站,很多内容诸如html、js、css、图片文件,很长时间才会更新一次,那么考虑使用Nginx缓存或者CDN缓存是一个很好的方式,可以大幅度降低网络带宽的请求。
Nginx文件缓存,主要是针对/etc/nginx/sites-enabled文件夹下的host文件修改。
参考示例:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; }
以上示例,针对图片、css、js做365天的缓存,更多用法可以参考链接
5. TCP Fast Open
TCP Fast Open(简称:TFO)是TCP的一个扩展,TCP三次握手的第一步,发送方会向接收方发送一个SYN包,而TCP Fast Ope所做的事情就是在SYN包里增加TFO cookie,来验证之前连接过的客户端,从而达到在三次握手最终的ACK包收到之前就开始发送数据。
具体配置可参看https://www.keycdn.com/support/tcp-fast-open/
参考文章:
- http://blog.51cto.com/liuqunying/1420556
- http://nginx.org/en/docs/ngx_core_module.html
- http://nginx.org/en/docs/events.html
- http://nginx.org/en/docs/http/ngx_http_gzip_module.html
- https://blog.csdn.net/jessonlv/article/details/8016284
- https://www.oschina.net/translate/nginx-setup
- https://serversforhackers.com/c/nginx-caching
- https://www.keycdn.com/support/tcp-fast-open/