worker_rlimit_nofile需在main上下文配置并同步放宽系统级限制才生效:设为用户硬限制的90%,配events中worker_connections为其70%~80%,调优内核参数后验证进程limits。

要让 worker_rlimit_nofile 真正生效,不能只改 Nginx 配置文件——它是一条“资源申请指令”,必须和系统级限制打通,否则静默失效,高并发时仍会报 Too many open files。
必须放在 main 上下文,且值要合理
这个指令只在 nginx.conf 最外层(即 events 块之前、http 块之外)有效:
- 正确写法:
worker_rlimit_nofile 65535; - 错误写法:写进
http、server或location块里,Nginx 启动会报unknown directive - 数值不能超过 nginx 运行用户的系统硬限制(用
sudo -u nginx bash -c 'ulimit -Hn'查),建议设为硬限制的 90% 左右,例如硬限是 72000,可设 65535 - 该值不是连接数上限,而是每个 worker 进程能打开的总文件描述符上限(含 socket、日志、缓存文件、上游连接等)
同步放宽系统级限制(三选一,推荐 systemd)
Nginx 启动时继承父进程的 ulimit,不打通系统层,配置等于没写。根据你的部署方式选一种:
-
systemd 用户(主流):创建
/etc/systemd/system/nginx.service.d/override.conf,写入:
[Service]<br>LimitNOFILE=65535
然后执行:systemctl daemon-reload && systemctl restart nginx -
传统启动或补充方式:编辑
/etc/security/limits.conf,添加两行(用户名按实际替换,如www-data或nginx):
nginx soft nofile 65535<br>nginx hard nofile 65535
并确认/etc/pam.d/common-session包含:session required pam_limits.so
配套调优 events 和内核参数
worker_rlimit_nofile 是资源池,真正干活的是 worker_connections 和内核支撑能力:
- 在
events块中设置连接数,建议为worker_rlimit_nofile的 70%~80%,例如:
events {<br> worker_connections 50000;<br> use epoll;<br> multi_accept on;<br>} - 反向代理场景下,每个客户端连接 + 每个 upstream 连接各占一个 fd,消耗翻倍,需更保守预留
- 追加关键内核参数到
/etc/sysctl.conf并运行sysctl -p:
fs.file-max = 2097152<br>net.core.somaxconn = 65535<br>net.ipv4.tcp_max_syn_backlog = 65535
验证是否真正落地
重启后别只看配置,要查进程实际限制:
- 取一个 worker 进程 PID:
pgrep -f "nginx: worker" | head -n1 - 查看其 limits:
cat /proc/PID/limits | grep "Max open files" - 输出中 Soft Limit 应等于你设置的值,Hard Limit 应 ≥ 该值
- 若不符,说明某一层未生效,需回溯检查用户、systemd、limits.conf 三处是否一致


















