Nginx 实现四层负载均衡需启用 stream 模块并在配置中使用 stream 块,而七层负载均衡则基于标准的 http 块,核心区别在于配置层级不同以及能否解析应用层协议内容。
先说结论:配置语法结构完全不同,四层走 stream 块转发 TCP/UDP 流量,七层走 http 块处理 HTTP/HTTPS 请求。
- 适合:四层用于数据库、游戏等非 HTTP 流量,七层用于 Web 站点、API 网关。
- 重点看:配置文件顶层块是 stream 还是 http,以及是否编译了
`--with-stream`参数。 - 别忽略:四层负载均衡无法基于 URL 或 Cookie 做路由,只能基于 IP 和端口。
环境检查与模块安装
在配置前,必须确认 Nginx 是否支持 stream 模块,否则直接配置会导致启动失败。
1. 检查模块支持
执行以下命令查看编译参数:
nginx -V检查输出中是否包含 `--with-stream`。如果没有,说明当前版本不支持四层负载均衡。
2. 安装或编译支持
如果是通过包管理器安装,建议安装增强版包(不同发行版名称可能不同):
- Ubuntu/Debian:
apt install nginx-extras - CentOS/RHEL:可能需要添加 EPEL 源或重新编译。
若需源码编译,需在 configure 阶段添加参数:
./configure `--with-stream` ...完整配置示例(stream 与 http 共存)
四层和七层配置可以存在于同一个 nginx.conf 文件中,但必须分别位于 stream 和 http 顶层块中,且监听端口不能冲突。
注意:以下示例中,四层监听 3306 端口(模拟数据库),七层监听 80 端口(Web 服务),避免端口冲突。
user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;events { worker_connections 1024;}stream { log_format basic '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream_access.log basic; upstream tcp_backend { server 192.168.1.10:3306; server 192.168.1.11:3306; } server { listen 3306; proxy_pass tcp_backend; proxy_connect_timeout 1s; proxy_timeout 3s; }}http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer" '$"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; upstream web_backend { server 192.168.1.20:80; server 192.168.1.21:80; } server { listen 80; server_name example.com; location / { proxy_pass http://web_backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }}验证与测试
配置完成后,按以下步骤验证是否生效:
1. 语法检查与重载
nginx -t
nginx -s reload2. 四层连通性验证
使用 telnet 或 nc 测试 TCP 端口连通性:
telnet VIP 3306 # 或 nc -vz VIP 3306如果连接建立成功,说明四层转发正常。
3. 七层业务验证
使用
curl访问 HTTP 服务:curl -I http://VIP/检查响应头中的 Server 字段或响应内容是否符合预期后端。
4. 日志检查
- 七层日志:查看
access.log,应包含详细的 URL 请求记录。 - 四层日志:查看
stream_access.log,仅包含连接建立和流量统计信息。
常见坑与排查
- 模块缺失报错:启动时报
unknown directive "stream",说明 Nginx 未编译 stream 模块,需重新安装或编译。 - 端口冲突:
stream块和http块不能监听同一端口(如都监听 80),否则启动失败。 - 健康检查差异:四层通常只检查端口连通性,无法判断应用服务是否真正健康(如 HTTP 500 错误四层无法识别),七层可配置基于状态码的健康检查。
- SSL 处理:七层负载均衡可以在 Nginx 上终止 SSL 连接(解密 HTTP),四层通常只能透传加密流量,后端服务器需自行处理 SSL。
- IP 透传问题:四层负载均衡默认后端看到的是 Nginx 的 IP,如需获取客户端真实 IP,需在应用层协议中传递或使用 PROXY 协议。