要让Nginx真正撑住海量并发,必须同步打通系统、用户、Nginx三层文件描述符限制:systemd优先级最高(如LimitNOFILE=1048576),其次nginx.conf中worker_rlimit_nofile,再配limits.conf;HTTPS下每个连接耗3–5个FD,worker_rlimit_nofile应按worker_connections×4设并留余量,最后验证proc/pid/limits是否生效。
要让 Nginx 真正撑住海量并发(比如数万甚至十万级连接),光改 worker_connections 不够,必须让“最大文件描述符限制”在系统、用户、Nginx 三层全部打通——任何一层卡住,都会触发 accept() failed (24: Too many open files) 错误。
别猜,直接查:
ulimit -n,看当前 shell 的 soft nofile 值(影响 Nginx 启动环境)cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",这是 Nginx worker 进程真正拿到的上限(最关键的判断依据)sysctl fs.file-max,确认系统总容量是否足够(建议 ≥ worker_processes × worker_connections × 1.5)优先级从高到低:systemd > nginx.conf > limits.conf
/etc/systemd/system/nginx.service.d/override.conf,加入:
[Service]
LimitNOFILE=1048576
然后执行 systemctl daemon-reload && systemctl restart nginx
nginx.conf 的全局块(main context)中添加:worker_rlimit_nofile 1048576;
注意:该值不能超过 systemd 或 limits.conf 中设置的 hard nofile,否则启动失败
/etc/security/limits.conf 中为 nginx 用户(或通配 *)设置:
* soft nofile 1048576
* hard nofile 1048576
如果用 root 启动再降权,root 的限制也得达标
HTTPS 场景下每个连接实际占用 3–5 个文件描述符,HTTP 约 1–2 个。不要只按 worker_connections 设:
worker_connections 65535,且启用 HTTPS,worker_rlimit_nofile 至少设为 262140(65535 × 4),推荐直接设 1048576 留足余量worker_processes auto; 和 worker_cpu_affinity auto; 是否启用,避免连接堆积在少数 worker 上fs.file-max = 2097152、net.core.somaxconn = 65535,写入 /etc/sysctl.conf 并 sysctl -p 生效重启后务必验证:
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",确保 soft/hard 均显示你设定的数值(如 1048576)ab 或 wrk 发起高并发压测,观察 error log 是否还有 Too many open files
ss -s 或 lsof -p $(cat /var/run/nginx.pid) | wc -l,对比活跃连接与 FD 使用量