worker_rlimit_nofile必须与系统级nofile限制、worker_connections及内核参数协同配置;单独调大将触发“Operation not permitted”错误导致worker退出,需先调高limits.conf和systemd的LimitNOFILE,再设为≥worker_connections的值(如65535),并重启生效。

worker_rlimit_nofile 不是孤立参数,它必须和系统级文件描述符限制、Nginx 进程模型、以及内核资源管理协同生效。单独调大这个值却忽略底层限制,反而会触发 setrlimit(RLIMIT_NOFILE) failed (1: Operation not permitted) 错误,导致 worker 进程异常退出。
先确认并提升系统级 nofile 限制
Linux 对每个进程的文件描述符数量有软硬两级限制,默认往往只有 1024(软)/4096(硬),远不够高并发场景。必须先调整:
- 编辑 /etc/security/limits.conf,为 Nginx 运行用户(如 www-data、nginx 或 root)添加两行:
nginx soft nofile 65535nginx hard nofile 65535 - 若使用 systemd 管理 Nginx(常见于 CentOS 7+/Ubuntu 16.04+),还需在 /etc/systemd/system/nginx.service 中补充:
[Service]LimitNOFILE=65535 - 重启用户会话或 reboot 才能使 limits.conf 生效;systemd 需执行
systemctl daemon-reload && systemctl restart nginx - 验证:用
sudo -u nginx bash -c "ulimit -n"检查软限制是否已更新
再设置 worker_rlimit_nofile 并匹配 worker_connections
该指令必须放在 nginx.conf 的全局块(main context),位于 events 块之前,不能写在 http 或 server 内:
- 典型配置示例:
worker_processes auto;worker_rlimit_nofile 65535;events {use epoll;worker_connections 65535;multi_accept on;} - worker_rlimit_nofile 应 ≥ worker_connections,建议设为相等或略大(如 65535),避免单个 worker 因打开 socket + 日志文件 + 静态资源等耗尽句柄
- 注意:如果
worker_processes设为 4,总连接能力理论为 4 × 65535,但实际受系统fs.file-max总量约束,可用sysctl fs.file-max查看,必要时通过sysctl -w fs.file-max=2097152临时提升
验证是否真正生效
配置 reload 后不能只看 nginx -t,要实测进程级限制是否落地:
- 找到任一 worker 进程 PID:
ps -eo pid,comm | grep 'nginx: worker' - 查看其当前 limits:
cat /proc//limits | grep "Max open files" - 输出应类似:
Max open files 65535 65535 files
若仍是 1024,则说明系统限制未突破,或 Nginx 未以目标用户身份启动 - 同时检查 error.log 是否仍有
open() "/path" failed (24: Too many open files)或accept() failed (24: Too many open files)
关联优化项不可遗漏
突破连接瓶颈不是单点调优,需同步关注:
- keepalive_timeout:设为 60–75 秒,配合 upstream keepalive,复用连接,降低新建 socket 压力
- tcp_nodelay & tcp_nopush:在 http 或 server 块中启用,减少小包延迟和发送次数
-
日志缓冲与异步写入:access_log 使用
buffer=64k flush=5s,避免高频 write() 占用句柄和 I/O - 避免 root 运行:测试时改 user root 可绕过限制,但生产严禁——应通过 proper limits + proper user 解决,否则引入权限与安全风险











