Nginx监听队列长度需同步调优listen backlog与net.core.somaxconn,二者取最小值生效,否则被截断;accept队列满时新连接被内核静默丢弃,导致超时或拒绝连接,须通过ss -lnt和netstat -s验证生效。

调整 Nginx 的监听队列长度,核心是协同优化两个层面:Nginx 配置中的 listen backlog 参数,以及 Linux 内核的 net.core.somaxconn 限制。二者必须匹配,否则 Nginx 实际生效的队列长度会被内核截断。
明确监听队列的作用
监听队列(accept queue)是内核维护的一个缓冲区,用于暂存已完成三次握手、但尚未被 Nginx worker 进程调用 accept() 取走的连接。当该队列满时,新到达的 SYN-ACK 包会被丢弃,客户端表现为连接超时或“拒绝连接”,netstat -s | grep "ListenOverflows" 会显示增长计数。
修改 Nginx listen 的 backlog 值
在 server 块或 http 块的 listen 指令中显式添加 backlog 参数:
- 例如:
listen 80 backlog=8192;或listen 443 ssl http2 backlog=8192; - 若配置了多个 server 监听同一端口(如都 listen 80),只需在任一 server(通常为 default_server)中设置一次即可生效
- 推荐值:4096 或 8192;极端高并发场景可设为 16384~32768,但不能超过
/proc/sys/net/core/somaxconn的值 - 修改后需重载配置:
nginx -s reload
同步调大内核 somaxconn 参数
Nginx 的 backlog 值不会自动突破内核限制。必须确保:
-
/proc/sys/net/core/somaxconn≥ Nginx 设置的 backlog 值 - 临时生效:
echo 32768 > /proc/sys/net/core/somaxconn - 永久生效:在
/etc/sysctl.conf中添加net.core.somaxconn = 32768,再执行sysctl -p
验证是否生效
确认配置已真正起效,避免“设了等于没设”:
- 查看当前监听套接字的队列长度:
ss -lnt | grep ':80'—— 第三列(Recv-Q)显示的是当前队列使用量,第二列(Send-Q)即为实际生效的 backlog 值 - 检查内核统计:
netstat -s | grep -i "listen\|overflow",关注ListenOverflows是否持续增长 - 压力测试时观察
ss -s | grep -i "tcp:"中的SYN_RECV数量是否明显下降


















