单纯增大worker_connections无法突破单进程连接数限制,因受系统文件描述符(fd)硬限制约;须同步修改limits.conf、systemd配置、nginx.conf中worker_rlimit_nofile,并在events块中正确设置worker_connections与epoll等参数,再调优内核somaxconn和tcp_max_syn_backlog。

单纯改大 worker_connections 无法突破单进程连接数限制——它只是个配置标尺,真正卡住的,是系统对单个进程能打开多少文件描述符(fd)的硬性约束。每个 TCP 连接至少占 1 个 fd,Nginx worker 还要额外用 fd 处理日志、SSL 缓存、上游连接等。Linux 默认单进程最多 1024 个 fd,远不够用。
必须同步放宽系统级文件描述符限制
这是最基础、最关键的一步。不改这里,Nginx 启动时就会静默截断 worker_connections 值,甚至打不开 error.log。
- 编辑 /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",输出的 Max open files 值应 ≥ 你计划设的worker_connections
在 nginx.conf 中显式声明进程级句柄上限
系统允许了,Nginx 自己也得“主动申请”,否则仍按默认保守值运行,worker_connections 再高也形同虚设。
- 在 nginx.conf 的主块(即
events { }块外、http { }块前)添加:
worker_rlimit_nofile 65536;
- 该值必须 ≥
worker_connections,推荐设为相同值或略高(如 1.2 倍),为日志、临时文件等留余量 - 注意:若
worker_rlimit_nofile超过系统硬限制,Nginx 可能启动失败
正确设置 worker_connections 并匹配 events 模型
该指令只能放在 events { } 块内,位置错就无效;且需配套启用高效事件模型。
- 确保配置位于
events块中:
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
-
use epoll;是 Linux 必加项,避免回退到有 1024 硬限的 select/poll -
multi_accept on;让单次事件循环尽可能多 accept 新连接,缓解突发流量排队 -
worker_connections建议 ≤ 系统ulimit -n的 80%~90%,例如 ulimit 是 65536,则设 52428 或 58982 更稳妥
别忽略内核连接队列这道入口闸门
连接还没进 Nginx 就被内核丢掉,调再高的 worker_connections 也没意义。
- 调整已完成三次握手的连接等待队列:
sysctl -w net.core.somaxconn=65535 - 调整半连接(SYN_RCVD)队列:
sysctl -w net.ipv4.tcp_max_syn_backlog=65535 - 写入 /etc/sysctl.conf 永久生效,并执行
sysctl -p - 检查当前监听队列使用情况:
ss -lnt查看 Recv-Q 列是否长期接近上限


















