直接删除ip_hash;即可清除哈希策略,nginx自动回退至轮询;需同步排查自定义hash指令、sticky模块等隐性粘性配置,并重载验证$upstream_addr是否轮转。

直接删掉 ip_hash; 这一行,就清除了哈希调度策略。
确认 upstream 中已移除 ip_hash 指令
在 http 块的 upstream 配置里,检查并删除 ip_hash; 这行。保留 server 列表即可,Nginx 会自动回退到默认的轮询(Round Robin)策略:
- 错误写法(仍启用哈希):
upstream backend { ip_hash; server 192.168.1.10:8080; ... } - 正确清理后:
upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; }
检查是否残留影响哈希行为的配置
有些配置看似无关,实则可能间接维持“类哈希”效果,需一并排查:
- 删掉
hash $remote_addr或hash $cookie_xxx等自定义 hash 指令(它们属于 stream 或高级 http 负载均衡,但若存在也会干扰) - 确认没误用
least_conn+ 固定 IP 场景导致的伪粘性(这不是哈希,但现象类似,需结合日志判断) - 检查是否有
sticky第三方模块(如 nginx-sticky-module),它不依赖 ip_hash 却实现会话保持,需单独卸载或禁用
重载配置并验证清除效果
执行以下操作确保变更生效:
- 运行
nginx -t校验语法无误 - 执行
nginx -s reload平滑重载 - 观察访问日志中
$upstream_addr字段:多次请求同一客户端 IP,应轮流向不同后端出现,而非固定某一台 - 可临时用 curl + 不同本地 IP(如改 host、换设备)发起请求,确认分配不再绑定源地址
注意旧策略残留的常见误区
清理不是只改配置文件就结束,还要留意这些隐性依赖:
- 如果之前启用了
set_real_ip_from和real_ip_header,它们本身不触发哈希,但若未清理,可能让后续其他策略误读 IP,建议按需保留或同步调整 - 某些运维脚本或 Ansible Playbook 可能硬编码了
ip_hash,需检查自动化部署链路 - CDN 或 WAF 后面的 Nginx 若仍配着 ip_hash,而上游又做了清理,会导致前后端策略错位,务必逐层核对











