Nginx 多协议负载均衡需严格区分 HTTP/HTTPS(http 模块)与 TCP/UDP(stream 模块),二者配置必须分离且同级;HTTP 用于 Web 服务多域名转发,TCP/UDP 用于数据库等四层透传,混合部署需避免端口冲突并独立配置健康检查。

Nginx 实现多协议负载均衡,关键在于区分协议层级:HTTP/HTTPS 流量走 http 模块,而 TCP/UDP(如 MySQL、Redis、Kafka、自定义二进制协议)流量必须使用 stream 模块。两者不能混用,需在配置中明确分离。
注意:stream 模块默认不启用,编译 Nginx 时需确认含 --with-stream 参数;若用包管理器安装(如 Ubuntu/Debian 的 nginx-full 或 CentOS 的 nginx-all),通常已内置。
✅ HTTP/HTTPS 多域名负载均衡(应用层)
适用于 Web 服务、API、静态资源等基于 HTTP 的流量。
- 在
http { ... }块内定义多个upstream,每个对应一组后端服务器 - 为不同
server_name(域名)单独配置server块,proxy_pass指向对应 upstream - 可结合 SSL 终止:配置证书路径,并添加
return 301 https://$host$request_uri;实现 HTTP 自动跳转
示例:
upstream web_app_a {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080;
}
upstream web_app_b {
server 192.168.1.20:3000;
server 192.168.1.21:3000;
}
server {
listen 443 ssl;
server_name app-a.example.com;
ssl_certificate /etc/nginx/ssl/a.crt;
ssl_certificate_key /etc/nginx/ssl/a.key;
location / {
proxy_pass http://web_app_a;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 443 ssl;
server_name app-b.example.com;
ssl_certificate /etc/nginx/ssl/b.crt;
ssl_certificate_key /etc/nginx/ssl/b.key;
location / {
proxy_pass http://web_app_b;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}✅ TCP/UDP 多端口负载均衡(传输层)
适用于数据库(MySQL/PostgreSQL)、消息队列(Kafka/RabbitMQ)、缓存(Redis)、LDAP、或其他非 HTTP 协议服务。
- 所有
stream相关配置必须放在顶层stream { ... }块中(不能嵌套在 http 块里) - 每个
upstream对应一个协议+端口组合(如3306、6379、9092) -
server块监听对应端口,proxy_pass指向 upstream,支持连接超时、健康检查等参数
示例(MySQL 负载均衡):
stream {
upstream mysql_backend {
server 192.168.2.100:3306 max_fails=3 fail_timeout=30s;
server 192.168.2.101:3306 max_fails=3 fail_timeout=30s;
server 192.168.2.102:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_timeout 1s;
proxy_responses 1;
proxy_connect_timeout 1s;
}
upstream redis_backend {
least_conn;
server 192.168.3.10:6379;
server 192.168.3.11:6379;
}
server {
listen 6379;
proxy_pass redis_backend;
proxy_timeout 3s;
}
}⚠️ 提示:
stream模块不支持proxy_set_header(无 HTTP header),也不处理 URL 或 Cookie;它只做四层转发,所有数据透传。
✅ 混合协议共存的典型部署结构
一个 Nginx 实例可同时运行 http 和 stream 模块,但需确保:
-
http块和stream块同级,都位于主配置文件的root下(如/etc/nginx/nginx.conf) - 不同协议监听不同端口或 IP(避免端口冲突)
- 日志、超时、健康检查等参数按模块独立设置(
http用proxy_*,stream用proxy_*+timeout类参数)
常见监听分配参考:
- HTTP/HTTPS:
80/443→http模块 - MySQL:
3306→stream模块 - Redis:
6379→stream模块 - Kafka:
9092→stream模块 - SMTP/IMAP:
25/143→stream模块
✅ 健康检查与高可用增强
-
http层:可通过ngx_http_upstream_module的max_fails/fail_timeout实现被动健康检查;主动检查需配合第三方模块(如nginx_upstream_check_module)或外部探针 -
stream层:支持 TCP 连接级健康检查(health_check指令需搭配nginx-plus或开源版 1.25.3+ 的stream_upstream_check_module补丁);更稳妥的做法是结合 Consul、Prometheus + Alertmanager 做外部闭环检测
基础被动检查已足够多数场景:
upstream api_backend {
server 10.0.0.1:8080 max_fails=2 fail_timeout=10s;
server 10.0.0.2:8080 max_fails=2 fail_timeout=10s;
}不复杂但容易忽略的是协议边界——HTTP 和 TCP/UDP 必须物理隔离配置,错放位置会导致 Nginx 启动失败。


















