要让Nginx稳定支撑高并发,必须协同调优四层文件描述符限制:系统级(/proc/sys/fs/file-max)、用户级(limits.conf)、systemd级(LimitNOFILE)、Nginx级(worker_rlimit_nofile),缺一不可,否则仍受限于默认1024。

要让 Nginx 稳定支撑高并发连接,必须打通从内核到进程的整条文件描述符(FD)链路。只改 nginx.conf 或只跑一句 ulimit,基本没用——关键在四层协同生效。
查清当前各层实际限制值
别凭经验猜,逐层验证真实生效值:
- 系统全局上限:cat /proc/sys/fs/file-max(建议 ≥ 1048576)
- Nginx 运行用户软/硬限:sudo -u nginx bash -c "ulimit -Sn && ulimit -Hn"
- Nginx master 进程限制:cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files"
- Nginx worker 进程限制:ps --ppid $(cat /var/run/nginx.pid) -o %p | sed '1d' | xargs -I{} cat /proc/{}/limits | grep "Max open files"
同步调优四层限制(缺一不可)
每层都得配,顺序不重要,但漏一层就卡在默认 1024:
- 内核级:执行 sudo sysctl -w fs.file-max=1048576,再写入 /etc/sysctl.conf 持久化
-
用户级:编辑 /etc/security/limits.conf,添加(以 nginx 用户为例):
nginx soft nofile 65535
nginx hard nofile 65535 -
systemd 启动环境(主流方式):运行 sudo systemctl edit nginx,在 [Service] 下加:
LimitNOFILE=65535
然后重载并重启:sudo systemctl daemon-reload && sudo systemctl restart nginx -
Nginx 自身配置:在 /etc/nginx/nginx.conf 全局块(与 user、worker_processes 同级)添加:
worker_rlimit_nofile 65535;
并确保 events { worker_connections 4096; } ≤ 前者值
验证是否真正落地
重启 Nginx 后,再次检查任意一个 worker 进程的 limits:
cat /proc/$(ps --ppid $(cat /var/run/nginx.pid) -o %p | sed '1d' | head -n1)/limits | grep "Max open files"
应显示类似:Max open files 65535 65535 files;同时 error.log 不再出现 accept() failed (24: Too many open files)。
额外注意点
某些发行版(如新版 Ubuntu/CentOS)默认启用 systemd,/etc/security/limits.conf 对服务可能不生效,必须配合 LimitNOFILE;worker_rlimit_nofile 的值不能超过系统为该用户设置的 hard nofile,否则启动时会静默降级或报错。


















