worker_rlimit_nofile仅设置nginx worker进程软限制,必须同步配置系统级硬限制(如limits.conf或systemd limitnofile),且其值不得超过用户硬限制,否则启动失败;验证需检查/proc//limits。

要通过 worker_rlimit_nofile 突破 Nginx 的文件句柄(file descriptor)上限,关键不是单纯调大这个值,而是让它与系统级限制、Nginx 工作进程模型协同生效。它本身不直接“突破”上限,而是为 Nginx worker 进程申请更高的打开文件数软限制(soft limit),前提是系统允许。
确认并调整系统级 limits
worker_rlimit_nofile 的值不能超过系统对当前用户(通常是 nginx 或 www-data)设置的 soft limit。若系统限制为 1024,即使配置设为 65535,Nginx 启动时也会静默降级或报错(取决于版本)。
- 查看当前用户限制:
sudo -u nginx bash -c 'ulimit -Sn'(soft)和ulimit -Hn(hard) - 永久修改:在
/etc/security/limits.conf中添加
nginx soft nofile 65535
nginx hard nofile 65535 - 确保 PAM 加载 limits:检查
/etc/pam.d/common-session是否含session required pam_limits.so - 如果是 systemd 管理的 Nginx(如 Ubuntu 16.04+、CentOS 7+),还需在
/etc/systemd/system/nginx.service.d/override.conf中设置:
[Service]
LimitNOFILE=65535
然后运行sudo systemctl daemon-reload && sudo systemctl restart nginx
正确配置 worker_rlimit_nofile
该指令必须放在 main 块(即全局块,不在 http/server/location 内),且仅影响 worker 进程,不影响 master 进程。
- 示例配置(
/etc/nginx/nginx.conf):
worker_processes auto;
worker_rlimit_nofile 65535; - 注意:数值需为整数,不能带单位;建议设为 hard limit 的值或略低,避免启动失败
- 配置后必须重载或重启 Nginx:
sudo nginx -t && sudo nginx -s reload
验证是否生效
不能只看配置文件,要确认实际运行时 worker 进程的限制已提升。
- 查 worker 进程 PID:
ps -eo pid,comm,args | grep 'nginx: worker' - 查看该 PID 的 limits:
cat /proc/<pid>/limits | grep "Max open files"</pid>
输出应类似:
Max open files 65535 65535 files - 也可用
lsof -p <pid> | wc -l</pid>粗略观察当前打开句柄数,对比上限是否合理
配合其他参数防雪崩
单纯提高句柄上限,若连接处理不当,可能掩盖瓶颈或引发资源耗尽。
- 确保
worker_connections(在 events 块中)不超过worker_rlimit_nofile / worker_processes,否则会因无法分配 fd 而拒绝新连接 - 启用连接复用:
keepalive_timeout 65;+keepalive_requests 100;减少短连接频繁开闭 - 必要时调高
multi_accept on;,让单个 worker 尽量一次接受多个就绪连接










