stream模块是nginx实现tcp/udp四层代理的核心,通过upstream配置被动健康检查、backup备用节点及least_conn等策略实现高可用;需确认编译含with-stream、主配置加载模块并同级定义stream块,配合so_keepalive、proxy_timeout等优化连接稳定性。

Stream 模块是 Nginx 实现 TCP/UDP 四层代理的核心能力,不解析应用层协议,只做原始字节流转发。它本身不提供“连接池”或“协议感知重定向”,但通过合理配置,能构建出稳定、可自动故障转移的高可用接入层——关键在于连接稳定性、节点健康感知和流量分发逻辑的协同。
确认模块已启用并正确加载
高可用的前提是模块可用。执行以下命令验证:
-
nginx -V 2>&1 | grep with-stream:输出含
with-stream表示编译时已启用 - 若无输出,需重新编译 Nginx 并添加
--with-stream(推荐同时加--with-stream_ssl_module支持 TLS 透传) - 主配置文件顶部必须显式加载:
load_module modules/ngx_stream_core_module.so; -
stream { }块必须与http { }同级,不能嵌套在 http 内
定义 upstream 实现节点管理与故障转移
upstream 是高可用的调度中枢,支持被动健康检查和主备切换:
- 用
max_fails=3 fail_timeout=30s设置节点摘除条件:连续 3 次连接失败后,30 秒内不再转发请求 - 用
backup标记备用节点,仅当所有主节点不可用时才启用 - 负载策略选
least_conn(连接数最少)更适数据库类长连接场景;hash $remote_addr可保持客户端会话粘性 - 避免使用
ip_hash(stream 模块不支持),改用hash指令配合变量
server 块中强化连接生命周期控制
每个监听端口对应一个代理服务,需针对性优化连接行为:
-
proxy_timeout 30s:设为业务可接受的最大空闲等待时间(MySQL 长连接建议设为1h) -
so_keepalive on(写在listen指令后):启用 TCP keepalive,防止 NAT 或防火墙超时断连 -
proxy_responses 1:适用于单请求单响应协议(如 Redis PING、MySQL handshake),收到首个响应即确认连接有效 -
proxy_buffer_size 128k:对高吞吐协议(如 MySQL binlog 流)适当调大,默认 8k 易成为瓶颈
补充主动健康检查(可选但推荐)
原生 stream 模块仅支持 TCP 端口连通性探测,无法判断 Redis 是否 OOM、MySQL 是否只读等深层状态:
- 基础配置:
health_check interval=3s timeout=1s fails=3 passes=2;(需放在 upstream 内) - 该检查仅验证三次握手成功,不能替代业务层探活
- 生产环境建议搭配外部方案:用 Consul Health Check、自定义脚本 +
nginx-stream-upsync-module,或由后端服务暴露 /health 端点并用 HTTP 模块反向代理做前置校验











