multi_accept on 的核心是让 Nginx 在 epoll 事件就绪后批量 accept 内核 listen 队列中所有已完成三次握手的连接,压低建连延迟、减少系统调用;必须满足 use epoll、足够大的 somaxconn 与 backlog、匹配的 worker_connections 三条件。

Linux 下配置 multi_accept 实现批量接受新连接,核心不是简单打开开关,而是让 Nginx 在 epoll 事件就绪后,一次性把内核 listen 队列里所有已完成三次握手的连接都取走。它不增加最大连接数,但能显著压低建连延迟、减少系统调用次数,尤其适合秒杀、健康检查、爬虫探测等短连接突发场景。
必须满足的三个底层条件
缺一不可,否则 multi_accept on 形同虚设:
-
显式启用 epoll:在
events块中写use epoll;。不能依赖自动探测,select或poll完全不支持该指令。 -
内核 listen 队列要足够深:执行
sysctl -w net.core.somaxconn=65535(并写入/etc/sysctl.conf持久化),同时在 Nginx 的listen指令中显式加backlog=65535,例如:listen 80 backlog=65535;。否则连接还没被 accept 就被内核丢弃。 -
worker_connections 与系统资源匹配:设为
16384或更高;同时确保ulimit -n(或 systemd 的LimitNOFILE)不低于该值,否则会频繁报accept() failed (24: Too many open files)。
标准 events 块配置写法
推荐如下写法(适用于 Linux + Nginx ≥ 1.9.1):
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
events {
use epoll;
multi_accept on;
worker_connections 16384;
accept_mutex off;
}
说明:
-
accept_mutex off是安全且推荐的——前提是已启用reuseport(见下条)。它让每个 worker 独立消费自己的连接队列,避免锁竞争。 - 若未启用
reuseport,则保持accept_mutex on(默认)更稳妥,此时multi_accept on让“胜出”的那个 worker 一次清空当前所有就绪连接。
配套关键协同配置
单独开 multi_accept 收益有限,需同步调整:
-
启用 reuseport:在
listen行后加reuseport,例如:listen 80 reuseport backlog=65535;。要求 Nginx ≥ 1.9.1、Linux 内核 ≥ 3.9。它让内核直接按哈希分发新连接到各 worker,天然负载均衡。 -
调高半连接队列:设置
net.ipv4.tcp_max_syn_backlog=65535,防止 SYN Flood 或建连洪峰时连接被丢弃。 -
CPU 绑定优化:加上
worker_cpu_affinity auto;,减少跨核调度开销,提升缓存局部性。 -
控制长连接生命周期:合理设置
keepalive_timeout 30;和keepalive_requests 100;,避免长连接长期占用工号,让multi_accept更聚焦于真正需要快速捞取的突发连接。
验证是否真正生效
改完配置后,不能只靠 nginx -t && nginx -s reload:
- 用
strace -p $(pgrep nginx -f | head -1) -e trace=accept4 -f 2>&1 | grep accept4抓系统调用,在压测瞬间观察是否连续返回多个 fd(如=3、=4、=5…),而非每次只出一个。 - 检查
netstat -s | grep -i "listen overflows",开启后该计数应不再增长,说明内核没再丢连接。 - 运行
ss -lnt | grep :80,观察Recv-Q列是否长期接近 0,代表连接被快速清空。

















