Nginx 的 listen backlog 参数仅控制全连接队列长度,须与内核 net.core.somaxconn 对齐,否则取较小值;需同步调大 somaxconn、tcp_max_syn_backlog、netdev_max_backlog 及文件描述符限制,并用 ss 和 netstat 验证生效。

Nginx 的 listen 指令中 backlog 参数不是独立生效的,它必须和 Linux 内核的 net.core.somaxconn 对齐,否则实际队列长度只会取二者中的较小值。调优的关键不是单改某一处,而是让内核、Nginx 配置、系统资源三者协同。
明确 backlog 控制的是哪一段队列
它只影响 TCP 三次握手完成后的“全连接队列”(accept queue),即已处于 ESTABLISHED 状态、等待 Nginx worker 调用 accept() 取走的连接。这个队列满了,新完成握手的连接会被内核静默丢弃——客户端表现为超时或 Connection refused,而 Nginx 日志里查不到记录。
显式配置 Nginx listen backlog 并匹配内核上限
- 在
server块中写明:listen 80 backlog=65535; listen 443 ssl http2 backlog=65535;
- 若多个
server监听同一端口(如都listen 80),只需在一个(通常是default_server)中设置即可生效。 - 不写
backlog=时,旧版本默认用 511,新版本虽可能继承系统值,但存在截断风险,务必显式声明。
同步调大内核 somaxconn 参数
- 临时生效:
sudo sysctl -w net.core.somaxconn=65535
- 永久生效:在
/etc/sysctl.conf中添加net.core.somaxconn = 65535
然后执行
sudo sysctl -p。
配套强化 TCP 队列能力
- 扩大 SYN 半连接队列(防握手阶段丢包):
net.ipv4.tcp_max_syn_backlog = 65535
- 启用 SYN Cookies(防 SYN Flood):
net.ipv4.tcp_syncookies = 1
- 提升网卡收包缓冲(防底层丢包):
net.core.netdev_max_backlog = 5000
放宽系统资源限制
- 文件描述符上限(避免
too many open files):
在/etc/security/limits.conf中加:* soft nofile 1048576 * hard nofile 1048576
- Nginx 配置中同步设:
worker_rlimit_nofile 1048576; worker_connections 102400;
并确保
ulimit -n当前值 ≥worker_connections × worker_processes。
验证是否真正生效
- 查监听套接字实际队列长度:
ss -lnt | grep ':80'
第二列
Send-Q应等于你设置的backlog值(如65535)。 - 确认 Nginx 加载了配置:
nginx -T 2>/dev/null | grep "listen.*backlog"
- 压测时监控溢出计数:
netstat -s | grep -i "listenoverflows\|listendrops"
数值不再上涨,说明调优到位。


















