backlog 参数是防止突发连接被内核丢弃的缓冲阀,仅控制已完成三次握手但未被 accept() 取走的连接队列长度,实际值为 min(配置值, net.core.somaxconn),需同步调优 tcp_max_syn_backlog、netdev_max_backlog 及文件描述符限制。

listen 指令中的 backlog 参数不是“提升并发数”的开关,而是防止突发连接被内核直接丢弃的关键缓冲阀。它只管一件事:已成功完成三次握手、但还没被 Nginx worker 调用 accept() 取走的连接,最多能排队多少个。设小了,洪峰一来就 Connection refused;设大了不调配套,照样无效。
必须对齐内核上限:net.core.somaxconn
backlog 实际生效值 = min(你写的 backlog 值, /proc/sys/net/core/somaxconn)。Linux 默认通常是 128 或 511,远不够用。
- 临时调整:
sudo sysctl -w net.core.somaxconn=65535 - 永久生效:在
/etc/sysctl.conf中添加net.core.somaxconn = 65535,再执行sysctl -p - 验证:
cat /proc/sys/net/core/somaxconn确认已生效
listen 中必须显式声明,不能依赖默认
Nginx 不会自动读取 somaxconn 值——除非你用的是 Kubernetes Ingress Controller(它会自动同步)。自建 Nginx 必须手动写:
listen 80 backlog=65535;listen 443 ssl backlog=65535;- 省略
backlog=就用默认值(通常是 511),等于白调内核 - 用
nginx -T | grep "listen.*backlog"检查配置是否真被加载
同步补全另外两个关键队列参数
backlog 只管“已完成连接”,还有两类连接要一起防丢:
-
SYN 半连接队列:由
net.ipv4.tcp_max_syn_backlog控制,建议同样设为65535,避免 SYN 包被静默丢弃 -
网卡收包队列:
net.core.netdev_max_backlog建议设为131072,防止网卡收包过快导致内核层丢包
配套资源限制必须跟上
队列再大,没文件描述符和内存支撑就是空转:
- 系统级 fd 上限:
fs.file-max = 2097152(写入/etc/sysctl.conf) - 用户级 fd 限制:在
/etc/security/limits.conf中加* soft nofile 1048576* hard nofile 1048576 - Nginx 内部限制:
worker_rlimit_nofile 1048576;和worker_connections 102400;(确保worker_connections × worker_processes ≤ ulimit -n)
压测时用 ss -lnt | grep :80 看 Recv-Q 值:持续接近你设的 backlog 数(比如 65535),说明队列正在承压但尚未溢出——这才是调优到位的信号。











