正确设置 worker_rlimit_nofile 需先配置系统级用户硬限制(如 limits.conf 中设 hard nofile 65536),再在 nginx.conf main 块中设 worker_rlimit_nofile 65536,并确保 systemd 或 pam 正确加载限制,最后通过 /proc/pid/limits 验证生效。

要正确设置 worker_rlimit_nofile,关键不是单独调大这个值,而是让它与系统级限制、Nginx 用户权限、以及实际业务需求匹配。设得过大可能被内核拒绝,设得太小则无法支撑高并发连接。
确认系统当前的文件句柄限制
Linux 对每个进程和整个系统都有两层限制:soft limit(软限制)和 hard limit(硬限制)。worker_rlimit_nofile 只能设为不超过当前运行 Nginx 的用户 hard limit 的值。
- 查看当前用户限制:运行
ulimit -Sn(软限制)和ulimit -Hn(硬限制) - 检查系统全局限制:
cat /proc/sys/fs/file-max - 确认 Nginx 主进程运行用户(如
www-data或nginx),再查该用户的 limits 配置(/etc/security/limits.conf或/etc/security/limits.d/*.conf)
在 limits.conf 中为 Nginx 用户设置合理硬限制
直接修改 worker_rlimit_nofile 不生效,往往是因为用户本身没获得足够高的 hard limit。必须先配置系统级限制。
- 编辑
/etc/security/limits.conf,添加两行(以用户www-data为例):www-data soft nofile 65536www-data hard nofile 65536 - 确保
pam_limits.so已启用(通常/etc/pam.d/common-session中有session required pam_limits.so) - 重启登录会话或重新启动 systemd 服务(如
systemctl daemon-reload && systemctl restart nginx),让 limits 生效
在 nginx.conf 中设置 worker_rlimit_nofile
该指令必须放在 main 块(即全局作用域),不能写在 http 或 server 块里。
- 示例配置:
worker_rlimit_nofile 65536; - 数值建议略小于或等于用户 hard limit(比如 hard limit 是 65536,这里就设 65536;若 hard limit 是 100000,可设 90000 预留余量)
- 配合
worker_connections使用:单个 worker 进程最大连接数不能超过worker_rlimit_nofile值,因此events { worker_connections 65536; }才有意义
验证是否生效
设置后不能只看配置是否加载成功,要确认运行时实际生效的值。
- 重启 Nginx:
nginx -t && systemctl reload nginx - 查主进程 PID:
ps aux | grep nginx | grep master - 查看该进程当前 limits:
cat /proc/<pid>/limits | grep "Max open files"</pid>,输出应显示 soft/hard 均为你设定的值 - 也可用
lsof -p <pid> | wc -l</pid>粗略观察当前打开句柄数变化趋势
不复杂但容易忽略的是:Nginx 启动方式影响 limits 生效。用 systemd 启动时,还需检查 /etc/systemd/system/nginx.service 是否覆盖了 limits(可通过 LimitNOFILE=65536 显式设置,避免依赖 PAM)。











