Back to home

Nginx调优

Linux Configuration

Backlog 队列

  • net.core.somaxconn : 这是等待 NGINX accept 的链接。由于 NGINX 处理很快,所以不需要设置太大,但是默认值非常小。如果你有一个高流量网站,调整这个参数可能是个好主意。如果设置太低,你会在内核日志中看到错误,直到你调高到相应的一个数值,这个错误才会结束。 NGINX 配置中也有一个 backlog ,应该和内核数值设置一样。
  • net.core.netdev_max_backlog : 这是在数据交给CPU处理前,有多少包缓存在网卡中。需要大量带宽的网站需要增加这个值。根据你的网卡文档或者内核的错误日志找到建议的值。

文件句柄

文件句柄被用于操作诸如网络连接以及打开本地文件等系统资源。即便 HTTP keepalives 能够使用较少的连接数,NGINX 在作为代理时,每个请求使用两个文件句柄,接受请求和连接代理服务器。如下参数可以被调整:

  • sys.fs.file_max : 系统级别文件句柄的限制数
  • nofile : 用户层面的句柄限制 /etc/security/limits.conf

临时端口

  • net.ipv4.ip_local_port_range : 可用端口段。通常为1024 ~ 65000。
  • net.ipv4.tcp_fin_timeout 当端口多久没有被使用时可以被用于其他连接。默认是60s,保险起见可以设置为30s或者15s。

NGINX Configuration

凡事这里没有提及的,请使用默认配置。

Work Processes

  • worker_processes 默认为每个CPU创建一个工作进程。如果有较多的I/O操作时可以适当提高这个值。
  • worker_connections 每个工作进程最大可以同时处理的连接数。应该根据服务器情况和流量情况设置。

Keepalives

client keepalive

  • keepalive_requests: 多少个连接可以通过一个Keepalive连接,默认值是 100。这个可以用于测试负载。
  • keepalive_timeout: 当一个 Keepalive 闲置时,保持多久。

upsteam keepalive

为 upsteam 打开长连接使用如下指令:

proxy_http_version 1.1;
proxy_set_header Connection “”;

访问日志

每次请求,记录日志会消耗CPU和I/O。解决这种问题就是开启访问日志缓冲。 access_log 有一个 buffer=size 参数可以设置。flush=time 设置缓存输出时间周期。可以完全禁用访问日志。

Sendfile

Sendfile 是一个操作系统API调用。它提供了从一个句柄到另外一个句柄快速拷贝TCP数据的功能。NGINX 使用这个输出缓存和磁盘文件到一个socket连接,没有用户态切换,非常快以及使用较少的CPU。但是由于不进过用户态,所以没有处理链,你没法使用 NGINX 过滤器修改内容。比如 gzip 过滤器。默认是关闭的。

限制

  • limit_conn/limit_conn_zone: 这个指令指明 NGINX 允许多少连接。比如从同一 IP 过来的连接数。避免过多请求从同一客户端发来。
  • limit_rate: 限制每个连接的带宽总量。这能够阻止某个集中地客户端请求导致系统负载过高,确保其他连接质量。
  • limit_req/limit_req_zone: 请求频率限制。比如:保护登录页面。
  • max_conns: 最大同时连接数。
  • queue: 当超出最大连接数时,连接请求被放到这个队列中。

其他

缓存

对NGINX进程启用缓存能够极大提高响应速度。参见NGINX Admin Guide - Caching

压缩

压缩响应结果能够减少数据大小,降低带宽占用,但是会提高 CPU 工作量。但是对于已压缩的文件,比如 JPEG,没有必要打开这个功能。参见NGINX Admin Guide - Compression and Decompression

Origin: http://nginx.com/blog/tuning-nginx/