worker_rlimit_nofile必须与系统硬限制、worker_connections及业务场景三级配比:系统硬限制>worker_rlimit_nofile(建议硬限90%)>worker_connections(建议rlimit的70%~85%),且需同步配置systemd、limits.conf及nginx.conf主上下文,并通过/proc/pid/limits验证生效。

worker_rlimit_nofile 不是独立调大的数字,它必须和 worker_connections、系统限制、业务场景形成合理配比——设太高浪费资源,设太低直接卡在连接入口。
数值要按三层比例来定
核心逻辑是:系统硬限制 > worker_rlimit_nofile > worker_connections,且每层都要留余量。
- 先查系统为 Nginx 用户设置的硬限制:
sudo -u nginx bash -c "ulimit -Hn",假设结果是 65535 - worker_rlimit_nofile 建议设为该值的 90% 左右(如 59000),避免与内核或 PAM 边界冲突
- worker_connections 推荐设为 worker_rlimit_nofile 的 70%~85%(如 59000 → 设 40000~50000),预留 fd 给日志写入、上游连接、SSL 缓存、临时文件等
不同业务场景的典型参考值
不是所有服务都需要 6 万连接,盲目拉满反而增加内存开销和上下文切换压力。
- 短连接 API 或静态资源服务(如 H5 页面、CDN 回源):worker_rlimit_nofile 32768,worker_connections 16384~24576
- 长连接服务(如 WebSocket、HTTP/2 上报):worker_rlimit_nofile 65535,worker_connections 45000~55000
- HTTPS 反向代理(含 OCSP、session cache):worker_rlimit_nofile 131072,worker_connections 80000~90000(不超过 ulimit 的 70%)
必须同步检查的三个地方
只改 nginx.conf 里的 worker_rlimit_nofile 没用,它只是最后一环。
-
systemd 服务限制:确认
/etc/systemd/system/nginx.service.d/override.conf含LimitNOFILE=59000,并执行systemctl daemon-reload && systemctl restart nginx -
用户级 limits.conf:确保
/etc/security/limits.conf有对应行,如nginx hard nofile 65535 - 配置位置正确:worker_rlimit_nofile 必须放在 nginx.conf 最外层(events 块之前、http 块之外),不能嵌套在 server 或 http 里
验证是否真正生效
reload 不重设资源限制,必须 restart 后验证:
- 查运行中 worker 进程的实际软限制:
cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files",输出的 Soft Limit 应与你设的值一致 - 压测时观察 error.log 是否还有
open() failed (24: Too many open files) - 用
lsof -p $(pgrep nginx) | wc -l看当前 fd 占用,长期超过 85% 就该扩容或排查泄漏











