worker_rlimit_nofile需预留20%~30%余量,结合worker_connections与业务类型(短连×1.2、长连×1.4、多upstream×1.5)计算,并同步调大systemd或limits.conf限制,且worker_connections≤rlimit×0.85。

要让 worker_rlimit_nofile 真正起到防护作用,不能只填一个“够用”的数字,关键是在系统允许范围内,为日志、SSL、上游连接、临时文件等非客户端连接开销预留 20%~30% 的安全余量。否则高并发或日志轮转时容易突然触发 Too many open files。
先确认系统硬限制底线
这个值是上限天花板,worker_rlimit_nofile 绝对不能超过它:
- 查 nginx 用户当前硬限制:
sudo -u nginx bash -c "ulimit -Hn" - 若用 systemd:运行
systemctl show nginx | grep LimitNOFILE,确保它 ≥ 你打算设的值 - 若输出是 65536,那
worker_rlimit_nofile最多设到 65536;但建议留出 5%~10% 余量(如设 59000~62000),防其他进程或内核临时占用
按业务类型反推合理值
不要直接等于硬限制,要结合 worker_connections 和实际消耗模型来算:
- 短连接服务(如 API 网关):
worker_rlimit_nofile ≥ worker_connections × 1.2 - 长连接/HTTP/2/HTTPS:
≥ worker_connections × 1.4(SSL session cache、OCSP stapling 多占 fd) - 多租户或大量 upstream:
≥ worker_connections × 1.5(每个 upstream keepalive 连接也吃 fd) - 举例:若
worker_connections 40000,做 HTTPS 反代 → 建议设worker_rlimit_nofile 56000起步,再向上取整到 65536 或 98304(需匹配系统硬限)
配置位置与验证要点
必须写对地方,且重启后验证是否真正生效:
- 在
nginx.conf最外层(与user、worker_processes同级)添加:worker_rlimit_nofile 65536; - 绝不能放在
http、events或server块内,否则启动报错 - 重启后检查真实生效值:
cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files",确认 Soft 和 Hard Limit 都是你设的数 - 再用
lsof -p $(pgrep nginx | head -1) | wc -l观察实际使用量,持续压测看是否逼近 85%
配套必须做的三件事
单配 worker_rlimit_nofile 没用,缺一不可:
- 同步调大 systemd 的
LimitNOFILE(或/etc/security/limits.conf),否则 Nginx 启动时静默降级 -
worker_connections必须 ≤worker_rlimit_nofile × 0.85,避免连接建立阶段就抢光 fd - 启用
open_log_file_cache减少日志句柄反复打开关闭,尤其当 access_log 路径含变量时


















