nginx通过stream模块实现tcp四层负载均衡,需启用--with-stream编译选项、配置独立stream块(与http同级),支持权重轮询、least_conn等算法及proxy协议透传,但开源版无原生tcp健康检查。

Nginx 通过 Stream 模块 实现 TCP 层负载均衡,不解析应用层协议,直接转发原始字节流,适用于 MySQL、Redis、SSH、自定义 TCP 服务等场景。
确认 Stream 模块已启用
大多数系统预装的 Nginx(如 Ubuntu apt 或 CentOS yum 安装)默认不含 Stream 模块。需验证是否支持:
- 执行
nginx -V 2>&1 | grep with-stream,输出含with-stream表示已编译启用 - 若无输出,需重编译 Nginx 并添加
--with-stream参数,或改用 nginx.org 官方提供的 stable 预编译包
基础 TCP 代理与负载均衡配置
Stream 配置独立于 HTTP 块,必须置于顶层 stream { ... } 中,不能放在 http 或 conf.d/ 下:
- 新建
/etc/nginx/stream.d/mysql.conf等专用配置文件 - 在
nginx.conf末尾引入:include /etc/nginx/stream.d/*.conf; - 定义 upstream 组,支持
round-robin(默认)、least_conn、hash $remote_addr等策略
连接复用与性能优化关键项
TCP 层无 HTTP 的 keep-alive 机制,但 Nginx Stream 支持 upstream 连接池复用,显著降低后端建连压力:
- 在 upstream 块中设置
keepalive 32(建议值为单台后端最大并发连接数的 1/2~1/3) - 配合
keepalive_timeout 60s控制空闲连接保活时长 - 显式声明
proxy_buffering off,避免缓冲引发粘包或延迟 - 对短会话协议(如 MySQL 查询),设
proxy_responses 1;长连接服务则省略或设为 0
健康检查与故障转移
Stream 模块原生支持被动健康检查,也可结合主动探测提升可靠性:
- 使用
max_fails=3 fail_timeout=30s自动剔除异常节点 - 添加
backup标记备用服务器,主节点不可用时自动切换 - 高可用场景可配合
zone tcp_upstream 64k实现共享内存状态同步(多 worker 共享连接池)











