nginx负载均衡

一.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;
    }

总结

  1. map 指令无原生权重支持,需通过「扩大随机字符匹配范围」等效实现权重;
  2. 核心技巧:基于 $request_id 最后一位(0-f,16 个字符)或多位字符,按权重比例分配字符,字符占比 = 分流占比;
  3. 生产环境推荐 upstream + random weight,配置更简洁、权重控制更精准、稳定性更强;
  4. 权重调整灵活:可通过增减匹配字符数量(map 方式)或修改 weight 参数(upstream 方式),快速调整分流比例。
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    梦夏夜

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值