Nginx stream模块是专为TCP/UDP设计的四层代理,不解析应用层协议,适用于MySQL、Redis等非HTTP场景;需源码编译时添加--with-stream并主配置中显式加载模块,stream块须与http同级。

Nginx 的 stream 模块是专为 TCP/UDP 流量设计的四层代理方案,不解析应用层协议,只做原始字节流转发。它适合 MySQL、Redis、SSH、游戏服务等非 HTTP 场景,性能高、延迟低、配置简洁。
确认并启用 stream 模块
stream 模块从 Nginx 1.9.0 起支持,但默认不编译进二进制。若执行 nginx -V 没有输出 with-stream,说明模块未启用。
- 源码编译时务必加入
--with-stream(推荐搭配--with-stream_ssl_module支持 TLS 透传) - 主流发行版包管理器安装的 Nginx(如 apt/yum)通常不含该模块,建议自行编译
- 主配置文件顶部需显式加载模块:
load_module modules/ngx_stream_core_module.so; - stream 配置块必须与 http 块同级,不可嵌套在 http 内
MySQL 四层代理配置要点
MySQL 协议是二进制、长连接密集型,代理需兼顾连接稳定性与健康感知。
- 使用
proxy_responses 1:等待首个响应包再判定连接成功,避免仅靠 TCP 握手误判后端可用 - 设置合理超时:
proxy_connect_timeout 3s控制建连耗时,proxy_timeout 1h适配 MySQL 长连接空闲期 - 缓冲区调大:
proxy_buffer_size 512k防止mysqldump或大结果集触发截断 - 启用连接保活:
so_keepalive on减少中间网络设备断连 - 备用节点用
backup标记,故障时自动切换
Redis 代理与高可用实践
Redis 代理适用于单机主从或哨兵模式,但不适用于原生 Redis Cluster——Nginx 无法识别 MOVED/ASK 重定向,客户端仍需自行处理集群拓扑。
- 主从分离可配置两个 server 块:一个监听 6379 转发至 master,另一个监听 6380 转发至 replicas
- 启用
health_check进行 TCP 层探活(如interval=3s timeout=1s fails=3 passes=2),但注意这只是端口可达性检查 - 长连接场景下,每个 TCP 连接固定绑定后端节点,负载均衡基于连接粒度而非请求粒度
- 密码由客户端直传后端,Nginx 不参与鉴权,确保所有后端 Redis 实例 requirepass 一致
通用优化与避坑提醒
四层代理看似简单,但几个关键细节直接影响稳定性。











