必须同步配置系统内核、用户级和Nginx进程三层文件描述符限制:调大fs.file-max、设置nginx用户ulimit、在main上下文配worker_rlimit_nofile与worker_connections,并在systemd中显式声明LimitNOFILE。

要让 Nginx 在高并发下稳定运行且不因资源耗尽崩溃,必须同步配置系统级文件描述符(FD)和进程安全限制——这不只是改 nginx.conf 里的几个数字,而是从内核、用户权限到服务进程的三层协同。
系统内核层:调大全局文件句柄上限
Linux 内核对整个系统的打开文件总数有限制,由 fs.file-max 控制。若该值过低(如默认的 8192 或 65536),即使单个进程设再高也无意义。
- 查看当前值:
sysctl -n fs.file-max - 临时调整(重启失效):
sysctl -w fs.file-max=655360 - 永久生效:在
/etc/sysctl.conf中追加一行fs.file-max = 655360,然后执行sysctl -p
用户级限制:为 nginx 用户设置 ulimit
Nginx 主进程以某个用户(如 nginx 或 www-data)身份启动,该用户能打开的 FD 数受 limits.conf 约束。不配这里,nginx.conf 里写的 worker_rlimit_nofile 就会被截断。
- 编辑
/etc/security/limits.conf,添加两行(注意用户名要与 nginx 启动用户一致):nginx soft nofile 65535nginx hard nofile 65535 - 确保 PAM 加载 limits 模块:检查
/etc/pam.d/system-auth或/etc/pam.d/common-session是否含session required pam_limits.so - 验证是否生效:用
sudo -u nginx bash -c "ulimit -n"查看实际软限制
Nginx 进程层:worker_rlimit_nofile + worker_connections 合理配比
这是打通整条链路的关键一环,必须写在 nginx.conf 的全局块(main context),不能放在 events 或 http 块内。
- 示例配置(与
user、worker_processes同级):user nginx;worker_processes auto;worker_rlimit_nofile 65535; -
worker_connections应留出余量(建议 ≤worker_rlimit_nofile × 0.7–0.9)
例如设worker_rlimit_nofile 65535,则events { worker_connections 50000; }更稳妥 - 若启用
open_file_cache,还能减少频繁 open/close,进一步缓解 FD 压力
systemd 服务层(若使用 systemd 启动)
现代 Linux 发行版多通过 systemd 管理 Nginx,此时 limits.conf 可能被绕过。需显式在 service 文件中声明:
- 编辑
/etc/systemd/system/nginx.service.d/override.conf(如不存在则新建):[Service]LimitNOFILE=65535LimitNPROC=65535 - 重载配置:
systemctl daemon-reload && systemctl restart nginx - 确认生效:
systemctl show nginx | grep LimitNOFILE


















