将非HTTP协议流经Nginx,改写为长尾词代理。
- 内容介绍
- 文章标签
- 相关推荐
本文共计597个文字,预计阅读时间需要3分钟。
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 连通性测试
本文共计597个文字,预计阅读时间需要3分钟。
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 连通性测试

