Nginx 的 backlog 参数仅向内核传递期望值,实际全连接队列容量由 backlog 与 net.core.somaxconn 取小值决定;需显式配置 listen backlog、同步调大 somaxconn 和 tcp_max_syn_backlog,并放宽文件描述符限制。
Nginx 的 listen ... backlog 参数本身不直接“扩大”队列,它只是向内核传递一个期望值;真正起效的队列容量,由 backlog 和内核参数 net.core.somaxconn 二者取小值决定。想让 backlog 设置真正落地,必须让两者对齐,并同步加固上下游环节。
明确 backlog 控制的是哪一段队列
它只影响 TCP 三次握手完成后的“全连接队列”(accept queue),即已处于 ESTABLISHED 状态、等待 Nginx worker 调用 accept() 取走的连接。这个队列一旦满,新完成握手的连接会被内核静默丢弃——客户端表现为超时或 Connection refused,Nginx 日志里却查不到记录。
必须显式配置并匹配内核上限
Nginx 不会自动读取系统 somaxconn 值来覆盖默认行为。若未在 listen 指令中写明 backlog=,旧版本默认用 511,新版本虽可继承系统值,但存在截断风险(如系统设为 65535,Nginx 内部仍可能按旧逻辑处理)。稳妥做法是:
listen 80 backlog=65535;listen 443 ssl http2 backlog=65535;
同步调大内核 somaxconn 参数backlog 的值再大,也会被 net.core.somaxconn 截断。必须确保:
sudo sysctl -w net.core.somaxconn=65535 /etc/sysctl.conf 中添加 net.core.somaxconn = 65535
然后运行 sudo sysctl -p
验证是否真正生效
别只改不看,关键靠实测:
ss -lnt | grep ':80',观察第二列(Send-Q)是否等于你设置的 backlog 值(如 65535) nginx -T 2>/dev/null | grep "listen.*backlog",确认配置已被加载 netstat -s | grep -i "listenoverflows|listendrops",计数不再上涨才说明调优到位配套不能漏:半连接队列与资源支撑
全连接队列变大后,瓶颈可能前移到 SYN 半连接队列或后移到文件描述符限制:
net.ipv4.tcp_max_syn_backlog = 65535(建议 ≥ somaxconn) /etc/security/limits.conf 中加 * soft nofile 1048576 和 * hard nofile 1048576 worker_rlimit_nofile 1048576; ulimit -n 当前值 ≥ worker_connections × worker_processes 不复杂但容易忽略