调优 worker_connections 需协同系统资源、Nginx 机制与业务连接行为:先提升文件描述符限制(limits.conf + systemd override),再配置 worker_rlimit_nofile 和 events 块中的 worker_connections,按短连、长连、HTTPS 场景差异化设值,并同步优化 use、multi_accept、accept_mutex 等 events 参数。

调优 worker_connections 不是改一个数字就完事,它必须和系统资源、Nginx 运行机制、业务连接行为三者咬合才能真正起效。设得太高会浪费内存、加剧上下文切换;设得太低又卡在连接入口,出现“too many open files”或连接静默拒绝。
先打通文件描述符这条“供水管”
每个 TCP 连接至少占 1 个文件描述符(fd),而 Linux 默认单进程最多打开 1024 个 fd。如果 worker_connections 设为 8192,但系统不放行,Nginx 实际只能用 1024。
- 永久放开用户级限制:编辑
/etc/security/limits.conf,添加两行(把nginx替换为实际运行用户,如www-data):nginx soft nofile 65536nginx hard nofile 65536 - 若用 systemd 管理,还需在
/etc/systemd/system/nginx.service.d/override.conf中加:[Service]LimitNOFILE=65536
然后执行systemctl daemon-reload && systemctl restart nginx - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",输出的Max open files值应 ≥ 你设定的worker_connections
让 Nginx 主动“申请”足够句柄
系统允许了,Nginx 自己也得声明能用多少。否则它仍按默认保守值运行,worker_connections 再高也白搭。
- 在
nginx.conf的主块(events外、http前)添加:worker_rlimit_nofile 65536; - 该值应 ≥
worker_connections × worker_processes,建议设为相同值或略高(如 1.2 倍),为日志、上游连接等留余量 - 确保
worker_connections本身写在events { }块内,例如:events {worker_connections 8192;}
按业务类型设合理值,不是越大越好
短连、长连、HTTPS 对 fd 消耗差异很大,盲目堆高反而拖慢性能。
-
高频短连接场景(如 H5 秒杀页、REST API):连接建立快、关闭快,可设
4096–16384,重点保障吞吐速率 -
长连接保活型(如 WebSocket、HTTP/2 上报、直播流):单连接复用时间长,fd 占用稳定但总量大,建议
2048–8192,并配keepalive_timeout 15–30控制空闲时长 -
HTTPS 反向代理:除 socket 外还需 SSL session cache、OCSP stapling、证书文件等额外 fd,
worker_connections不宜超过单进程 ulimit 的 80%
配套 events 参数必须同步调优
只改 worker_connections,就像给高速路拓宽了车道却没修出口匝道——车还是堵着。
-
use epoll;:Linux 下必须显式指定,避免回退到有 1024 硬限的select/poll -
multi_accept on;:让一个 worker 在一次事件循环中尽可能多地 accept 新连接,缓解突发流量排队 -
accept_mutex on;(默认开启):防止多个 worker 同时争抢新连接造成“惊群”,与multi_accept协同工作更稳 - 若用
reuseport(需内核 3.9+),可考虑关掉accept_mutex,进一步降低锁开销
不复杂但容易忽略:调完别只看 nginx -s reload 成功,要用 ss -s 和 stub_status 看真实连接状态是否健康。


















