Nginx性能优化

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_connlimit_conn_zonelimit_ratelimit_reqlimit_req_zonemax_connns等。

9. 启用缓存和压缩。常见的缓存包括proxy_cachefastcgi_cache,两种都能极大的提供程序性能,建议研究使用。Nginx内置的gzip建议设置为no,能减少传输的流量,提供响应速度。

参考

1. Tuning NGINX for Performance

2. https://www.cnblogs.com/fczjuever/archive/2013/04/17/3026694.html

3. 使用Nginx缓存加速WordPress站点

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注