要让单机 Nginx 稳定支撑百万级并发建连,net.core.somaxconn 必须与 tcp_max_syn_backlog、Nginx listen backlog=65535、file-max、netdev_max_backlog 等参数协同设为 65535 或更高,并同步放宽文件描述符及配套 TCP 参数,再通过 sysctl、nginx -T、ss 和 /proc/net/netstat 验证生效。

要让单机 Nginx 稳定支撑百万级并发建连,net.core.somaxconn 不能孤立调整——它只是连接接纳链路的第一道闸门,必须和内核 SYN 队列、Nginx listen backlog、文件描述符、网卡收包能力等协同对齐,否则调再大也白搭。
核心参数必须同步设为 65535 或更高
这是百万并发建连的基准线,低于此值会直接触发队列溢出丢包:
- net.core.somaxconn = 65535:控制已完成三次握手的连接队列(accept queue)上限;
- net.ipv4.tcp_max_syn_backlog = 65535:匹配 somaxconn,防止 SYN 包在握手完成前就被丢弃;
-
Nginx listen 指令显式声明 backlog=65535,例如:
listen 80 backlog=65535;,否则默认仅用 511; - net.core.netdev_max_backlog = 131072:避免网卡收包速率超过内核处理能力时丢包。
配套资源限制必须跟上
连接数上去了,系统资源不放开,连接会在 accept 前就失败:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- fs.file-max = 2097152:系统级最大文件描述符数;
-
/etc/security/limits.conf 中设置:
* soft nofile 1048576和* hard nofile 1048576; -
Nginx 配置中启用:
worker_rlimit_nofile 1048576;; -
worker_connections 至少设为 102400,配合
worker_processes auto;或明确设为 CPU 核数。
辅助优化减少连接建立与回收开销
降低 TIME-WAIT 占用、扩大端口池、加快短连接周转:
- net.ipv4.tcp_tw_reuse = 1:允许复用处于 TIME-WAIT 的 socket,加速客户端重连;
- net.ipv4.ip_local_port_range = "1024 65535":最大化可用临时端口,避免代理转发时端口耗尽;
- net.ipv4.tcp_fin_timeout = 30:缩短 FIN-WAIT-2 超时,加快连接释放;
- net.ipv4.tcp_slow_start_after_idle = 0:禁用空闲后慢启动,保持高吞吐路径。
验证是否真正生效
调完不验证等于没调,重点关注三个层面:
- 确认内核值:运行
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog; - 确认 Nginx 加载配置:执行
nginx -T | grep "listen.*backlog"; - 实时观察积压:用
ss -lnt | grep :80查看 Recv-Q 是否长期接近上限; - 压测中监控
/proc/net/netstat中的TcpExtListenOverflows和TcpExtListenDrops,非零即说明仍有丢连接。

















