可以同时配置HTTP代理与四层Stream代理,二者互不干扰,只需在nginx.conf中分属不同同级配置块;需确保Stream模块已启用(--with-stream编译)、正确加载模块、stream与http平级且端口不冲突。

可以同时配置 HTTP 代理与四层 Stream 代理,二者互不干扰,只需在 nginx.conf 中分属不同配置块即可。关键在于结构清晰、模块启用正确、端口不冲突。
确认 Stream 模块已启用
Stream 模块不是默认内置,编译时必须显式开启:--with-stream。验证方式:
- 执行
nginx -V 2>&1 | grep -o with-stream,输出含with-stream表示已启用 - 若未启用,需重新编译安装;主流发行版(如 Ubuntu 的 apt 包、CentOS 的 EPEL)通常已默认包含该模块
配置结构:http 与 stream 平级共存
两者是同级模块,不能嵌套。正确写法是将 stream { ... } 块放在 http { ... } 块之外(通常置于 http 块上方或下方),例如:
- 主配置文件顶部加载模块:
load_module modules/ngx_stream_core_module.so; - 然后依次定义:
stream { ... }和http { ... },顺序无关,但建议 stream 在前 - 避免把 stream 配置写进 http 块内,否则会报错“unknown directive ‘stream’”
分别配置 HTTP 七层代理与 Stream 四层代理
各自独立定义 upstream 和 server,端口、协议、用途完全分离:
-
HTTP 代理示例:监听 80 端口,反向代理 Web 应用
http { upstream web_backend { server 10.0.1.10:8080; } server { listen 80; location / { proxy_pass http://web_backend; } } } -
Stream 代理示例:监听 3306 端口,转发 MySQL 流量
stream { upstream mysql_pool { server 10.0.2.20:3306; server 10.0.2.21:3306; } server { listen 3306; proxy_pass mysql_pool; proxy_timeout 1h; } } - 两个服务可共用同一台 Nginx 服务器,只要监听端口不重叠(如 80 和 3306 无冲突)
实用技巧与避坑提醒
混合部署时容易忽略的细节:
- 日志分离:HTTP 日志走
access_log,Stream 不支持 access_log,但可通过error_log notice查看连接建立/断开事件 - 健康检查:Stream 支持
health_check(需配合zone),但仅限 TCP 连通性检测,无法像 HTTP 那样校验状态码或响应体 - TLS 处理:HTTP 模块可做 SSL 终止;Stream 模块支持
ssl_preread on实现 SNI 透传,或直接终止 TLS(需配证书) - reload 安全性:修改 stream 块后执行
nginx -t && nginx -s reload,会同时重载 http 和 stream 配置,无需单独重启


















