要用nginx实现tcp代理负载均衡,需启用stream模块(验证命令nginx -v | grep with-stream),配置置于顶层stream块(与http同级),通过upstream定义后端组、server监听端口并proxy_pass转发,关键参数包括proxy_timeout、proxy_responses、proxy_protocol等,并支持tcp健康检查。

要用 Nginx 实现 TCP 代理的负载均衡,核心是启用并正确使用 stream 模块——它工作在传输层,不解析应用层协议,适合 MySQL、Redis、自定义 TCP 服务等场景。
确认 stream 模块已启用
执行命令验证:
nginx -V 2>&1 | grep with-stream
若输出含 with-stream,说明模块可用;若无输出,需重新编译 Nginx 并添加 --with-stream 参数。注意必须用大写 -V,小写 -v 只显示版本号。
配置结构必须放在顶层
stream 块与 http 块同级,不能嵌套在 http{} 内,否则会报错 unknown directive "stream"。典型位置在 nginx.conf 的 events 块之后、http 块之前。
- 每个
upstream定义后端服务器组,支持weight、max_fails、fail_timeout等参数 - 每个
server块监听一个端口(如listen 3306),并用proxy_pass指向 upstream 名 - 默认使用轮询调度,也可加
least_conn或hash $remote_addr consistent实现连接一致性
TCP 代理关键配置项
针对数据库类长连接服务,以下参数直接影响稳定性:
-
proxy_timeout 1h:避免空闲连接被意外断开(MySQL/Redis 推荐设为 30 分钟到 1 小时) -
proxy_responses 1:仅等待首个响应包即完成握手(对 MySQL 握手阶段必需) -
proxy_protocol on:开启 PROXY 协议头,使后端能获取真实客户端 IP(需后端服务支持解析) -
proxy_connect_timeout 5s:建立与后端连接的超时时间,建议设为 3–5 秒
健康检查与生产注意事项
开源版 Nginx 的 stream 模块从 v1.11.5 起支持基础 TCP 健康检查,但不支持原生 HTTP 探活:
- 可配置
health_check interval=3 fails=2 passes=2;进行周期性 TCP 连通性探测 - UDP 场景(如 DNS)需配合
match块自定义请求/响应匹配逻辑 - 确保 Nginx 服务器能直连所有后端 IP:端口,且数据库 bind 地址允许该 IP 访问(如
bind-address = 0.0.0.0) - 防火墙需放行 Nginx 监听端口及后端通信端口











