开启 multi_accept 可让 nginx 一次事件就绪后批量调用 accept() 取走 listen 队列中所有已完成三次握手的连接,降低系统调用次数,提升短连接突发场景处理能力;需配合 use epoll/kqueue、足够大的 worker_connections、调高 net.core.somaxconn 等内核参数,并建议关闭 accept_mutex 和启用 reuseport 以增强并发性能。

开启 multi_accept 能让 Nginx 在一次事件就绪后尽可能多地调用 accept(),把内核 listen 队列里所有已完成三次握手的连接一次性取走,减少循环等待和系统调用次数——这对秒杀、健康检查洪峰、爬虫探测等短连接突发场景特别有效。
必须满足的运行前提
这个指令不是“一开就灵”,它依赖底层机制才能生效:
- 明确指定
use epoll;(Linux)或use kqueue;(FreeBSD/macOS),不能靠自动探测;select和poll下multi_accept完全无效 -
worker_connections值要足够大,比如 4096 或 10240,否则即使想多 accept,也会因超出上限而失败并返回错误 - 内核参数需同步调高:
net.core.somaxconn至少设为 65535,确保 listen 队列不溢出;必要时也调大net.ipv4.tcp_max_syn_backlog
推荐的 events 块配置
以下写法兼顾稳定性与高并发响应能力(Linux 环境):
events {
use epoll;
multi_accept on;
worker_connections 8192;
accept_mutex off;
}
其中 accept_mutex off 配合 multi_accept on 更合适:多个 worker 可各自独立、无锁地消费连接队列,避免争抢 accept 权限造成的延迟。
验证是否真正起效
光改配置不够,得看实际行为:
- 重启后执行
nginx -t && nginx -s reload确保加载成功 - 在有真实连接压力时,用
strace -p $(pgrep nginx -f | head -1) -e trace=accept,accept4 -f 2>&1 | grep accept观察是否连续多次返回(非单次就停) - 对比开启前后,用
ab -n 10000 -c 2000 http://127.0.0.1:80/dev/null测连接建立延迟,下降明显说明生效 - 检查内核丢包:
netstat -s | grep -i "listen overflows",数值不再增长是关键指标
搭配 reuseport 进一步均衡分发
如果你用的是 Nginx 1.9.1+(2026 年基本都满足)且 Linux 内核 ≥3.9,建议在 listen 指令中加 reuseport:
server {
listen 80 reuseport;
...
}
它让内核在多个 worker 间直接分发新连接,比靠 Nginx 自己调度更公平、更少排队,和 multi_accept 是互补组合,不是替代关系。











