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都相同,哈希后只会分到同一个上游。
解决方法:- 确保前端代理(如果有)传递
X-Forwarded-For头部; - 在Nginx的
http块添加配置,获取真实IP:real_ip_header X-Forwarded-For; set_real_ip_from 172.17.0.0/16; # 替换为你的Docker网关IP段 - 修改
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
相关产品推荐
相关产品推荐

