nginx通过stream模块实现tcp四层负载均衡,需编译启用--with-stream,配置含upstream与server顶层块,支持轮询、least_conn、ip哈希等策略及被动健康检查。

Nginx 实现 TCP 连接请求分发,核心依赖 stream 模块,它专为非 HTTP 流量(如 MySQL、Redis、SSH、MQTT)设计,不处理请求内容,只做四层转发。配置关键在于定义上游服务器组(upstream)+ 监听端口 + 代理目标,再配合负载策略与连接控制参数。
启用 stream 模块并确认支持
TCP 代理功能不是默认内置的,需确认 Nginx 编译时启用了 --with-stream(及可选 --with-stream_ssl_module):
- 运行
nginx -V 2>&1 | grep -o with-stream,有输出即表示已支持 - 若无,需重新编译安装;YUM/DNF 安装的官方包(如 CentOS Stream/RHEL 9+、Ubuntu 22.04+ 的 nginx-full)通常已含该模块
- 配置中 不能把 stream 块写在 http 块内,必须作为顶层块与 http 并列
基础分发配置:upstream + server
最简可用结构如下,实现轮询式分发:
stream {
upstream backend {
server 192.168.10.20:3306;
server 192.168.10.21:3306;
server 192.168.10.22:3306;
}
server {
listen 3306;
proxy_pass backend;
}
}
-
upstream定义逻辑后端组,名称(如backend)需与proxy_pass引用一致 -
server块监听本地端口(如 3306),接收原始 TCP 连接,并将整个连接转发给 upstream 中某台机器 - 默认采用 round-robin 轮询策略,每次新连接按顺序分配
常用分发策略与连接控制
根据业务场景选择更合适的分发逻辑和连接行为:
-
最少连接(least_conn):适合长连接、处理时间差异大的服务(如 Redis 集群)
upstream redis_pool { least_conn; server 10.0.1.5:6379; server 10.0.1.6:6379; } -
IP 哈希(hash $remote_addr):保证同一客户端 IP 总连到同一后端,适用于会话绑定或状态缓存场景
upstream mysql_sticky { hash $remote_addr consistent; server 10.0.2.10:3306; ... } -
连接超时控制:
proxy_timeout 30s控制空闲连接最大存活时间;proxy_connect_timeout 1s限制建立后端连接的等待上限 -
健康检查基础能力:通过
max_fails=3 fail_timeout=30s自动屏蔽连续失败节点(注意:stream 模块无主动探测,仅靠连接失败被动剔除)
配置加载与验证
保存配置后,必须重载而非重启,避免中断已有连接:
- 执行
sudo nginx -t校验语法是否正确 - 执行
sudo systemctl reload nginx(或sudo nginx -s reload)生效 - 验证方式:用
telnet nginx_ip 3306或nc -zv nginx_ip 3306检查端口可达性;抓包或后端日志观察实际连接来源 IP 是否轮换











