直接调大 worker_rlimit_nofile 需同步放宽系统级 nofile 限制,否则无效;须配置 systemd 或 limits.conf、正确设置 main 上下文参数、合理配比 worker_connections,并调优内核参数后验证生效。

直接调大 worker_rlimit_nofile 本身并不能提升上限——它只是让 Nginx 主进程在启动时主动申请更多文件描述符,真正起作用的是操作系统给该进程分配的权限。必须打通系统级限制,这个值才能落地生效。
必须同步配置系统级 nofile 限制
Linux 对每个进程的文件描述符数量有软硬两级限制,默认往往只有 1024/4096,远不够高并发使用。Nginx 启动时继承父进程(如 systemd 或 shell)的限制,不提前放宽,worker_rlimit_nofile 就是空谈:
- 若用 systemd(主流方式):新建
/etc/systemd/system/nginx.service.d/override.conf,写入:[Service]<br>LimitNOFILE=65535
然后执行systemctl daemon-reload && systemctl restart nginx - 若用传统方式或需补充保障:编辑
/etc/security/limits.conf,为运行 Nginx 的用户(如nginx或www-data)添加两行:nginx soft nofile 65535<br>nginx hard nofile 65535
并确认/etc/pam.d/common-session中有session required pam_limits.so
正确配置 worker_rlimit_nofile
该指令只在 nginx.conf 的最外层(main 上下文)有效,必须放在 events 块之前、http 块之外:
- 写法示例:
worker_processes auto;<br>worker_rlimit_nofile 65535;
- 数值不能超过系统为 Nginx 用户设置的 hard limit(可用
sudo -u nginx bash -c 'ulimit -Hn'查),建议设为 hard limit 的 90% 左右,留出余量 - 不能写在
http、server或location块内,否则启动报错unknown directive
配套调优 events 和内核参数
worker_rlimit_nofile 是资源池,worker_connections 才是实际处理连接的“业务上限”,二者要合理配比:
- 在
events块中设置:events {<br> worker_connections 52428;<br> use epoll;<br> multi_accept on;<br>}
推荐设为worker_rlimit_nofile的 70%~80%,预留 fd 给日志、上游连接、SSL 缓存等 - 反向代理场景下,每个客户端连接 + 每个 upstream 连接各占一个 fd,消耗翻倍,更需保守预留
- 追加关键内核参数到
/etc/sysctl.conf并执行sysctl -p:fs.file-max = 2097152<br>net.core.somaxconn = 65535<br>net.ipv4.tcp_max_syn_backlog = 65535
验证是否真正生效
重启后别只看配置文件,要查运行中 worker 进程的实际限制:
- 取一个 worker 进程 PID:
pgrep -f "nginx: worker" | head -1 - 查看其 limits:
cat /proc/PID/limits | grep "Max open files" - 输出应类似:
Max open files 65535 65535 files
Soft Limit 和 Hard Limit 都要达到预期;若仍是 1024,说明某一层限制没打通 - 同时检查 Nginx error log,不应出现
setrlimit(RLIMIT_NOFILE) failed类警告











