NGINX ip_hash负载均衡算法未按预期分配流量问题咨询
NGINX ip_hash负载不均排查方案
核心排查方向
- 排查点1:确认IP哈希的计算来源是否为真实客户端IP
默认ip_hash指令使用$remote_addr变量(即直接与NGINX建立TCP连接的对端IP)计算哈希值。如果你的NGINX前端还有CDN、WAF、七层负载均衡等代理层,所有请求的$remote_addr都会是上层代理的固定IP,最终所有请求都会被哈希到同一个后端节点。
你可以查看NGINX的访问日志,确认$remote_addr字段是否为同一IP,如果是,就属于这个场景。
修复方案二选一:
- 启用real_ip模块,将真实客户端IP覆盖到
$remote_addr,在server块中添加以下配置(替换为你上层代理的实际IP段):
set_real_ip_from 10.0.0.0/8; set_real_ip_from 172.16.0.0/12; real_ip_header X-Forwarded-For; real_ip_recursive on;
配置后ip_hash将基于真实客户端IP计算哈希。
2. 替换ip_hash为自定义哈希规则,直接基于X-Forwarded-For头中的真实IP计算,先在http块中添加map配置提取真实IP:
map $http_x_forwarded_for $client_real_ip { default $remote_addr; ~^(?P<first_ip>\d+\.\d+\.\d+\.\d+),?.* $first_ip; }
再将upstream中的ip_hash;替换为hash $client_real_ip;,如果需要一致性哈希减少节点增减时的会话漂移,可以改为hash $client_real_ip consistent;。
- 排查点2:确认所有后端节点处于正常可用状态
如果另外两个后端节点不可用,NGINX会自动将所有流量转发到唯一的正常节点:
- 查看NGINX错误日志
/var/log/nginx/error.log,是否有连接192.168.0.101:5555、192.168.0.102:5555超时、连接被拒绝的报错。 - 在NGINX服务器上手动执行命令测试后端连通性:
curl http://192.168.0.101:5555/health(替换为你的实际健康检查路径)curl http://192.168.0.102:5555/health
如果节点无法访问,先修复后端服务的可用性问题。
- 排查点3:确认请求是否确实匹配到目标upstream
你的配置中只有POST方法请求根路径/时才会转发到backendupstream,其他请求要么被301跳转,要么返回403,不会进入负载均衡逻辑:
- 检查NGINX访问日志,确认统计的流量都是
POST /的请求,排除其他未进入upstream的请求干扰。 - 可以在访问日志格式中添加
$upstream_addr字段,直接记录每个请求实际转发到的后端节点地址,避免后端统计逻辑出错导致误判。
- 排查点4:确认upstream节点配置无调度限制
检查upstream块中三个server的配置,确认没有添加down、backup标记,所有节点的weight值都为正整数(无显式配置时默认weight为1,参与正常调度)。
如果之前修改过upstream配置,确认已经执行nginx -s reload重载配置生效。
内容的提问来源于stack exchange,提问作者georgi_g784
相关产品推荐
相关产品推荐

