Nginx Stream模块是内置的四层代理功能,用于TCP/UDP流量转发,非编程式扩展;需通过nginx -V | grep with-stream验证启用,配置须与http平级且仅含upstream和server指令。

Stream 模块不是用来“开发”的模块,而是 Nginx 内置的、开箱即用的四层代理能力。它不支持用户像写 Lua 或 C 插件那样进行“模块级开发”,而是通过配置驱动实现 TCP/UDP 流量转发——本质是声明式代理,不是编程式扩展。
确认 Stream 模块是否可用
运行以下命令验证:
- nginx -V 2>&1 | grep -o 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:MySQL 握手只返回 1 包,设为 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,错误排查依赖 error.log 和 telnet/mysql-cli 连通性测试











