Nginx 1.9.0+ 通过 stream 模块原生支持 TCP/UDP 负载均衡,需启用 --with-stream 编译选项,配置独立于 http 块,支持 least_conn 等调度策略及基础健康检查,但不支持内容路由和原生 TCP 主动探活。

Nginx 从 1.9.0 版本开始原生支持 TCP/UDP 层的负载均衡,通过 stream 模块实现,而非传统的 http 模块。要实现 TCP 协议的负载均衡与请求转发,关键在于启用 stream 模块、正确配置上游服务器(upstream)和监听规则。
确认 Nginx 编译时已启用 stream 模块
运行 nginx -V 查看编译参数,确认输出中包含 --with-stream。若无此选项,需重新编译 Nginx 并添加该模块。部分发行版预装的包可能默认不启用,建议使用官方源或自行编译。
在主配置文件中引入 stream 配置
stream 配置不能写在 http 块内,需独立定义在 nginx.conf 的顶层(与 http 块同级)。常见做法是将 stream 相关配置单独存为 stream.conf,再通过 include 引入:
- 在 nginx.conf 末尾添加:
include /etc/nginx/stream.conf; - 确保
stream { ... }块不嵌套在任何其他块中 - stream 块中不支持 access_log、rewrite 等 HTTP 特有指令
配置 TCP 负载均衡 upstream 和 server
以转发 MySQL 流量为例(端口 3306):
stream {
upstream mysql_backend {
least_conn;
server 192.168.1.10:3306 max_fails=3 fail_timeout=30s;
server 192.168.1.11:3306 max_fails=3 fail_timeout=30s;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_timeout 1h;
proxy_responses 1;
}
}
-
least_conn表示最小连接数调度,也支持round_robin(默认)和hash $remote_addr consistent实现会话保持 -
proxy_timeout控制连接空闲超时,避免防火墙或中间设备断连 -
proxy_responses 1表示仅等待首个响应包即认为连接建立成功(适用于无协议握手的场景) - 不支持基于内容的路由(如根据 SQL 内容分发),仅做四层转发
健康检查与连接管理
stream 模块支持基础健康检查,但能力有限:
-
max_fails和fail_timeout可触发被动健康检查:连续失败指定次数后,临时剔除节点 - 主动健康检查需借助第三方模块(如 nginx-plus 或开源的
nginx-sticky-module),开源版 Nginx 不原生支持 TCP 心跳探测 - 建议在 upstream 外部署独立监控(如 Prometheus + nginx-vts-exporter 的 stream 扩展)或结合 keepalived 做节点级冗余
不复杂但容易忽略:stream 块的语法和上下文与 http 完全隔离,配置错误通常导致 nginx 启动失败,务必用 nginx -t 校验后再重载。


















