Nginx通过stream模块实现数据库TCP/UDP负载均衡需启用with-stream编译选项、在顶层配置stream块,定义upstream组与server监听,支持权重轮询、TCP健康检查、PROXY协议透传及长连接优化,但开源版原生不支持MySQL应用层健康检查。

要让 Nginx 通过 stream 模块实现数据库集群的 TCP/UDP 负载均衡,核心是启用 stream 模块、定义 upstream 组、配置监听与代理,并适配数据库连接特性(如长连接、健康检查、会话保持等)。这不是简单复制 HTTP 配置,而是需在传输层精准控制连接生命周期和调度逻辑。
确认并启用 stream 模块
stream 模块默认不编译进 Nginx,必须显式启用:
- 重新编译时添加 --with-stream 参数(推荐搭配 --with-stream_ssl_module 以支持 TLS 透传)
- 验证是否生效:
/usr/sbin/nginx -V 2>&1 | grep -o with-stream,有输出即表示已启用 - 若线上环境不能重启,可采用平滑升级:在从节点编译新二进制,
kill -USR2切换主进程,再kill -WINCH优雅关闭旧 worker
为数据库设计 TCP 负载均衡配置(以 MySQL 为例)
数据库连接多为长连接、低频高时延,需关注连接复用、超时控制与故障快速剔除:
- 在 stream 块中定义 upstream,使用 zone 声明共享内存区,便于后续状态监控与动态更新
- 设置 health_check:MySQL 不提供 HTTP 探针接口,需基于 TCP 连接检测,例如
health_check interval=5s fails=2 passes=2 port=3306; - 连接超时参数要合理:proxy_connect_timeout 控制建连耗时(建议 2–5s),proxy_timeout 应大于最长 SQL 执行时间(如设为 60–300s)
- 避免客户端 IP 哈希(
ip_hash)用于数据库——因连接池复用导致后端负载不均;改用least_conn或加权轮询更稳妥
示例片段:
stream {
upstream mysql_cluster {
zone mysql_zone 64k;
server 192.168.5.10:3306 weight=3;
server 192.168.5.11:3306 weight=3;
server 192.168.5.12:3306 backup;
health_check interval=5s fails=2 passes=2 port=3306;
}
server {
listen 3307;
proxy_pass mysql_cluster;
proxy_timeout 120s;
proxy_connect_timeout 3s;
}
}
UDP 场景适配:如 DNS 查询或自定义 UDP 数据库协议
某些数据库中间件(如 TiDB 的 PD 组件、部分时序数据库)或 DNS 辅助服务使用 UDP,配置要点不同:
- listen 指令必须显式声明 udp,例如
listen 53 udp; - health_check 需指定
udp=yes和type=dns(或其他协议类型),Nginx 会发送标准 DNS 查询包验证响应 - proxy_responses 控制期望收到几个 UDP 响应包(DNS 通常为 1)
- 注意 UDP 无重传机制,proxy_timeout 宜设短(如 5–10s),避免客户端长时间等待
示例片段:
stream {
upstream dns_servers {
server 10.10.20.1:53 weight=5;
server 10.10.20.2:53 weight=5;
health_check udp=yes type=dns interval=3s fails=2 passes=1;
}
server {
listen 53 udp;
proxy_pass dns_servers;
proxy_timeout 5s;
proxy_responses 1;
}
}
生产必备:安全与可观测性加固
仅转发不够,数据库入口需兼顾访问控制与运行洞察:
- 限制源 IP:在 server 块中用
allow/deny控制接入网段,例如只允应用服务器子网访问 - 开启 access_log:stream 支持独立日志格式,记录客户端 IP、连接时长、后端地址等,便于审计与排障
- 暴露状态接口:配合 nginx-module-sts 或自定义 stub_status,监控活跃连接数、上游状态等关键指标
- 慎用 backup + max_conns:对 MySQL 主从架构,backup 可作只读备库;max_conns 防止单节点过载,值建议按后端最大连接数 × 0.7 设置











