Nginx Stream模块通过upstream连接池实现TCP复用,核心是keepalive N控制空闲连接数、keepalive_timeout设保活时长、proxy_buffering off避免粘包、proxy_timeout防断连,并需客户端配合连接池与合理超时设置。

Nginx 的 Stream 模块本身不控制客户端连接复用,它真正实现 TCP 连接复用的关键点,是在 upstream 侧复用到后端服务的连接,也就是减少后端真实服务的建连开销。这不是靠客户端“反复连 Nginx”,而是让 Nginx 自己维护一个到后端的空闲连接池,供多个客户端请求复用。
Stream 模块连接复用的核心配置
keepalive N(必须写在 upstream 块内)
表示该 upstream 最多保留 N 个空闲连接(建议设为单台后端最大并发连接数的 1/2~1/3)。超出数量的空闲连接会被主动关闭。keepalive_timeout time
控制每个空闲连接保活时长(如60s),超时未被复用则释放。太短易频繁重建,太长可能堆积僵死连接。proxy_buffering off(显式关闭)
Stream 模块默认已关缓冲,但显式声明更稳妥。开启缓冲可能导致粘包、延迟或干扰协议交互(尤其对 Redis、MySQL 等二进制协议)。proxy_timeout需合理设置
它控制客户端连接空闲超时(非 upstream),避免被防火墙或云 LB 断连。例如数据库场景可设为1h;短会话协议(如一次查询即断)可设短些。
客户端配合才能发挥复用效果
- 客户端应使用连接池(如 Java 的 HikariCP、Netty ChannelPool),而不是每次请求都新建 socket。
- 避免主动断连:不要因 DNS 轮询、服务发现误判而频繁重连;对外暴露稳定 VIP + 端口更可靠。
- 合理设置客户端超时:
connect timeout和read timeout不宜过短(如 <1s),否则易触发重试建连,抵消复用价值。
验证复用是否生效
- 查看 Nginx 监控指标(需启用
nginx-vts-exporter或stub_status):-
stream_upstream_connections_active:当前活跃 upstream 连接数 -
stream_upstream_connections_idle:当前空闲连接数(理想状态应稳定存在)
-
- 对比后端服务器实际连接数:
ss -s | grep "TCP:"中established数量,应显著低于客户端并发总数。 - 检查 error log:若频繁出现
connect() failed (111: Connection refused)或upstream timed out,说明连接池不足或后端响应慢,不是复用问题而是容量或性能瓶颈。
不复杂但容易忽略


















