2026-09-20 14:42 1003 次浏览

Nginx调优别只改worker_connections:几个被忽略的实战参数

很多站长拿到Nginx配置就改worker_connections,结果高并发下依然502。本文从连接队列、文件描述符、缓冲区、超时与日志五个维度,讲清楚真正影响吞吐的配置项,并给出可直接套用的参数建议。

接手过不少站点,发现一个共性:一提到Nginx优化,很多人第一反应就是把worker_connections从1024改成65535,然后重启,觉得万事大吉。可流量一上来,502、504照样出现。问题往往不在这个数字本身,而在几个更底层、更容易被忽略的参数上。

连接数不是越大越好,队列才是瓶颈

worker_connections 决定单个worker能同时处理多少连接,但真正卡住请求的,常常是backlog。当并发连接超过worker处理速度,新连接会进入监听队列,队列满了内核直接丢弃,客户端看到的就是连接被拒。

建议把 listen 80 backlog=65535 显式写出来,同时确认系统层面的 net.core.somaxconn 也同步调大,否则Nginx写了也没用。这两个值要配套改,只改一个等于白改。

另外别忘了 worker_rlimit_nofile。每个连接占一个文件描述符,配置里设了10万连接,系统ulimit却只有1024,多出来的连接根本建立不起来。改完记得用 ulimit -n 验证,别只改配置文件。

缓冲区与超时:小参数决定大体验

请求头、请求体、响应体的缓冲区默认值偏保守。API类站点如果请求体经常超过1M,client_max_body_size 不改就会直接返回413。上传场景尤其容易踩这个坑。

超时参数也值得细看。keepalive_timeout 设太长,空闲连接占着worker不放;设太短,频繁重建连接又增加开销。一般65到75秒是折中值。而 client_body_timeoutsend_timeout 如果沿用默认60秒,遇到慢客户端会拖累整体吞吐,适当降到10到30秒更稳。

  • client_max_body_size:按业务上传上限的1.5倍设置
  • keepalive_timeout:65s左右,配合上游keepalive使用
  • send_timeout:慢客户端多的场景降到15s以内

日志和缓存:省下的IO都是性能

access_log 每条请求都写盘,高并发下磁盘IO会成为隐形瓶颈。如果不需要实时分析,可以开 buffer=32k flush=5s,让日志批量落盘。调试完的站点,甚至可以把access_log关掉,只留error_log。

静态资源方面,open_file_cache 能显著减少文件系统调用。对图片、CSS、JS多的站点,开启后QPS提升肉眼可见。配合 expiresgzip,前端加载速度也会跟着改善。

调优不是堆参数,而是找到当前业务的真实瓶颈。CPU没满、磁盘没满却上不去QPS,多半是连接队列或文件描述符卡住了。先把这两块理顺,再谈其他。如果站点跑在海外节点上,服务器本身的磁盘和网络质量同样关键,像香港大带宽服务器 IV 这类100M带宽的物理机,配合Nginx调优,静态资源分发会顺畅不少。