光调worker_connections不够,关键在TCP连接队列的backlog——它决定新连接暂存能力;需同步调大内核net.core.somaxconn与Nginx listen backlog,并强化半连接队列及SYN Cookies。

要让 Nginx 真正扛住突发连接浪涌,光调 worker_connections 不够,关键在 TCP 连接队列的“入口缓冲区”——也就是 backlog。它决定了新连接到达时能暂存多少个,等 Worker 进程来 accept。队列一满,新 SYN 就被丢弃,客户端直接看到连接超时或拒绝,压测时常见 ListenOverflows 或 netstat -s 中的 TCP: drop attempt!。
确认当前 backlog 是否成为瓶颈
别猜,先查:
- 运行
ss -lnt,看监听端口(如*:80)的Recv-Q列是否长期接近或等于你配置的 backlog 值 - 执行
netstat -s | grep -i "listen\|overflow",关注ListenOverflows和ListenDrops计数是否持续增长 - 检查内核日志:
dmesg | grep -i "somaxconn\|backlog",若出现 “TCP: request_sock_TCP: Possible SYN flooding” 提示,说明 SYN 队列或全连接队列已溢出
同步调大内核 somaxconn 与 Nginx listen backlog
二者必须匹配,否则 Nginx 实际生效值取两者最小值:
- 临时调整内核参数:
sysctl -w net.core.somaxconn=65535 - 永久生效:写入
/etc/sysctl.conf,添加一行net.core.somaxconn = 65535,再执行sysctl -p - Nginx 配置中显式设置(尤其非 Ingress 场景):
server {
listen 80 backlog=65535;
listen 443 ssl backlog=65535;
}
注意:Nginx Ingress Controller 会自动读取somaxconn值并写入生成的配置,无需手动加backlog;但自建 Nginx 或 OpenResty 必须手动配
配套强化内核 TCP 队列能力
仅调 backlog 不够,SYN 半连接队列也得跟上:
- 增大半连接队列上限:
sysctl -w net.ipv4.tcp_max_syn_backlog=65535 - 启用 SYN Cookies(防 SYN Flood):
sysctl -w net.ipv4.tcp_syncookies=1(生产环境建议开启) - 避免因网卡收包过快导致丢包:
sysctl -w net.core.netdev_max_backlog=5000(根据网卡吞吐量适当上调)
验证与持续观察
改完不是结束,而是开始:
- 重启 Nginx 或重载配置:
nginx -s reload - 压测时实时监控:
watch -n1 'ss -lnt | grep :80'看Recv-Q是否稳定在低位 - 定期检查:
netstat -s | awk '/ListenOverflows|ListenDrops/ {print}',确保数值不再上涨 - 结合
top观察 softirq(软中断)CPU 占比,若 >30%,说明网络协议栈处理不过来,需考虑 RSS、RPS 或网卡调优











