一.map 指令本身不支持直接配置权重参数(没有 weight 这类原生属性来指定分流比例),想要实现权重划分,核心思路是:利用 $request_id (32 位随机十六进制字符串)的匹配规则,通过「扩大匹配范围」来等效实现权重分配—— 匹配规则覆盖的随机值越多,对应域名的分流占比就越高,以此模拟权重效果。
# 1. map 指令(放在 server 块之前,属于 http 块层级,合法)
# 匹配最后两位字符,实现更精细权重(70%:20%:10%)
map $request_id $random_domain {
~*[0-6][0-f]$ mix.demo.com; # 前70%字符(00-6f)
~*[7-8][0-f]$ mix.demo.com; # 中间20%字符(70-8f)
~*[9-f][0-f]$ symain.demo.com; # 后10%字符(90-ff)
default symain.demo.com;
}
location ~ ^/(v1|agent|live)/ {
# 临时日志/响应头,便于排查变量
# access_log /tmp/random_domain_access.log main;
add_header X-Random-Domain $random_domain;
# 变量形式 proxy_pass(语法正确)
proxy_pass https://$random_domain;
# ========== 必加:resolver 配置(解决变量域名解析失败)==========
resolver 8.8.8.8 114.114.114.114 valid=300s; # 谷歌DNS + 国内114DNS,缓存300秒
resolver_timeout 10s; # DNS 解析超时时间(避免解析慢导致 502)
# =============================================================
# 原有代理配置
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Content-Type application/json;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# HTTPS 变量代理必备配置(核心修复 502)
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_verify off; # 测试环境使用,生产环境可开启并proxy_ssl_trusted_certificate
# 超时配置
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
}
# websockets
location /socket/ {
proxy_pass http://127.0.0.1:9501;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
二、对比补充:更优雅的权重方案(推荐生产环境)
虽然 map 能模拟权重,但配置较繁琐,生产环境更推荐 upstream + random weight(原生支持权重配置,更简洁、易维护),步骤如下:
#(在 http 块内)定义带权重的随机上游
# ========== 关键:在这里定义 upstream(http 块内,合法层级) ==========
upstream random_backend {
random; # 随机负载均衡策略(支持 weight 权重配置)
server symain-random1.demo.com:443 weight=5; # 权重5
server symain-random2.demo.com:443 weight=3; # 权重3
server mix.demo.com:443 weight=2; # 权重2
server symain.demo.com:443 backup; # 备份节点(可选)
}
# =============================================================
# 仅保留 location 块,引用 http 块内定义的 random_backend
location ~ ^/(v1|agent|live)/ {
# 直接引用 http 块内的 upstream 名称(无需加端口,upstream 内已指定 443)
proxy_pass https://random_backend;
# 必备配置(解决 HTTPS 代理和域名解析问题)
resolver 8.8.8.8 114.114.114.114 valid=300s;
resolver_timeout 10s;
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_verify off;
proxy_connect_timeout 30s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
# 其他原有代理头配置保持不变
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Content-Type application/json;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
}
总结
map指令无原生权重支持,需通过「扩大随机字符匹配范围」等效实现权重;- 核心技巧:基于
$request_id最后一位(0-f,16 个字符)或多位字符,按权重比例分配字符,字符占比 = 分流占比; - 生产环境推荐
upstream + random weight,配置更简洁、权重控制更精准、稳定性更强; - 权重调整灵活:可通过增减匹配字符数量(
map方式)或修改weight参数(upstream方式),快速调整分流比例。
1128

被折叠的 条评论
为什么被折叠?



