worker_rlimit_nofile需三层对齐:系统用户限制、systemd服务限制、Nginx配置本身,且必须置于main上下文;数值应合理配比,worker_connections需小于它并预留余量;改后须验证生效。

worker_rlimit_nofile 本身不“解决”文件句柄限制,而是让 Nginx worker 进程在启动时申请更高的软限制——但这个申请能否成功、是否真正生效,完全取决于系统层的配合。单独改它基本无效,必须三层对齐:系统用户限制、systemd 服务限制、Nginx 配置本身。
必须放在 main 上下文,不能写错位置
这个指令只允许出现在 nginx.conf 的最外层,也就是 events 块和 http 块之外、文件开头附近。常见错误是把它塞进 server 或 http 块里,结果 Nginx 启动直接报错:
nginx: [emerg] "worker_rlimit_nofile" directive is not allowed here
正确写法示例:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 52428;
use epoll;
}
系统级限制必须同步放宽
Nginx worker 进程启动时继承运行用户的 ulimit,若系统没放行,配置值会被静默截断。需按部署方式选一种方式调整:
- 用 systemd(主流):新建 /etc/systemd/system/nginx.service.d/override.conf,写入
[Service]
LimitNOFILE=65535
然后执行 sudo systemctl daemon-reload && sudo systemctl restart nginx - 不用 systemd:编辑 /etc/security/limits.conf,添加两行(用户名按实际替换,如 nginx 或 www-data):
nginx soft nofile 65535
nginx hard nofile 65535
并确认 /etc/pam.d/common-session 包含 session required pam_limits.so
数值要合理配比,不能盲目拉满
worker_rlimit_nofile 是资源池上限,worker_connections 才是实际处理连接的业务上限,二者必须留出余量:
- worker_rlimit_nofile 建议设为系统 hard nofile 的 90% 左右(例如 hard 是 65535,这里设 59000)
- worker_connections 推荐设为 worker_rlimit_nofile 的 70%~85%,预留 fd 给日志、上游连接、SSL 缓存、临时文件等
- 反向代理或下载场景消耗更高,可按 1.2~1.5 倍 worker_connections 估算所需句柄数
验证是否真正生效
改完必须验证,不能只信配置文件:
- 查运行中 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 $(pidof nginx) | wc -l 看当前打开句柄数是否接近设定上限



















