Nginx介绍
Nginx发音“engine x”,是俄罗斯程序员Igor Sysoev开发的web服务器软件,具有高性能、高并发、占用内存小等极具吸引力的特性。Nginx最初被用在俄罗斯大型网站 https://www.rambler.ru,后来作者以BSD协议开放源代码,从此Nginx在全球被广泛使用。据统计,世界上最繁忙的网站中,25.68%的站点都运行着Nginx。
Nginx现在已经商业化运营,开源版本由 nginx.org 社区维护,商业版本由 nginx.com 管理。商业版在开源版的基础上增加许多高级特性,并提供专业支持服务。此外Nginx还有一些知名衍生版本,例如淘宝出品的适用于大流量访问的 Tengine、结合Lua的高性能平台 OpenResty。
本文主要参考Nginx官方文档,介绍Nginx性能优化要点。
Nginx性能优化
Nginx最佳运行平台是Linux/Unix,因此我们先从Linux参数调优开始,然后再介绍Linux性能优化配置。
Linux参数调优
本节介绍一般负载站点下会普遍受益的Linux参数。
1. net.core.somaxconn:
定义每个端口最大的监听队列的长度。这是一个全局参数,默认值为128。对于一个经常处理新连接的web服务器来说,默认的 128 太小了,大多数环境这个值建议增加到 1024 或者更多;
注意:如果这个值大于512,那么需要修改Nginx监听时的 backlog
参数,例如:listen 80 backlog=4096;
2. net.core.netdev_max_backlog
:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目,一般默认值时1000,建议改成2000。
3. sys.fs.file-max
:系统层面的文件描述符限制,和内存有关系。繁忙站点建议调大,尤其做代理软件时,一个连接需要两个文件描述符;
4. nofile
:用户/进程级别能够打开的最大文件数,建议尽量调大,例如65535,否则可能出现“two many open files”的错误;
5. net.ipv4.ip_local_port_range
:可使用的本地端口范围,建议为1025-65000。
Nginx性能优化
本节给出对Nginx性能优化比较重要的常见参数,其他高级优化参数建议在专业人士指导下进行。
1. worker_prcesses
:Nginx工作进程数,建议改成auto,即每个cpu绑定一个工作进程;
2. worker_connections
:每个工作进程同时处理的最大连接数,默认值是512,建议改成一万以上;
3. keepalive_requests
:一个客户端持久连接所能发送的最大请求数默认值是100。对一些QPS比较高的场景,增大这个值是非常有必要的;
4. keepalive_timeout
:和使用场景有关系,过大或过小都可能增大系统负担,导致性能低下;
5. keepalive
:和上游服务器保持连接的连接数,没有默认值。在使用上游服务器的场景,建议设置一个不小的值。
注意:为了使用keepalive
,需要设置header以支持特性:
proxy_http_version 1.1;
proxy_set_header Connection "";
6. 日志参数:日志是非常消耗cpu和磁盘io的行为。优化日志可从两方面入手:1. 关闭没必要的日志,例如 .git/.svn 的访问直接拒绝并且不记录; 2. 启用日志缓存,设置 buffer和flush两个参数,例如:access_log /var/log/nginx/access.log main buffer=32k flush=30s;
,表示只有日志达到30k或者超过30s才写入到日志文件;
7. sendfile
:建议设置为on,能极大提高静态文件的发送效率;
8. 限制客户端消耗太多资源,功能主要由limit模块提供。主要的设置参数包括:limit_conn
、limit_conn_zone
、limit_rate
、limit_req
、limit_req_zone
、max_connns
等。
9. 启用缓存和压缩。常见的缓存包括proxy_cache
和fastcgi_cache
,两种都能极大的提供程序性能,建议研究使用。Nginx内置的gzip建议设置为no,能减少传输的流量,提供响应速度。
参考
1. Tuning NGINX for Performance
2. https://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html