nginx tcp代理连接复用核心是启用stream模块upstream keepalive池:需在upstream块设keepalive n(如32)、keepalive_timeout 60s,显式禁用proxy_buffering,并配合proxy_responses、客户端连接池及内核参数协同调优。

在 Nginx TCP 代理(stream 模块)中实现连接复用,核心不是让客户端“多连几次”,而是让 Nginx 和后端服务之间复用一批稳定、空闲的 TCP 连接,从而避免每次请求都经历三次握手和四次挥手。这直接降低后端连接压力、减少 TIME_WAIT 数量,并提升吞吐稳定性。
启用 upstream keepalive 连接池
stream 模块默认不复用连接,必须显式配置才能生效:
- 在 upstream 块中添加 keepalive N(例如
keepalive 32),表示每个 worker 进程最多缓存 N 个空闲连接到同一后端;建议值为后端单机最大空闲连接数的 1/2~1/3,避免压垮后端 - 搭配 keepalive_timeout 60s,控制空闲连接保活时长,防止僵死连接长期占用资源
- 显式声明 proxy_buffering off(stream 默认关闭,但写出更可靠),避免缓冲引发粘包或响应延迟
- 对 Redis/MySQL 等单请求单响应协议,禁用 proxy_responses 1;长连接服务应设为 0 或直接省略
引导客户端合理复用连接
Nginx 不控制客户端行为,但网关设计可显著影响复用效果:
- 对外暴露固定 VIP + 端口,避免因 DNS 轮询、服务发现误判导致客户端频繁重建连接
- Java 客户端优先使用 Netty ChannelPool 或 HikariCP(MySQL 场景),而非每次 new Socket
- 客户端 connect/read timeout 不宜低于 5s,否则易触发无效重连,抵消复用收益
- Linux 客户端可启用
net.ipv4.tcp_tw_reuse = 1,并扩大ip_local_port_range缓解本地端口耗尽
验证复用是否真实生效
配置完成不等于优化到位,需通过交叉指标确认:
- 查 Nginx 状态:
stream_upstream_connections_active和stream_upstream_connections_idle应远小于客户端并发连接总数 - 比对后端执行
ss -s | grep "TCP:"中established数量——若明显低于客户端数,说明复用成功 - 紧盯 error log:频繁出现
connect() failed (111: Connection refused)多是连接池不足;upstream timed out则需排查后端响应慢或超时设置过短
配合系统级调优保障底层能力
内核参数是 TCP 代理高并发的底层基础:
- 增大连接队列:
net.core.somaxconn和tcp_max_syn_backlog建议设为 65535,防 SYN 包被静默丢弃 - 放宽资源限制:
fs.file-max≥worker_rlimit_nofile × worker_processes,避免文件描述符耗尽 - 调优缓冲区:
net.core.rmem_max / wmem_max设为 16MB,适应高延迟或突发流量 - 禁用已废弃参数:
tcp_tw_recycle = 0,避免 NAT 环境下连接异常











