调优 worker_connections 需同步对齐系统文件描述符限制、nginx 进程级上限(worker_rlimit_nofile)和业务连接特征;否则将触发“too many open files”或静默丢连。

调优 worker_connections 不是简单改个数字,它必须和系统文件描述符限制、Nginx 进程级上限、业务连接特征三者严丝合缝对齐,否则设再高也会报 “Too many open files” 或静默丢连接。
打通系统级文件描述符限制
每个 TCP 连接至少占用 1 个文件描述符(fd),而 Linux 默认单进程最多打开 1024 个 fd。若 worker_connections 设为 16384,但系统不放行,Nginx 实际只能用 1024。
- 编辑
/etc/security/limits.conf,为 Nginx 运行用户(如nginx或www-data)添加:
nginx hard nofile 65536
- 若使用 systemd 管理,还需在
/etc/systemd/system/nginx.service.d/override.conf中补充:
LimitNOFILE=65536
- 执行
systemctl daemon-reload && systemctl restart nginx - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确认 soft/hard 值 ≥ 所设worker_connections
配置 Nginx 进程级句柄上限
系统开了口子,Nginx 必须主动“伸手要”。仅靠 ulimit 不够,它需显式声明能申请的 fd 总上限,否则会静默降级。
- 在
nginx.conf的 main 块(events块外、http块前)添加:
- 该值应 ≥
worker_connections,建议设为相同值或略高(如 1.2 倍),为日志、上游连接、SSL 缓存等留余量 - 注意:这是主进程可向系统申请的 fd 总上限,不是 per-worker
按业务连接行为设合理值
盲目堆高会浪费内存、加剧上下文切换;设低则卡在入口。关键看连接生命周期:
-
高频短连接(如秒杀页、REST API):建连快、断连快,复用率低 → 推荐
worker_connections 8192–16384,并配keepalive_timeout 0彻底禁用长连 -
长连接保活型(如 WebSocket、HTTP/2 上报、直播流):单连接持续时间长 → 推荐
2048–8192,同时设keepalive_timeout 15–30控制空闲时长 -
HTTPS 反向代理:除 socket 外还需 SSL session cache、OCSP stapling、证书读取等额外 fd →
worker_connections建议不超过系统 ulimit 的 70%~80%
同步优化 events 关键参数
只改 worker_connections 就像拓宽车道却不修匝道——车根本上不来。
-
use epoll;:Linux 下必须显式声明,避免回退到有硬限的select/poll -
multi_accept on;:让一个 worker 在一次事件循环中尽可能多 accept 新连接,缓解突发流量排队 -
accept_mutex on;:默认开启,防止惊群效应,高频短连下不建议盲目关闭 - 若监听端口启用了
listen ... backlog=xxx,需同步调大内核net.core.somaxconn至相同量级(如 4096+)











