Nginx单机高并发需协同优化worker_rlimit_nofile、系统限制、内核参数及events配置:先提升nginx用户nofile软硬限制至65536,再在main上下文设worker_rlimit_nofile 65536,events中worker_connections设为50000并配epoll,同步调优fs.file-max等内核参数,最后通过/proc/PID/limits验证生效。

要让 Nginx 在单机静态高并发场景下稳定运行,worker_rlimit_nofile 不能单独调,必须和系统级限制、内核参数、Nginx 自身连接模型协同优化。核心逻辑是:每个 TCP 连接、每个静态文件读取、每个 upstream socket 都占用一个文件描述符(fd),fd 不够就会直接报 502 Bad Gateway 或日志里反复出现 open() failed (24: Too many open files)。
确认并提升系统级文件描述符上限
这是前提,否则 Nginx 再怎么设都无效:
- 先查 Nginx 实际运行用户(如
nginx或www-data):ps -eo pid,comm,user | grep "nginx: master" - 再查该用户的软/硬限制:
sudo -u nginx bash -c 'ulimit -Sn; ulimit -Hn' - 若数值偏低(如 1024),需二选一配置(推荐 systemd 方式):
→ 编辑/etc/systemd/system/nginx.service.d/override.conf,写入:
[Service]
LimitNOFILE=65536
→ 执行systemctl daemon-reload && systemctl restart nginx
或
→ 编辑/etc/security/limits.conf,添加:
nginx soft nofile 65536
nginx hard nofile 65536
并确认/etc/pam.d/common-session含session required pam_limits.so
在 nginx.conf 中正确设置 worker_rlimit_nofile
这个指令只在 main 上下文生效,位置很关键:
- 打开
/etc/nginx/nginx.conf,在events块之前、http块之外的最外层添加:
worker_rlimit_nofile 65536; - 数值必须 ≤ 系统为 nginx 用户设置的 hard nofile(比如你刚设了 65536,这里就不能填 65537)
- 切勿写进
http、server或location块,否则启动报错unknown directive - 改完必须
systemctl restart nginx,reload不会重置 fd 限制
同步调优 events 模块与内核参数
worker_rlimit_nofile 是“上限”,真正跑起来靠的是 worker_connections 和内核支撑能力:
- 在
events块中设置合理连接数:
events {
use epoll;
worker_connections 50000;
multi_accept on;
}
注意:worker_connections应为worker_rlimit_nofile的 70%~80%,留出 fd 给日志、临时文件、上游连接等 - 调整关键内核参数(写入
/etc/sysctl.conf并执行sysctl -p):
fs.file-max = 2097152
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
验证是否真正生效
别只看配置文件,要进进程里看真实值:
- 获取一个 worker 进程 PID:
pgrep -f "nginx: worker" | head -1 - 查看其实际限制:
cat /proc/<pid>/limits | grep "Max open files"</pid>
输出中 Soft Limit 应等于你设的worker_rlimit_nofile值,Hard Limit 应 ≥ 该值 - 检查 Nginx error log,不应有
setrlimit(RLIMIT_NOFILE) failed或Too many open files报错

















