IP Hash 按 upstream 分组生效,需为有状态接口(如 /api/cart/)单独配置带 ip_hash 的 upstream,无状态接口(如 /api/product/)用轮询,再通过 location 路由隔离;同时须用 real_ip 模块还原真实客户端 IP,避免代理覆盖导致哈希失效。

IP Hash 在多接口业务中不是“全局开关”,而是按 upstream 分组生效的策略,关键在于合理划分 upstream 块与接口路由逻辑。它不保证所有接口都绑定同一台后端,但能确保同一客户端对同一业务路径的请求始终落在同一节点——这对登录态、购物车、实时消息等有状态交互至关重要。
明确适用边界:不是所有接口都需要 IP Hash
多接口业务通常混合无状态和有状态操作。比如一个电商 API 服务包含:
- /api/product/list(商品列表)→ 无状态,适合轮询或加权轮询
- /api/cart/add(添加购物车)→ 有状态,需会话一致性,适合 IP Hash
- /api/order/submit(提交订单)→ 强依赖用户会话和库存状态,必须与购物车同节点处理
若整个 upstream 统一启用 ip_hash,会导致商品接口也失去负载分散能力,反而降低吞吐。正确做法是为不同语义的接口定义独立 upstream。
按业务域拆分 upstream,精准启用 IP Hash
在 nginx.conf 中为有状态接口单独声明带 ip_hash 的 upstream:
upstream cart_backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
<p>upstream product_backend {</p><h1>默认轮询,无需 ip_hash</h1><pre class="brush:php;toolbar:false;">server 192.168.1.20:8080;
server 192.168.1.21:8080;}
再通过 location 匹配路由到对应 upstream:
location /api/cart/ {
proxy_pass https://www.php.cn/link/55ca0f8cf5f3a2502642c73952910b88;
proxy_set_header X-Real-IP $remote_addr;
}
<p>location /api/order/ {
proxy_pass <a href="https://www.php.cn/link/55ca0f8cf5f3a2502642c73952910b88">https://www.php.cn/link/55ca0f8cf5f3a2502642c73952910b88</a>; // 共用同一组,保障会话连续性
}</p><p>location /api/product/ {
proxy_pass <a href="https://www.php.cn/link/00afb001d1072e57f9a488c65e5b1947">https://www.php.cn/link/00afb001d1072e57f9a488c65e5b1947</a>;
}
</p>
这样既隔离了流量,又避免了跨域状态错乱。
注意真实客户端 IP 的准确性
IP Hash 依赖 $remote_addr 计算哈希值。如果前端有 CDN、WAF 或代理层,$remote_addr 会变成中间节点 IP(如 10.0.0.1),导致大量用户被哈希到同一后端,失去均衡效果。
务必配合以下配置还原真实 IP:
- 确保上游设备(如 CDN)透传 X-Forwarded-For 头
- 在 nginx 中启用 real_ip 模块,并配置 trusted 地址段:
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Forwarded-For; - 将 ip_hash 逻辑基于 $remote_addr(此时已被 real_ip 模块修正)
规避 NAT 和动态 IP 导致的哈希漂移
企业内网、运营商 NAT、移动网络下,多个用户可能共享同一出口 IP;而单个用户切换 Wi-Fi/4G 时 IP 也会变化。这会使 IP Hash 出现“误绑定”或“会话中断”。
应对建议:
- 对强一致性要求极高的接口(如支付回调),改用 token 或 session ID 做一致性哈希(需自定义 hash 指令,如 hash $cookie_sessionid;)
- 结合后端 session 共享方案(Redis 存储 session)降低对 IP 绑定的依赖
- 在 upstream 中为每台 server 添加 max_fails=2 fail_timeout=30s,提升故障转移可靠性











