worker_rlimit_nofile是Nginx main上下文指令,用于提升单个worker进程文件描述符上限,但不得超过系统硬限制;须配合limits.conf、systemd LimitNOFILE及内核fs.file-max同步调优,并通过/proc/PID/limits验证生效。

worker_rlimit_nofile 是 Nginx 主配置块(即全局块,main 上下文)中的指令,用于**提升单个 worker 进程能打开的文件描述符(file descriptor, fd)上限**,但它**不能突破操作系统级的硬限制(hard limit)**,也不能绕过系统对用户或进程的 ulimit 限制。它的作用是让 Nginx 在启动时主动调用 setrlimit(RLIMIT_NOFILE, ...),尝试将当前 worker 进程的软限制(soft limit)提升到指定值——前提是该值不超过系统的硬限制,且 Nginx 主进程有权限(通常需 root 启动并保留 cap_sys_resource 能力,或以 root 用户运行)。
前提:确认并调整系统级限制
worker_rlimit_nofile 生效的前提是底层系统允许。否则 Nginx 启动会报错(如 setrlimit(RLIMIT_NOFILE, 65536) failed (13: Permission denied))。
- 查看当前用户限制:
ulimit -n(软限制),ulimit -Hn(硬限制) - 临时提升(仅当前会话):
ulimit -n 65536(需 ≤ 硬限制) - 永久生效(推荐方式):
- 编辑
/etc/security/limits.conf,添加(假设 Nginx 以www-data用户运行):www-data soft nofile 65536www-data hard nofile 65536 - 确保 PAM limits 模块已启用:检查
/etc/pam.d/common-session或对应服务配置中含session required pam_limits.so - 若使用 systemd(如 Ubuntu 16.04+/CentOS 7+),还需在
/etc/systemd/system/nginx.service.d/override.conf中设置:[Service]LimitNOFILE=65536
- 编辑
正确配置 worker_rlimit_nofile
该指令必须放在 main 块(即 nginx.conf 顶层),不能在 http、server 或 location 块中使用:
- 示例配置:
worker_rlimit_nofile 65536; - 数值建议:设为与系统硬限制一致(如 65536),或略低于它(如 65535),避免因四舍五入或内核预留导致失败
- 注意:该值影响每个 worker 进程,不是全局总和。若
worker_processes auto启用了 4 个 worker,则最多可同时打开4 × 65536个 fd(实际受限于系统总可用 fd 和内存)
验证是否生效
不能只看配置,必须验证运行时实际限制:
- 查 Nginx worker 进程的当前限制:
ps aux | grep nginx找出 worker 进程 PID(如1234),再执行:cat /proc/1234/limits | grep "Max open files"
输出应类似:Max open files 65536 65536 files - 检查 Nginx 错误日志:启动时若失败,会明确记录 setrlimit 失败原因
- 压力测试中观察是否出现
open() failed (24: Too many open files)—— 若仍有此错误,说明限制未真正提升或业务 fd 消耗远超预期
常见误区与补充说明
-
它不等于 max_connections:Nginx 的最大并发连接数还受
worker_connections指令控制,且实际受min(worker_rlimit_nofile, worker_connections)制约 - 不解决“too many open files”根本问题:只是放宽上限。若应用存在 fd 泄漏(如未关闭 upstream 连接、log 文件句柄未释放),增大限制只会延缓崩溃,而非修复
-
非 root 用户无法突破硬限制:即使配置了
worker_rlimit_nofile 100000,而系统硬限制为 65536,Nginx 仍只能设到 65536;若以普通用户启动,且其硬限制为 1024,则该指令无效 -
重启后才生效:修改后需
nginx -t && nginx -s reload或完全 restart(reload 时新 worker 继承新限制,旧 worker 不变)










