worker_connections需与系统file-max、用户limits、nginx worker_rlimit_nofile三者对齐,取最小值生效;按短连接(8192–16384)、长连接(32768–65535)、https(≤ulimit×80%)差异化设定,并协同use epoll、multi_accept等events参数优化。

优化 worker_connections 不是调大一个数字,而是把它放进整个文件描述符(fd)资源链里统筹处理。它必须和系统限制、Nginx 进程声明、业务连接特征三者对齐,否则设再高也无效。
对齐三层文件描述符上限
真正起作用的是以下三者的最小值,缺一不可:
-
系统总上限:
/proc/sys/fs/file-max,建议设为worker_processes × worker_connections × 1.3~1.5,预留 TIME_WAIT、SSL 缓存、日志等开销 -
用户级限制:在
/etc/security/limits.conf中为 Nginx 运行用户(如nginx或www-data)添加:nginx soft nofile 65536nginx hard nofile 65536
然后重启会话或重载 systemd 配置 -
Nginx 进程级声明:在
nginx.conf主块(http外)添加:worker_rlimit_nofile 65536;
该值应 ≥worker_connections,推荐设为相同或略高(如 1.2 倍)
按业务连接类型设定合理值
不同连接模式对 fd 消耗差异很大,不能一刀切:
-
短连接密集型(如秒杀页刷新、API 上报):连接高频新建/关闭,fd 分配压力大。建议
worker_connections设为 8192~16384,并启用net.ipv4.tcp_tw_reuse = 1 -
长连接保活型(如 WebSocket、HTTP/2、MQTT):单连接复用时间长,fd 占用稳定但总量大。建议设 32768~65535,重点保障
worker_rlimit_nofile和file-max充足 -
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 同时争抢新连接导致“惊群” - 关闭未启用的日志写入,或启用
access_log buffer=64k flush=1s;,减少每个请求占用的 fd
验证是否真正落地
配置 reload 成功不等于生效,务必实测验证:
- 查运行中 worker 的实际限制:
cat /proc/$(pgrep nginx)/limits | grep "Max open files" - 压测时观察 fd 占用:
lsof -p $(pgrep nginx) | wc -lss -s查看 ESTAB/SYN-RECV 状态分布 - 监控实际使用率是否长期 >85%,若接近上限但吞吐未提升,说明存在其他瓶颈(如上游延迟、磁盘 I/O 或内核队列溢出)











