4. 负载均衡器配置:Nginx/HAProxy 流量入口与 Upstream 组

蓝绿部署的流量切换依赖负载均衡器作为唯一的流量入口。Nginx 和 HAProxy 是生产环境中最常用的两种方案。本节聚焦 upstream 组定义、权重分配与健康检查配置,确保切换过程平滑、可观测、可回滚。

4.1 流量入口架构

负载均衡器位于客户端与后端服务之间,根据 upstream 组中定义的服务器列表分发请求。蓝绿部署场景下,upstream 组通常包含两个逻辑分组:Blue(当前稳定版本)和 Green(待发布版本)。

核心原则: 流量入口必须支持 动态权重调整 和 被动/主动健康检查,以便在切换过程中逐步转移流量,并在检测到异常时自动摘除节点。
负载均衡器流量入口架构 客户端 负载均衡器 Nginx / HAProxy Blue 组 (稳定版) 权重: 100 | 健康: 正常 Green 组 (新版本) 权重: 0 | 健康: 待验证 切换策略 逐步调整权重 从 0 → 100

4.2 Nginx Upstream 组配置

Nginx 通过 upstream 块定义后端服务器组,支持权重、最大失败次数、健康检查间隔等参数。以下是一个典型的蓝绿部署配置模板:

upstream backend {
    # 启用主动健康检查(需 nginx-plus 或第三方模块)
    # zone backend 64k;

    # Blue 组:稳定版本,权重 100
    server 10.0.1.10:8080 weight=100 max_fails=3 fail_timeout=30s;
    server 10.0.1.11:8080 weight=100 max_fails=3 fail_timeout=30s;

    # Green 组:新版本,初始权重 0(不接收流量)
    server 10.0.2.10:8080 weight=0 max_fails=3 fail_timeout=30s;
    server 10.0.2.11:8080 weight=0 max_fails=3 fail_timeout=30s;

    # 备用服务器(可选)
    # server 10.0.3.10:8080 backup;
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
切换操作: 当需要将流量从 Blue 切换到 Green 时,只需修改 upstream 块中的权重值。例如,将 Blue 权重改为 50,Green 权重改为 50,实现 50% 流量切换。Nginx 支持 reload 热加载配置,无需重启进程。

4.3 HAProxy Upstream 组配置

HAProxy 使用 backend 段定义服务器池,支持更细粒度的健康检查和负载均衡算法。以下是对应的蓝绿部署配置:

global
    daemon
    maxconn 4096

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend http-in
    bind *:80
    default_backend app_servers

backend app_servers
    balance roundrobin
    option httpchk GET /health HTTP/1.1\r\nHost:\ app.example.com

    # Blue 组:稳定版本,权重 100
    server blue-1 10.0.1.10:8080 weight 100 check inter 5s fall 3 rise 2
    server blue-2 10.0.1.11:8080 weight 100 check inter 5s fall 3 rise 2

    # Green 组:新版本,初始权重 0
    server green-1 10.0.2.10:8080 weight 0 check inter 5s fall 3 rise 2
    server green-2 10.0.2.11:8080 weight 0 check inter 5s fall 3 rise 2
注意: HAProxy 的 check inter 5s fall 3 rise 2 表示每 5 秒执行一次健康检查,连续 3 次失败则标记为 down,连续 2 次成功则恢复。在蓝绿切换前,务必确认 Green 组所有节点健康检查通过。

4.4 权重与健康检查参数对比

参数 Nginx HAProxy 说明
权重 weight=100 weight 100 控制流量分配比例,蓝绿切换时逐步调整
最大失败次数 max_fails=3 fall 3 连续失败次数超过阈值后标记为不可用
失败超时 fail_timeout=30s inter 5s + rise 2 Nginx 为冷却时间;HAProxy 为检查间隔与恢复条件
健康检查路径 需第三方模块或 nginx-plus option httpchk GET /health HAProxy 原生支持主动 HTTP 健康检查
热加载 nginx -s reload haproxy -f haproxy.cfg -sf $PID 两者均支持无缝重载配置

4.5 健康检查最佳实践

健康检查是蓝绿部署的“安”。配置不当可能导致流量被路由到异常节点,造成服务中断。以下是生产环境中的关键实践:

  • 主动检查 + 被动检查: 主动检查定期探测 /health 端点;被动检查根据实际请求的响应状态码(如 5xx)自动摘除节点。
  • 自定义健康检查端点: 后端服务应提供独立的 /health 端点,返回 JSON 格式的状态信息(如数据库连接、缓存状态等),而非仅返回 200 OK。
  • 检查间隔与超时: 生产环境建议间隔 5-10 秒,超时 2-3 秒。过于频繁的检查可能对后端造成压力。
  • 慢启动: 新加入的节点应设置慢启动(slow start),逐步增加权重,避免瞬间流量冲击导致缓存未预热或连接池打满。
健康检查流程 负载均衡器 健康检查模块 主动检查 (GET /health) 后端服务器 返回 200 OK 被动检查 (请求响应) 健康状态决策 连续失败 ≥ 3 → 摘除节点

4.6 蓝绿切换权重调整示例

以下是一个典型的蓝绿切换权重调整步骤,假设初始状态为 Blue 100% / Green 0%:

  1. 阶段一(验证): Green 权重设为 5,Blue 权重保持 100。少量流量进入 Green,验证功能与性能。
  2. 阶段二(逐步切换): 每 5-10 分钟调整一次权重:Blue 80 / Green 20 → Blue 50 / Green 50 → Blue 20 / Green 80。
  3. 阶段三(全量切换): Blue 权重设为 0,Green 权重设为 100。观察一段时间,确认无异常。
  4. 阶段四(清理): 将 Blue 节点从 upstream 组中移除或标记为 backup,完成蓝绿部署。
回滚预案: 如果在切换过程中发现 Green 组异常,立即将权重恢复为 Blue 100 / Green 0。由于 Blue 组一直处于运行状态且权重未归零,回滚可在秒级完成,无需重新部署。