真实并发上限受worker_connections、系统文件描述符上限(ulimit -n)和内核监听队列深度(net.core.somaxconn)三者最小值约束,需同步调整四方面:查瓶颈、放宽系统fd限制、正确配置nginx events与worker_rlimit_nofile、调优内核网络队列。

要让 Nginx 的 worker_connections 真正生效、突破连接数瓶颈,不能只改这一个值。它只是“标尺”,不是“通行证”。实际连接数卡在系统底层几道关卡上,必须同步打通。
关键结论:真实并发上限 = worker_processes × worker_connections,但最终受三者最小值约束——
→ Nginx 配置的 worker_connections 值
→ 系统单进程文件描述符上限(ulimit -n)
→ 内核监听队列深度(net.core.somaxconn)
下面分四步实操,每步都不可跳过:
确认当前真实限制在哪卡住
别凭感觉调大。先查日志和运行态:
- 检查错误:
grep "Too many open files\|worker_connections are not enough" /var/log/nginx/error.log | tail -10 - 查进程实际 fd 上限:
cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files" - 查内核队列:
sysctl net.core.somaxconn - 查当前活跃连接总数:
ss -s | grep "TCP:"
如果 Max open files 显示是 1024 或 4096,说明系统级限制没放开,改 worker_connections 没用。
同步放宽系统级文件描述符限制
每个 TCP 连接至少占 1 个 fd,Nginx 还要开日志、上游连接、SSL 缓存等。默认 1024 远不够。
在 /etc/security/limits.conf 中为 Nginx 运行用户(如 nginx 或 www-data)添加:
nginx soft nofile 65536 nginx hard nofile 65536
若用 systemd 管理(绝大多数现代发行版),还需创建 /etc/systemd/system/nginx.service.d/override.conf:
[Service] LimitNOFILE=65536
执行:
systemctl daemon-reload && systemctl restart nginx
验证是否生效:再次运行 cat /proc/$(pgrep nginx)/limits | grep "Max open files",soft/hard 值应 ≥65536。
在 nginx.conf 中正确声明并配平资源
worker_connections 必须写在 events { } 块内,且需与两个关键参数对齐:
-
在
events块中设置:events { use epoll; # Linux 必加,避免回退到 select/poll worker_connections 8192; multi_accept on; # 一次事件循环尽量多 accept,缓解突发 } -
在
events外、http前的主上下文添加进程级申请:worker_rlimit_nofile 65536; # 必须 ≥ worker_processes × worker_connections
worker_processes建议设为auto(自动匹配 CPU 核心数)。若手动设为 4,worker_connections设 8192,则worker_rlimit_nofile至少要 32768;推荐留 20% 余量,设为 65536 更稳妥。
调整内核网络队列,防连接在入口就被丢弃
连接还没进 Nginx 就被内核 SYN 队列或 accept 队列溢出丢弃,再高的 worker_connections 也白搭。
在 /etc/sysctl.conf 中添加:
net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 32768 net.core.netdev_max_backlog = 25000
执行 sysctl -p 生效。
注意:somaxconn 应 ≥ worker_connections ÷ worker_processes,并留余量。例如 4 个 worker、每个 8192 连接,理论需 somaxconn ≥ 8192,设 65535 更安全。
不复杂但容易忽略。











