Nginx 七层负载均衡如何配置域名转发到不同后端池

文章导读
在 Nginx 中实现基于域名的七层负载均衡,核心是在 http 块中定义不同的 upstream 后端池,并在 server 块中通过 server_name 匹配域名,最后利用 proxy_pass 将请求转发至对应的 upstream。
📋 目录
  1. 核心配置示例
  2. 实施步骤
  3. 验证方法
  4. 常见故障排查
A A

在 Nginx 中实现基于域名的七层负载均衡,核心是在 http 块中定义不同的 upstream 后端池,并在 server 块中通过 server_name 匹配域名,最后利用 proxy_pass 将请求转发至对应的 upstream。

核心要点:该方案适用于多域名共用同一 Nginx 入口且需分流至不同业务集群的场景。配置前需确保域名解析已指向 Nginx IP,且后端服务端口存活。

  • 关键配置:upstream 定义后端地址,server_name 匹配域名,proxy_pass 指定转发池。
  • 风险控制:必须配置默认 server 兜底,防止未绑定域名请求转发错乱。
  • 验收标准:修改配置后执行语法检查,并通过 curl 携带 Host 头验证转发路径。

核心配置示例

以下是一个完整的配置片段,展示了 upstream 定义与 server 块嵌套的正确结构。请根据实际业务 IP 和域名修改相应字段:

http {
    # 定义 Web 业务后端池
    upstream web_pool {
        server 192.168.1.10:8080;
        server 192.168.1.11:8080;
    }

    # 定义 API 业务后端池
    upstream api_pool {
        server 192.168.1.20:8080;
        server 192.168.1.21:8080;
    }

    # Web 域名配置
    server {
        listen 80;
        server_name www.example.com;

        location / {
            proxy_pass http://web_pool;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }

    # API 域名配置
    server {
        listen 80;
        server_name api.example.com;

        location / {
            proxy_pass http://api_pool;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    # 默认兜底配置,防止非法域名访问
    server {
        listen 80 default_server;
        server_name _;
        return 403;
    }
}

实施步骤

1. 编辑配置文件:通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/ 目录下。将上述配置逻辑写入 http 块中。

2. 语法检查:修改完成后,务必先执行语法检查,避免配置错误导致服务无法启动:

Nginx 七层负载均衡如何配置域名转发到不同后端池
nginx -t

3. 重载服务:检查显示 successful 后,平滑重载配置:

nginx -s reload

验证方法

浏览器会自动隐藏 Host 头,建议使用 curl 命令模拟请求进行验证:

curl -H "Host: www.example.com" http://<Nginx_IP>/

观察返回内容是否来自预期的后端池。同时查看 Nginx 访问日志(通常位于 /var/log/nginx/access.log),确认 upstream 地址是否匹配配置。

Nginx 七层负载均衡如何配置域名转发到不同后端池

常见故障排查

1. 502 Bad Gateway:检查 upstream 中的后端 IP 和端口是否存活,确保 upstream 地址中不要带 http:// 前缀,仅写 IP:Port。

2. 转发错乱:如果请求的域名未匹配到任何 server_name,Nginx 会使用默认 server。若未配置 default_server,可能随机匹配一个 server 块。建议始终配置一个 return 403 的默认 server 兜底。

3. 后端获取 IP 错误:若后端应用获取到的客户端 IP 均为 Nginx IP,请检查 location 块中是否添加了 proxy_set_header X-Real-IP $remote_addr;

4. 连接复用问题:如果后端支持 HTTP/1.1,建议在 upstream 中配置 keepalive 连接,并同时在 location 中设置 proxy_http_version 1.1;proxy_set_header Connection ""; 以减少握手开销。