要使 worker_rlimit_nofile 生效,必须同时满足系统级限制与 Nginx 配置:先通过 ulimit -Hn 确认 nginx 用户硬限制,再在 limits.conf 或 systemd override.conf 中设 LimitNOFILE,最后在 nginx.conf main 块设 worker_rlimit_nofie 且 ≤ 系统硬限的 90%,并确保 worker_connections ≤ worker_rlimit_nofile × 0.8。

要让 worker_rlimit_nofile 真正生效,不是只改 nginx.conf 就行——它必须和系统级限制对齐,否则会被静默截断或启动报错。核心是“申请值 ≤ 系统允许值”,两者缺一不可。
确认当前系统的硬限制
先查 nginx 用户能拿到的最高文件描述符数:
- 运行
sudo -u nginx bash -c "ulimit -Hn",看输出值(比如 65535) - 如果结果是 1024 或 4096,说明系统没放开,
worker_rlimit_nofile再大也没用 - 注意:这个值来自
/etc/security/limits.conf或 systemd 的LimitNOFILE,不是内核全局参数fs.file-max
同步放宽系统级限制
根据你的服务管理方式选一种配置:
- 用
limits.conf(传统 init 或非 systemd 环境):
在/etc/security/limits.conf加两行:
nginx soft nofile 65535
nginx hard nofile 65535 - 用 systemd(主流现代发行版):
创建/etc/systemd/system/nginx.service.d/override.conf,内容为:
[Service]
LimitNOFILE=65535
然后执行systemctl daemon-reload和systemctl restart nginx
在 nginx.conf 中正确设置 worker_rlimit_nofile
该指令必须放在 main 上下文(即最外层),和 user、worker_processes 同级,不能嵌套在 events 或 http 块里:
- 示例配置(放在
nginx.conf开头附近):
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 50000;
} - 数值建议:设为系统硬限制的 90% 左右(如 hard limit 是 65535,就设 65535;如果是 131072,可设 128000),留余量给日志、SSL 缓存、临时文件等
- 务必保证
worker_connections ≤ worker_rlimit_nofile × 0.8,避免连接耗尽句柄
验证是否真正生效
重启 Nginx 后,检查某个 worker 进程的实际限制:
- 获取 worker PID:
pgrep -f "nginx: worker" - 查看 limits:
cat /proc/PID/limits | grep "Max open files" - 正常输出应类似:
Max open files 65535 65535 files
表示 soft 和 hard limit 都已成功应用 - 再用
lsof -p PID | wc -l观察实际使用量,判断是否接近上限


















