地域感知的nginx权重配置需分三步:第一步本地高权异地低权实现就近优先;第二步基于实测p95延迟计算相对权重并微调;第三步用map按用户地域动态路由至分组upstream,配合健康检查、backup标记与keepalive优化。

Nginx 本身不感知“地域”,权重只是数字,但结合地域做优化,关键在于让权重配置贴合跨机房的实际网络与服务能力差异,而不是简单按地理位置拍脑袋设值。真正有效的做法是分层设计:本地优先、动态感知、全局协同。
地域感知的权重配置不是静态填数字,而是分三步落地
第一步:本地高权,异地低权,体现“就近优先”原则
比如北京机房的 Nginx 集群,upstream 中把本机房后端设为weight=10,上海机房设为weight=2,深圳设为weight=2。这样日常流量 80% 以上落在本地,避免跨城带宽打满、延迟升高;异地节点只作为热备,不承担主力负载。-
第二步:权重数值必须基于实测能力,而非机房标签
同一地域内服务器性能也可能差异很大。正确做法是:- 对每台后端(无论在哪)压测同一接口,取 P95 延迟或稳定 QPS
- 以延迟倒数为基准算相对权重:
weight = round(基准机P95 ÷ 当前机P95) - 若北京某节点 P95=60ms,上海某节点 P95=180ms,则理论权重比为 3:1 —— 但要结合链路损耗再微调,比如最终设为
weight=6(北京)和weight=1(上海),保留弹性空间
-
第三步:用 map + 变量实现“地域路由+权重双控”
不要把所有机房塞进一个 upstream,而是按地域分组定义,并用请求特征动态选组:map $http_x_user_region $upstream_group { default bj_backend; "sh" sh_backend; "sz" sz_backend; } upstream bj_backend { server 10.1.1.10:8080 weight=10; } upstream sh_backend { server 10.2.1.10:8080 weight=3; } upstream sz_backend { server 10.3.1.10:8080 weight=3; } location /api/ { proxy_pass http://$upstream_group; }这样既能按用户归属地定向,又能让每个地域组内部用合理权重调度,互不干扰。
必须配套的运行时保护,否则权重会失效
- 健康检查必须启用且独立:
max_fails=3 fail_timeout=20s,探测路径用/health?site=bj这类带地域标识的 endpoint,防止误判 - 异地节点建议加
backup标记而非weight=0,确保它不参与常规轮询,但健康检查仍持续运行,运维可见 - 所有 upstream 配
keepalive 32和proxy_http_version 1.1,减少跨机房建连开销 - 日志中记录
$upstream_addr和$upstream_http_x_data_region,用于回溯真实路由路径,验证是否符合预期
不复杂但容易忽略。











