异地多活中worker层就近路由依赖geoip2地理标签与nginx map指令实现确定性分发,通过city/asn数据库提取地域/isp信息,构建层级fallback映射至数据中心标识,并动态proxy_pass至对应upstream组。

异地多活场景下,Worker 层(即 Nginx 作为边缘网关或反向代理层)的就近静态路由调度,核心不是“实时探测”,而是“基于地理归属的确定性分发”。GeoIP2 提供高置信度的国家/省份/城市/ISP 等维度数据,配合 Nginx 的 map 指令,可在请求解析阶段完成毫秒级标签映射,驱动后续 upstream 选择——这是轻量、稳定、无外部依赖的落地路径。
明确 Worker 层定位与能力边界
Worker 层指部署在各接入点(如 CDN 边缘节点、区域 POP 点、云上 ALB 后端)的 Nginx 实例,不承担数据同步或状态管理,只做:
• 解析真实客户端 IP(需前置 real_ip 还原)
• 查 GeoIP2 数据库提取地域/ISP 标签
• 用 map 将标签映射为预定义的数据中心标识(如 dc_beijing、dc_shenzhen、dc_singapore)
• 在 proxy_pass 中引用该标识,指向对应 upstream 组
配置 GeoIP2 提取关键维度并构建 map 映射
在 http 块中声明数据库与变量:
$geoip2_data_country_code source=$remote_addr country iso_code;
$geoip2_data_subdivision_iso_code source=$remote_addr subdivisions iso_code;
$geoip2_data_city_name source=$remote_addr city name;
}
geoip2 /usr/share/GeoIP/GeoLite2-ASN.mmdb {
$geoip2_data_asn_number source=$remote_addr autonomous_system_number;
}
map $geoip2_data_country_code $dc_target {
default dc_global;
CN dc_beijing;
SG dc_singapore;
US dc_ashburn;
DE dc_frankfurt;
}
map $geoip2_data_subdivision_iso_code $dc_target_province {
default $dc_target;
"BJ" dc_beijing;
"GD" dc_shenzhen;
"ZJ" dc_hangzhou;
}
说明:
• 使用 City + ASN 两个数据库,兼顾地理位置与网络归属(如海外用户走中国 ISP 出口时,ASN 可辅助校正)
• $dc_target_province 优先匹配省级编码,未命中则回落到国家级 $dc_target,形成层级 fallback
• 所有变量名以 $ 开头,确保被 Nginx 正确识别为运行时变量
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
定义多活数据中心 upstream 并注入路由标识
每个 upstream 对应一个物理或逻辑数据中心,支持健康检查与权重:
server 10.10.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.10.1.11:8080 max_fails=3 fail_timeout=30s;
keepalive 32;
}
upstream dc_shenzhen {
server 10.20.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.20.1.11:8080 max_fails=3 fail_timeout=30s;
keepalive 32;
}
upstream dc_singapore {
server 10.30.1.10:8080 max_fails=3 fail_timeout=30s;
server 10.30.1.11:8080 max_fails=3 fail_timeout=30s;
keepalive 32;
}
在 server 或 location 块中调用:
proxy_pass http://$dc_target_province;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-DC-Target $dc_target_province;
proxy_set_header X-Geo-Country $geoip2_data_country_code;
proxy_set_header X-Geo-City $geoip2_data_city_name;
}
说明:
• proxy_pass http://$dc_target_province 直接实现动态 upstream 路由
• 透传 X-DC-Target 等 Header,便于后端服务记录、审计或二次决策
• keepalive 复用连接,降低 Worker 层与上游之间的建连开销
增强稳定性与可观测性的配套动作
静态路由不等于僵化路由,需辅以基础保障机制:
- 预建所有
upstream名称对应的空组(如upstream dc_global { server 127.0.0.1:8080; }),避免因 map 未覆盖导致 502 - 在日志格式中加入地域字段:
log_format main '$remote_addr [$time_local] "$request" ... $geoip2_data_country_code $dc_target_province'; - 定期更新 GeoLite2 数据库(MaxMind 每月发布新版),建议配合脚本自动下载+重载 Nginx 配置
- 若需灰度验证,可用
map结合$arg_dc(URL 参数)或$cookie_dc(测试 Cookie)覆盖默认逻辑










