worker_rlimit_nofile是nginx主配置块指令,用于为每个worker进程设置文件描述符上限,须≤系统硬限制并配合limits.conf或systemd limitnofile生效,且应大于worker_connections(建议预留10%~30%余量)。

worker_rlimit_nofile 是 Nginx Master 进程用于向其 Worker 子进程传递文件描述符(file descriptor, fd)上限的一个配置指令。它本身不直接限制 Master 进程,而是通过 setrlimit() 系统调用,在每个 Worker 进程启动时,为其设置 RLIMIT_NOFILE 资源限制 —— 即该 Worker 能打开的最大文件数(含 socket、日志文件、临时文件等)。
作用范围与生效时机
该指令仅在 Nginx 主配置块(main context)中有效,且必须在 events 或 http 块之外设置。它不会动态生效,仅在 Nginx 启动或重载(nginx -s reload)时,由 Master 进程为每个新 fork 的 Worker 进程统一设定 fd 上限。
- 不影响 Master 进程自身的 fd 限制(Master 通常只做管理,不处理请求)
- Worker 进程继承该值后,不能再自行提升(受 Linux rlimit 机制保护)
- 若未设置,Worker 将继承 Master 启动时的 ulimit 值(通常受限于系统默认或 systemd 服务配置)
与系统级限制的协同关系
要使 worker_rlimit_nofile 生效,必须确保底层系统允许该值被设置。Nginx 无法突破内核或 init 系统施加的硬限制:
- 检查当前用户可设的硬限制:
ulimit -Hn - 若配置值(如
65535)超过硬限制,Nginx 启动时会记录警告:setrlimit(RLIMIT_NOFILE, 65535) failed (13: Permission denied) - 常见修复方式:
- 修改
/etc/security/limits.conf(对 nginx 用户添加nginx soft nofile 65535和nginx hard nofile 65535) - 若使用 systemd,需在
/etc/systemd/system/nginx.service.d/override.conf中设置:LimitNOFILE=65535,然后执行systemctl daemon-reload
- 修改
典型配置与验证方法
在 nginx.conf 最外层添加:
重启 Nginx 后,可通过以下方式验证是否生效:
- 查看某个 Worker 进程的实际限制:
cat /proc/$(pgrep -f "nginx: worker")/limits | grep "Max open files" - 确认输出中
Soft Limit和Hard Limit均为预期数值(如 65535) - 结合
lsof -p <pid> | wc -l</pid>观察实际使用量,判断是否接近上限
注意事项与常见误区
该指令不是“全局总上限”,而是每个 Worker 进程的独立上限。例如:4 个 Worker + worker_rlimit_nofile 65535,理论最大并发 fd 数可达约 26 万(未考虑系统保留和共享 fd)。
- 不要与
worker_connections混淆:后者是单个 Worker 能同时处理的连接数,受前者限制(通常需满足worker_connections ≤ worker_rlimit_nofile − 预留 fd(如 log、temp、master-socket)) - 高并发场景下建议预留至少 10% fd 给日志、缓存临时文件、upstream 连接等非客户端用途
- 容器环境(如 Docker)中,需在运行时通过
--ulimit nofile=65535:65535显式传递限制,否则容器默认限制(常为 1024)会覆盖 Nginx 配置










