worker_rlimit_nofile 必须置于 main 上下文,因其作用于 worker 进程启动前的系统资源限制设置,属全局系统级指令;写入 server 或 http 块会因作用域不匹配导致 nginx 启动报错“directive is not allowed here”。

worker_rlimit_nofile 是 Nginx 主进程级别的配置项,**不能在 server 块中设置**,必须放在 main 上下文(即 nginx.conf 的最外层、events 或 http 块之外)。
为什么不能写在 server 块里?
Nginx 的 worker_rlimit_nofile 作用对象是 worker 进程启动时的资源限制,由主进程在 fork worker 前统一设置。它属于系统级资源控制,和监听、路由、SSL 等 HTTP 服务逻辑无关,因此只允许在全局(main)作用域生效。若误写在 server 或 http 块内,Nginx 启动会报错:
正确设置位置和步骤
- 打开
/etc/nginx/nginx.conf(或你的主配置文件) - 在
events块之前、文件最顶部(main 上下文)添加:
worker_rlimit_nofile 65535;
- 确保系统层面已提升对应用户的文件句柄限制(通常是
nginx或www-data用户) - 重启 Nginx:
sudo nginx -t && sudo systemctl reload nginx
配套必须做的系统级调整
仅改 Nginx 配置无效。worker 进程继承启动用户的 ulimit,需同步调整:
- 编辑
/etc/security/limits.conf,追加:
nginx soft nofile 65535<br>nginx hard nofile 65535
- 若使用 systemd(主流发行版默认),还需覆盖 service 单元限制:
sudo mkdir -p /etc/systemd/system/nginx.service.d<br>echo "[Service]<br>LimitNOFILE=65535" | sudo tee /etc/systemd/system/nginx.service.d/override.conf<br>sudo systemctl daemon-reload
- 验证是否生效:启动后执行
cat /proc/$(pgrep nginx)/limits | grep "Max open files",应显示65535
常见误区提醒
-
worker_connections(在events块里)控制单个 worker 能处理多少并发连接,但它不能超过worker_rlimit_nofile设置的上限 - 系统总限制(
/proc/sys/fs/file-max)也需足够高,建议设为2097152(2M)或更高 - 修改 limits 后,必须重启 nginx 进程本身(不是 reload),否则新 ulimit 不会加载











