nginx tcp代理高并发需协同调优linux内核参数:增大连接队列(somaxconn、tcp_max_syn_backlog)、优化端口复用(tw_reuse、local_port_range)、放宽缓冲与资源限制(rmem/wmem、file-max),并匹配stream模块配置(backlog、reuseport)。

要让 Nginx 的 TCP 代理(如 stream 模块代理 Redis、MySQL、TLS 流量等)真正扛住高并发连接和大流量吞吐,不能只调 Nginx 配置——底层 Linux 内核参数才是决定性瓶颈。TCP 代理不解析应用层内容,但对连接建立速度、端口复用效率、队列承载能力和缓冲区吞吐极为敏感。
匹配内核连接队列与 Nginx 监听能力
高并发建连时若队列溢出,内核会静默丢弃 SYN 包,客户端表现为 Connection refused 或超时:
-
net.core.somaxconn = 65535:监听全连接队列上限,必须 ≥ stream 中 listen 的 backlog 值(如
listen 6379 backlog=65535) - net.ipv4.tcp_max_syn_backlog = 65535:SYN 半连接队列大小,应对突发握手洪峰;低于 somaxconn 会导致 SYN 被丢
- net.core.netdev_max_backlog = 262144:网卡软中断收包队列,防高速入包但内核处理不过来而丢包
加速短连接端口回收与复用
TCP 代理常见于 Redis 查询、MySQL 小事务等短连接场景,大量 TIME-WAIT 会快速耗尽本地端口,触发 Cannot assign requested address 错误:
- net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 状态端口复用于新出向连接(Nginx 主动连接后端时生效)
- net.ipv4.ip_local_port_range = 1024 65535:扩大临时端口范围,可用端口从约 3.2 万增至 6.4 万
- net.ipv4.tcp_fin_timeout = 30:缩短 FIN_WAIT_2 超时,加快连接彻底关闭;避免长时间悬挂
- net.ipv4.tcp_tw_recycle = 0:该参数在 NAT 或负载均衡环境下极易导致连接异常,已废弃,必须禁用
放宽系统资源与网络缓冲限制
TCP 代理虽不解析 HTTP,但更依赖稳定、低延迟的大吞吐通道:
-
fs.file-max = 2097152:系统级最大文件描述符数,应 ≥
worker_rlimit_nofile × worker_processes - net.core.rmem_max / wmem_max = 16777216(16MB):提升单连接收发缓冲上限,适应高延迟或带宽突增链路
- net.ipv4.tcp_rmem / tcp_wmem = "4096 65536 8388608":设为自动缩放模式,兼顾小包低延迟与大流吞吐
- vm.swappiness = 1:极低交换倾向,防止 Nginx 内存压力下触发 swap,导致代理延迟飙升
Stream 模块配置协同要点
内核调优需配合 Nginx stream 层合理设置才能释放全部潜力:
- 每个
server块中显式设置listen ... backlog=65535,与 somaxconn 对齐 - 使用
proxy_timeout 30s和proxy_responses 1(按需)控制会话生命周期,避免空闲连接堆积 - 启用
reuseport on(Linux ≥ 3.9),让多个 worker 进程各自绑定端口,减少 accept 锁争用 - 避免在 stream 块中做复杂日志记录或变量计算,保持转发路径最简











