Nginx 四层负载均衡和七层负载均衡配置区别在哪里

文章导读
Nginx 实现四层负载均衡需启用 stream 模块并在配置中使用 stream 块,而七层负载均衡则基于标准的 http 块,核心区别在于配置层级不同以及能否解析应用层协议内容。
📋 目录
  1. 环境检查与模块安装
  2. 完整配置示例(stream 与 http 共存)
  3. 验证与测试
  4. 常见坑与排查
  5. 参考文档
A A

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. 安装或编译支持

如果是通过包管理器安装,建议安装增强版包(不同发行版名称可能不同):

Nginx 四层负载均衡和七层负载均衡配置区别在哪里
  • Ubuntu/Debian:apt install nginx-extras
  • CentOS/RHEL:可能需要添加 EPEL 源或重新编译。

若需源码编译,需在 configure 阶段添加参数:

./configure `--with-stream` ...

完整配置示例(stream 与 http 共存)

四层和七层配置可以存在于同一个 nginx.conf 文件中,但必须分别位于 streamhttp 顶层块中,且监听端口不能冲突。

注意:以下示例中,四层监听 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 reload

2. 四层连通性验证

使用 telnetnc 测试 TCP 端口连通性:

Nginx 四层负载均衡和七层负载均衡配置区别在哪里
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 协议。

参考文档