必须同步配置系统级限制与nginx的worker_rlimit_nofile:1. 修改/etc/security/limits.conf和systemd override.conf提升nginx用户nofile硬软限制;2. 在nginx.conf主上下文设置worker_rlimit_nofile;3. worker_connections设为该值的70%~85%;4. 用/proc/pid/limits验证生效。

要让 Nginx 在高并发或大量静态文件读取场景下不因“Too many open files”报错而失败,必须显式配置 worker_rlimit_nofile,但它只是整条链路的最后一环——单独改它没用,必须和系统级限制对齐。
一、确认并提升系统级文件描述符限制
nginx.conf 里的 worker_rlimit_nofile 只是“申请”,操作系统才是“审批人”。先确保 nginx 用户有足够高的硬限制:
- 检查当前限制:
ulimit -Hn(看硬限制),ulimit -Sn(看软限制) - 编辑
/etc/security/limits.conf,追加两行:nginx soft nofile 131072nginx hard nofile 131072 - 若使用 systemd(绝大多数现代发行版),还需创建覆盖配置:
/etc/systemd/system/nginx.service.d/override.conf,内容为:[Service]LimitNOFILE=131072
然后执行systemctl daemon-reload
二、在 nginx.conf 正确位置设置 worker_rlimit_nofile
该指令必须放在 main 上下文(即全局顶层),不能在 events 或 http 块内:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 打开
/etc/nginx/nginx.conf - 在
user、worker_processes同级处添加:worker_rlimit_nofile 131072; - 确保它不在任何大括号块内,例如不能写在
events { ... }里
三、合理配比 worker_connections 和余量
worker_connections 是每个 worker 能处理的并发连接数,但它只是 fd 消耗的一部分。实际还要算上日志文件、SSL 会话缓存、upstream 连接、临时文件等:
- 建议
worker_connections设为worker_rlimit_nofile的 70%~85% - 例如:
worker_rlimit_nofile 131072→worker_connections 90000 - 同时启用
epoll和multi_accept on提升连接接收效率
四、验证是否真正生效
改完配置 reload 后,别只信配置文件,要看运行时真实值:
- 查一个 worker 进程的限制:
cat /proc/$(pgrep -f "nginx: worker" | head -1)/limits | grep "Max open files"
输出中 Soft Limit 和 Hard Limit 应均为你设的数值(如 131072) - 观察实际使用量:
lsof -p $(pgrep -f "nginx: worker" | head -1) | wc -l
压测时该值应稳定低于上限,且 error.log 不再出现open() failed (24: Too many open files)










