nginx stream模块是专为tcp/udp设计的四层代理,不解析应用层协议,仅做原始字节流转发;需通过nginx -v | grep with-stream确认启用,配置必须与http同级且仅含upstream/server指令。

Stream 模块是 Nginx 原生支持的四层代理能力,专为 TCP/UDP 流量设计,不解析应用层协议,只做原始字节流转发。它适合 MySQL、Redis、SSH、MQTT、游戏服务等非 HTTP 场景,核心在于“透明”和“轻量”。
确认模块是否可用
运行以下命令验证:
- nginx -V 2>&1 | grep with-stream —— 有输出说明已编译启用
- 若无输出:Ubuntu/Debian 可安装 nginx-full;CentOS/RHEL 需重编译并加 --with-stream
- 官方 nginx.org 的 stable 包默认包含,无需额外操作
配置结构必须合规
Stream 配置不能嵌套在 http 块中,必须与 http 平级,且仅含特定指令:
- 主配置中添加:load_module modules/ngx_stream_core_module.so;(部分版本需显式加载)
- 顶层定义:stream { include /etc/nginx/stream.d/*.conf; }
- 每个 .conf 文件内只允许写 upstream 和 server,禁用 rewrite、return、access_log 等 HTTP 指令
典型非 HTTP 协议代理要点
以 MySQL 和 Redis 为例:
- proxy_timeout 设长些(如 1h 或 1d),避免空闲连接被中间设备断开
- proxy_responses 1:MySQL 握手只需返回 1 包即认为成功;Redis 同样适用
- upstream 中 max_fails/fail_timeout:启用被动健康检查,例如 max_fails=3 fail_timeout=30s
- backup 标记:可指定容灾节点,仅在所有主节点失败时启用
限制与注意事项
Stream 模块能力明确,误用会导致配置失败或行为异常:
- 不解析协议内容,无法做鉴权、路由改写、包体修改等七层操作
- 原生不支持主动健康检查(如定期发 PING),需配合第三方模块或外部脚本刷新 upstream
- SSL 终止需额外启用 --with-stream_ssl_module,且不支持 SNI 路由
- 日志功能受限,原生无 access_log,排查依赖 telnet/mysql-cli 连通性测试











