You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx split_clients配置无法分流至多上游服务器问题排查

Nginx流量分流异常排查要点

针对你的配置中流量始终只流向exercim上游的问题,可能的原因如下:

  • split_clients的哈希字符串格式错误
    你配置的split_clients "${remote_addr}" $backend里,给$remote_addr加了引号和大括号,这会导致Nginx把带引号的固定字符串(而非真实客户端IP)作为哈希计算的依据,所有请求的哈希值完全一致,自然全部分配到第一个上游。
    正确写法应该去掉引号和大括号:

    split_clients $remote_addr $backend {
        50% exercim;
        *   nutshell;
    }
    
  • $remote_addr未获取到真实客户端IP
    如果你的Nginx运行在Docker容器内,$remote_addr默认会是Docker网关的IP(比如172.17.0.1),而非用户的真实IP。所有请求的$remote_addr都相同,哈希后只会分到同一个上游。
    解决方法:

    1. 确保前端代理(如果有)传递X-Forwarded-For头部;
    2. 在Nginx的http块添加配置,获取真实IP:
      real_ip_header X-Forwarded-For;
      set_real_ip_from 172.17.0.0/16; # 替换为你的Docker网关IP段
      
    3. 修改split_clients使用真实IP相关变量:
      split_clients $http_x_forwarded_for $backend {
          50% exercim;
          *   nutshell;
      }
      
  • 未验证$backend变量的实际值
    可以通过修改日志格式,确认每个请求分配的上游是否正确。在http块添加或修改日志格式:

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$backend"';
    

    然后开启access_log:

    access_log  /var/log/nginx/host.access.log  main;
    

    查看日志就能直观看到每个请求的$backend值,判断是哈希逻辑问题还是IP获取问题。

  • split_clients块的位置错误
    确保split_clients是定义在http层级(而非server或location块内部),否则变量$backend不会被全局正确初始化,导致分流逻辑失效。

内容的提问来源于stack exchange,提问作者Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:58:15