调大 worker_rlimit_nofile 需同步调整系统级限制,否则配置被忽略;须修改 limits.conf 和 systemd override.conf,设值不超硬限90%,并验证进程实际 limits 值。

调大 worker_rlimit_nofile 不是改一个数字就能生效的事,它必须和系统级限制对齐,否则 Nginx 启动时会静默截断或直接报错(比如 setrlimit(RLIMIT_NOFILE) failed (13: Permission denied))。核心是让每个 worker 进程真正拿到你想要的文件描述符额度。
确认当前限制并定位瓶颈
先别急着改配置,查清楚现在到底卡在哪一层:
- 运行
ulimit -n和ulimit -Hn,看 nginx 启动用户当前的软限和硬限 - 查运行中的 worker 进程实际限制:
cat /proc/$(pgrep nginx | head -n1)/limits | grep "Max open files" - 如果输出显示 soft/hard 都是 1024 或 65536,但你在 nginx.conf 里设了 131072,说明系统限制没跟上,配置被忽略了
同步调整系统级限制
nginx 启动时继承用户的 ulimit,所以必须提前给它“发够钥匙”:
- 编辑
/etc/security/limits.conf,为 nginx 用户(如www-data或nginx)添加两行:nginx soft nofile 131072nginx hard nofile 131072 - 若用 systemd(绝大多数现代发行版),还需在
/etc/systemd/system/nginx.service.d/override.conf中写:[Service]LimitNOFILE=131072 - 执行
systemctl daemon-reload && systemctl restart nginx,确保新 limits 加载生效
正确配置 worker_rlimit_nofile
这个指令只在 main 上下文(即 nginx.conf 最顶层)有效,不能放在 http 或 events 块里:
- 写法很简单:
worker_rlimit_nofile 131072; - 数值建议设为系统硬限制的 90% 左右(例如硬限是 131072,就设 118000),留点余量给日志、SSL 缓存、临时文件等
- 务必保证
worker_connections≤worker_rlimit_nofile,否则连接数超限时会拒绝新请求
验证是否真生效
重启后别信配置文件,要看运行时进程的实际值:
- 用
ps aux | grep nginx找到一个 worker 进程 PID(排除 master) - 执行
cat /proc/<pid>/limits | grep "Max open files"</pid> - 输出应类似:
Max open files 131072 131072 files—— 两个数字一致且等于你设的值,才算成功


















