worker_rlimit_nofile需与系统limits、systemd配置、内核参数及Nginx events联动调优,设为131072时worker_connections建议90000,并通过/proc//limits验证生效。

要让 Nginx 在海量缓存文件 + 高并发请求下不报 “Too many open files”,worker_rlimit_nofile 不是单独调一个值就能解决的,它必须和系统级限制、内核参数、Nginx 自身连接配置形成闭环。关键不是“设多大”,而是“整条链路都打通且留有余量”。
明确 worker_rlimit_nofile 的定位和设置位置
这个指令控制的是每个 worker 进程能打开的最大文件描述符数量,不是全局也不是 master 进程的。它必须写在 nginx.conf 的最外层(main 上下文),也就是 events 块之前、http 块之外:
- 正确写法:
worker_rlimit_nofile 131072; - 错误写法:放在 http/server/location 里,会提示 “unknown directive”
- 默认值为 0,表示继承启动时系统的 soft limit,通常只有 1024,远远不够
同步打通三处系统级限制,否则配置静默失效
Nginx 启动后无法突破它启动那一刻拿到的系统限制。只改配置不调系统,等于没改。
-
/etc/security/limits.conf(适用于非 systemd 启动或补充):
添加两行(用户名按实际替换,如nginx或www-data):nginx soft nofile 131072nginx hard nofile 131072 -
PAM 模块启用(确保 limits 生效):
检查/etc/pam.d/common-session是否含:session required pam_limits.so -
systemd 服务覆盖(主流方式,推荐):
创建/etc/systemd/system/nginx.service.d/override.conf:[Service]LimitNOFILE=131072
然后执行:systemctl daemon-reload && systemctl restart nginx
关联调优 events 和内核参数,避免资源挤占
worker_rlimit_nofile 是“总池子”,但真正干活的是 worker_connections,还有日志、上游连接、SSL 缓存等都要分走一部分 fd。
-
worker_connections建议设为worker_rlimit_nofile × 0.7左右(例如 131072 →worker_connections 90000) - 确认
worker_processes合理(一般设为 CPU 核心数或auto),避免单个 worker 承载过高 - 内核层面扩大全局句柄容量:
编辑/etc/sysctl.conf,加入:fs.file-max = 2097152
执行sysctl -p生效(该值应 ≥ 所有进程 fd 上限之和)
验证是否真正落地,不能只看配置文件
重启后立刻查进程实际限制,这是唯一可信依据:
- 获取任一 worker 进程 PID:
pgrep -f "nginx: worker" | head -1 - 查看其真实限制:
cat /proc/<pid>/limits | grep "Max open files"</pid>
输出中 Soft Limit 应等于你设的值(如 131072),Hard Limit 应 ≥ 该值 - 同时检查 Nginx error log,不应出现
setrlimit(RLIMIT_NOFILE) failed类警告

















