accept_mutex on 与 multi_accept off 协同实现平滑排队:前者通过互斥锁让 worker 轮流 accept,形成内核 listen 队列自然排队;后者避免单次抢连耗尽连接配额,配合调大 somaxconn 和合理超时限流,可显著降低 connection refused。

Nginx 的 server 块本身不直接控制连接排队,排队行为由全局 events 层和系统内核共同决定。真正影响高并发下“连接是否被拒绝或排队”的关键,是连接接纳策略与资源限制配置,而非 server 块内的常规指令(如 location、root 等)。要让 Nginx 在连接洪峰时更平滑地排队、减少 RST 或 connection refused,需从三个层面协同配置:
启用 accept_mutex 并合理设置队列长度
默认情况下,Nginx 启用 accept_mutex on,多个 worker 进程通过互斥锁轮流接受新连接,这会天然形成轻量级排队机制——连接不会被立即拒绝,而是在内核的 listen 队列中等待 worker 获取锁后处理。
但该队列深度受操作系统限制,需同步调大:
- 在
nginx.conf的events块中显式开启:accept_mutex on; - 调整 Linux 内核的全连接队列(
net.core.somaxconn): 执行sudo sysctl -w net.core.somaxconn=65535,并写入/etc/sysctl.conf - 确保应用层 listen 调用未覆盖该值(Nginx 默认使用系统值,无需额外指定
backlog)
关闭 multi_accept 避免“抢连”导致丢包
multi_accept on 允许单个 worker 在一次事件循环中接收多个就绪连接。在瞬时流量突增时,它可能快速耗尽 worker_connections 配额,使后续连接因无空闲 worker 而被内核丢弃(表现为 connection timeout 或 connection refused)。
更稳的做法是:
- 设为
multi_accept off;(默认值),让每个 worker 每次只收一个连接,配合accept_mutex实现更均匀的负载分发和自然排队 - 尤其适用于 CPU 密集型业务或连接建立频繁但处理较慢的场景
在 server 块中配合限流与超时控制排队质量
虽然排队发生在 accept 阶段,但 server 块可通过以下配置提升排队体验,避免无效连接长期占位:
-
keepalive_timeout 15;:缩短空闲长连接存活时间,及时释放连接槽位 -
keepalive_requests 1000;:限制单连接最大请求数,防止单个客户端长期霸占连接 - 搭配限流(需在
http或server块中定义):limit_conn addr 100;(按 IP 限并发连接数)limit_req zone=burst burst=200 nodelay;(应对突发请求,避免排队过长) - 设置合理的客户端超时:
client_header_timeout 5;client_body_timeout 10;
防止慢速攻击或异常客户端拖慢整个连接队列
验证与观察排队效果
真正判断排队是否生效,不能只看 Nginx 日志,而要看系统指标:
- 检查内核连接队列溢出:
ss -lnt | grep :80中Recv-Q值持续 > 0,且netstat -s | grep "listen overflows"计数不增长 → 排队正常;若 overflow 计数上升 → 队列太小或 worker 处理不过来 - 监控
nginx_stub_status中Accepts和Handled差值:差值稳定小幅波动,说明连接被有效接纳并排队处理 - 用
ab或wrk模拟高并发时,观察Failed requests是否显著降低


















