net.core.somaxconn是内核监听队列长度,控制“已完成三次握手但未被accept取走”的连接上限,必须与nginx listen backlog对齐(如均设65535),否则高并发连接会被静默丢弃;还需同步调优tcp_max_syn_backlog、netdev_max_backlog、file-max、tcp_tw_reuse及ulimit等参数,并启用multi_accept和epoll。

net.core.somaxconn 是 Linux 内核中决定“已完成三次握手、但还没被 Nginx accept() 取走”的连接队列上限的关键参数。它不控制总连接数,而是守在 TCP 连接进入用户态前的最后一道门——这道门太窄,再强的 Nginx 也接不住连接,客户端只会超时、重传、报 502/503,日志里却找不到痕迹。
要让 Nginx 真正稳稳承载巨量反代连接(比如万级并发回源、高频率健康检查、短连接密集的 API 网关场景),必须把这道门打开,并打通上下游链路。
必须对齐 Nginx listen backlog 值
Nginx 的 listen 指令若不显式写 backlog=,默认只用 511。哪怕你把 somaxconn 设成 65535,实际生效的是 min(65535, 511) = 511。
所以务必在 server{} 块中明确配置:
-
listen 80 backlog=65535; -
listen 443 ssl backlog=65535;
改完 reload,并用ss -ltn | grep ':80'查看 Send-Q 列是否已更新为你设的值。
合理设置 somaxconn 数值
不是越大越好,需结合反代负载推算:
- 若
worker_processes auto(如 8 核)、worker_connections 65535,理论单端口最大待 accept 连接 ≈ 65535 ÷ 8 ≈ 8200 - 考虑瞬时毛刺和分布不均,建议设为
65535或131072 - 极高吞吐场景(如 CDN 边缘、统一网关)可设
262144或524288
临时生效:sudo sysctl -w net.core.somaxconn=65535
永久生效:在/etc/sysctl.conf中加一行net.core.somaxconn = 65535,再执行sudo sysctl -p
同步强化 TCP 全链路缓冲能力
只调 somaxconn 是单点优化,容易卡在更早环节:
-
net.ipv4.tcp_max_syn_backlog:控制半连接队列(SYN 队列),建议 ≥somaxconn,推荐设为131072 -
net.core.netdev_max_backlog:网卡软中断收包队列,防突发流量丢包,建议262144 -
fs.file-max和ulimit -n:确保系统与 Nginx 进程能打开足够文件描述符(每个连接至少占 1 个 fd),建议fs.file-max = 2097152,并在nginx.conf中配worker_rlimit_nofile 1048576 -
net.ipv4.tcp_tw_reuse = 1:允许复用 TIME-WAIT 套接字,加快反代发起的上游连接回收,尤其重要
配合 Nginx 自身优化提升取连接效率
- 开启
multi_accept on;:让单次事件循环尽可能多地accept()多个就绪连接,缓解队列积压 - 使用
epoll(现代 Linux 默认):确保高效监听大量 socket -
keepalive_timeout 60; keepalive_requests 10000;:平衡长连接复用与资源释放节奏,减少反复建连压力
不复杂但容易忽略











