nginx集群间流量切换容灾需分三层协同:本地层用权重+健康检查实现主备快速切换,路由层按用户/地域/请求类型智能分流,全局层依赖dns/anycast完成机房级故障隔离;须通过压测验证权重分布、10秒内切换及健康检查准确性。

用 Nginx 实现集群间流量切换容灾,核心不是“换一台服务器”,而是分层控制:本地快速响应、路由按需分流、全局兜底隔离。单靠 upstream 简单 backup 或轮询,扛不住跨机房故障。
本地层:用 upstream 做带健康检查的主备调度
在每个地域的 Nginx 入口配置中,明确区分本集群和异地集群节点:
- 本地集群设高权重(如 weight=10),异地集群设低权重(如 weight=1),避免日常流量压穿跨城链路
- 必须开启主动健康检查:max_fails=3 fail_timeout=20s,配合 proxy_next_upstream error timeout http_502,10 秒内自动剔除异常节点
- 异地探测路径建议独立(如 /health?site=shenzhen),不与业务接口共用,防止因业务慢导致误判下线
路由层:按请求特征做智能分流
不依赖 DNS 切换的分钟级延迟,Nginx 可在接入层实时决策:
- 用 map 提取 $arg_uid 或 $cookie_region,再结合 hash $arg_uid consistent 将用户长期绑定到同一集群
- 写请求(如 POST /api/submit)强制路由至主集群;读请求(如 GET /api/list)允许 fallback 到异地,降低首屏延迟
- 用 geo 指令识别用户 IP 属地,优先调度同大区节点(如广州用户 → backend_gd),全挂时自动降级到全局 backup 组
全局层:DNS 或 Anycast 承担机房级屏蔽
Nginx 自身看不到跨城网络中断或整机房雪崩,必须依赖上层系统:
- 各集群 Nginx 对外暴露相同域名,由 GSLB(如阿里云云解析、AWS Route 53)定时探测入口健康状态,自动屏蔽异常机房的 DNS 解析
- DNS TTL 设为 60s,确保故障后分钟级生效;若用 Anycast,需验证 BGP 路由收敛性,避免黑洞或回环
- 极端情况(如 Nginx 进程全部崩溃),GSLB 是最后一道防线——它只检测 VIP 是否可达,不依赖 Nginx 进程状态
上线前必须验证的三件事
配置写完只是开始,真实压测才能确认是否可靠:
- 用 curl 查看 stub_status 中各 upstream 的 requests 分布,确认权重生效且无倾斜
- 手动停掉一个集群所有服务,观察流量是否在 10 秒内完成切换,日志中 X-Data-Region 头是否更新为备用集群标识
- 模拟跨城网络抖动(如 iptables 丢包),验证健康检查能否准确识别并隔离问题集群











