4. 负载均衡器配置:Nginx/HAProxy 流量入口与 Upstream 组
蓝绿部署的流量切换依赖负载均衡器作为唯一的流量入口。Nginx 和 HAProxy 是生产环境中最常用的两种方案。本节聚焦 upstream 组定义、权重分配与健康检查配置,确保切换过程平滑、可观测、可回滚。
4.1 流量入口架构
负载均衡器位于客户端与后端服务之间,根据 upstream 组中定义的服务器列表分发请求。蓝绿部署场景下,upstream 组通常包含两个逻辑分组:Blue(当前稳定版本)和 Green(待发布版本)。
核心原则: 流量入口必须支持 动态权重调整 和 被动/主动健康检查,以便在切换过程中逐步转移流量,并在检测到异常时自动摘除节点。
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),逐步增加权重,避免瞬间流量冲击导致缓存未预热或连接池打满。
4.6 蓝绿切换权重调整示例
以下是一个典型的蓝绿切换权重调整步骤,假设初始状态为 Blue 100% / Green 0%:
- 阶段一(验证): Green 权重设为 5,Blue 权重保持 100。少量流量进入 Green,验证功能与性能。
- 阶段二(逐步切换): 每 5-10 分钟调整一次权重:Blue 80 / Green 20 → Blue 50 / Green 50 → Blue 20 / Green 80。
- 阶段三(全量切换): Blue 权重设为 0,Green 权重设为 100。观察一段时间,确认无异常。
- 阶段四(清理): 将 Blue 节点从 upstream 组中移除或标记为 backup,完成蓝绿部署。
回滚预案: 如果在切换过程中发现 Green 组异常,立即将权重恢复为 Blue 100 / Green 0。由于 Blue 组一直处于运行状态且权重未归零,回滚可在秒级完成,无需重新部署。