Nginx 默认仅支持七层负载均衡,四层需启用 stream 模块(≥1.9.0),通过顶层 stream 块配置 TCP/UDP 转发,不解析应用层、不支持 SSL 终止,与 http 块同级并可共存。

Nginx 默认只支持七层(应用层)负载均衡,基于 HTTP/HTTPS 协议解析请求头、URL、Host 等字段做路由决策。要实现四层(传输层)负载均衡,需使用 nginx-plus 或开源版的 nginx 1.9.0+ 中的 stream 模块 —— 它不解析应用层内容,而是直接转发 TCP/UDP 流量。
确认 Nginx 是否支持 stream 模块
四层负载均衡依赖 ngx_stream_core_module,该模块默认不编译进开源 Nginx,需在编译时显式启用:
- 检查是否已启用:
nginx -V 2>&1 | grep -o with-stream,有输出表示支持 - 若无,需重新编译:configure 时加上
--with-stream(也可加--with-stream_ssl_preread_module支持 TLS SNI 透传) - 注意:Debian/Ubuntu 官方 apt 包通常不含 stream 模块;建议用官方源或自行编译
配置四层负载均衡(TCP/UDP)
在主配置文件(如 /etc/nginx/nginx.conf)顶层添加 stream 块,不能放在 http 内:
stream {
upstream mysql_backend {
server 192.168.1.10:3306;
server 192.168.1.11:3306;
}
server {
listen 3306;
proxy_pass mysql_backend;
proxy_timeout 1s;
proxy_responses 1;
}
}
-
stream块与http平级,用于处理 TCP/UDP 流量 - 支持健康检查(需 nginx-plus)或简单连接探测(开源版可用
proxy_timeout+proxy_responses配合脚本监控) - 不支持 rewrite、header 修改、SSL 终止(除非启用 ssl_preread 获取 SNI 后做路由)
配置七层负载均衡(HTTP/HTTPS)
标准 HTTP 负载均衡在 http 块中定义,可基于域名、路径、请求头等精细调度:
http {
upstream web_backend {
server 192.168.1.20:8080 weight=3;
server 192.168.1.21:8080 backup;
}
server {
listen 80;
server_name example.com;
location /api/ {
proxy_pass http://web_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
- 支持 session 保持(ip_hash、sticky)、缓存、限流、SSL 终止、重写等完整 HTTP 功能
- 可结合
map指令实现基于 header 或 cookie 的动态 upstream 选择 - 注意:七层配置无法代理非 HTTP 协议(如原始 MySQL、Redis),会报 400 或连接拒绝
如何“切换”四层与七层?
严格来说,Nginx 不提供运行时协议层切换开关。所谓“切换”,是指根据业务需求选择部署方式:
- 同一台 Nginx 实例可同时启用
http和stream块,分别监听不同端口(如 80/443 做七层,3306/53 做四层) - 若需对同一端口实现智能分发(如 443 上既处理 HTTPS 又转发 TLS 封装的其他协议),需借助
ssl_preread on提取 SNI,再用map分流到不同 stream upstream - 典型场景:SNI 为 app.example.com → 七层 upstream;SNI 为 db.example.com → 四层 upstream(需配合 DNS 解析和客户端正确设置 SNI)


















