nginx跨机房“优先路由”需结合地理识别、动态权重、主动健康检查与fallback机制:用geo+map按地域映射upstream;依实测qps设weight比例;配置max_fails/fail_timeout及health_check主动探活;通过backup或proxy_next_upstream实现灾备自动切换。

要让 Nginx 在跨机房场景下实现“优先路由”,关键不是简单把流量平均甩过去,而是让请求尽可能落在离用户更近、响应更快、资源更充足的本地机房,同时保留灾备能力。这需要结合地理识别、权重控制和健康状态动态决策。
用 geo 指令识别用户属地
Nginx 自带 geo 指令可基于客户端 IP 划分区域,无需额外模块。在 http 块中定义:
- 用
geo $region匹配 IP 段或接入 GeoIP 数据库(如 MaxMind),把用户归入cn_beijing、cn_shanghai等区域变量 - 再用
map把区域映射为对应的 upstream 名称,例如cn_beijing → backend_bj,other → backend_global - 注意:公网 IP 归属可能不准,建议搭配 CDN 透传真实地域头(如
X-Real-Region)做 fallback
按机房能力配置差异化权重
权重不是拍脑袋定的,得看实测吞吐。比如 A 机房单节点稳态 QPS 是 1200,B 机房只有 600,那 weight 比例就设成 2:1:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在
upstream backend_bj中,A 机房各节点设weight=2;B 机房节点统一设weight=1 - 如果 B 机房只用于常态化验证,想让它承接 10% 流量,就把它的 weight 调整为 0.5,并配合
max_fails=2 fail_timeout=30s防误剔 - 上线前务必用
wrk -t4 -c100 -d30s http://a-node/health实测单点极限,再反推权重比例
启用主动健康检查保障路由可靠性
仅靠连接超时被动判断太慢,跨机房网络抖动频繁,必须主动“敲门”:
- 在每个
server行后加max_fails=3 fail_timeout=20s,触发临时剔除 - 搭配
health_check interval=5 rise=2 fall=3(需 nginx-plus 或开源版 + lua_healthcheck 模块) - B 机房建议走独立探活路径(如
/health?site=backup),避免主业务接口偶发慢导致误判 - 节点恢复后自动回归调度池,不依赖人工干预
设置 fallback 机制兜底异地机房
本地机房全挂时,不能断服务,要平滑切到灾备中心:
- 所有 upstream 都包含两地节点,但默认只启用本地组;用
backup标记异地节点,仅当本地全部不可用时才启用 - 或者更灵活的做法:定义一个全局
backend_fallback,里面只放 B 机房节点,在 server 块里用proxy_next_upstream error timeout http_500;触发回退 - 验证时手动停掉 A 机房全部服务,观察 access_log 中请求是否在 10 秒内完成切换,且无 5xx 上升










