worker_connections需与系统文件描述符、nginx配置及业务模式协同优化:先调高系统ulimit和systemd限制,再设worker_rlimit_nofile,最后按短连/长连/https场景合理设定worker_connections值并配齐events参数。

worker_connections 不是填个大数字就能用的参数,它必须和系统资源、业务连接模式、Nginx 自身限制三者咬合才真正有效。设低了会卡在入口,出现连接拒绝或 “too many open files”;设高了反而浪费内存、加剧上下文切换,甚至让 Nginx 启动失败或静默降级。
先打通系统文件描述符这条“供水管”
每个 TCP 连接至少占 1 个文件描述符(fd),而 Linux 默认单进程最多打开 1024 个 fd。如果 worker_processes 是 4、worker_connections 设为 8192,那理论需要 32768 个 fd——但若系统不放行,实际就卡在 1024。
- 永久放开用户级限制:编辑 /etc/security/limits.conf,添加(把 nginx 替换为实际运行用户,如 www-data):
nginx soft nofile 65536
nginx 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",输出值应 ≥ 你设定的 worker_connections × worker_processes
让 Nginx 主动声明能用多少句柄
系统允许了,Nginx 自己也得“申请”足够额度,否则仍按默认保守值运行,worker_connections 再高也白搭。
- 在 nginx.conf 的主块(events 外、http 前)添加:
worker_rlimit_nofile 65536;
该值建议 ≥ worker_processes × worker_connections,并留出 10%~20% 余量(如乘积是 52428,可设为 65536) - 确保 worker_connections 明确写在 events { } 块内,例如:
events {
worker_connections 8192;
}
按业务类型设真实合理的值
短连、长连、HTTPS 对 fd 消耗差异很大,不能统一套用一个数。
-
短连接密集型(如 API 网关、CDN 回源):连接快建快关,fd 高频波动。
建议从 4096~8192 起步,压测后逐步调到 16384~32768;keepalive_timeout 可设 15–30s -
长连接保活型(如 WebSocket、HTTP/2 上报、直播流):单连接复用时间长,fd 占用稳定但总量大。
建议直接设 32768~65535,并重点保障 worker_rlimit_nofile 和系统 /proc/sys/fs/file-max 充足 -
HTTPS 反向代理:除 socket 外,还需 SSL session cache、OCSP stapling、证书文件等额外 fd 开销。
建议 worker_connections 不超过单进程 ulimit 的 70%~80%,例如 ulimit -n 是 65536,就设 ≤ 52428
配套 events 参数必须同步启用
只改 worker_connections 效果有限,关键协同参数缺一不可:
- use epoll;:Linux 下必须显式写,避免回退到 select/poll 的 1024 硬限制
- multi_accept on;:让一个 worker 在一次事件循环中尽可能多地 accept 新连接,缓解突发流量排队
- accept_mutex on;(默认开启):防止多个 worker 同时争抢新连接导致“惊群”,与 multi_accept 协同工作
- 若用多 worker + reuseport,可考虑 accept_mutex off;,但需配合内核 3.9+ 和 nginx 1.9.1+











