ip hash 实现基于客户端 ip 的稳定路由,通过哈希一致性实现请求与后端节点的长期绑定,其“精准”指映射关系可预测、可复现,而非智能调度或负载感知。

IP Hash 实现的是“基于客户端 IP 的稳定路由”,不是绝对精准的业务级调度,而是通过哈希一致性达成请求与后端节点的长期绑定。它的“精准”体现在可预测、可复现的映射关系,而非智能决策或负载感知。
哈希计算规则决定路由稳定性
IP Hash 的核心在于哈希输入和取模逻辑:
- IPv4 地址默认取前三个字节(如 192.168.1.100),忽略最后一个字节,降低内网 NAT 下的抖动影响
- IPv6 使用完整地址参与哈希,避免子网内地址散列失真
- 哈希值对当前 upstream 中**存活服务器数量**取模,结果直接对应 server 列表索引(从 0 开始)
- 只要后端列表不变、客户端 IP 不变,哈希结果就恒定——这是“精准绑定”的根本保障
真实 IP 是精准调度的前提
如果请求经过 CDN、WAF 或多层代理,$remote_addr 默认是上一跳地址,所有请求会被哈希到同一台后端,彻底失效。
- 必须启用 real_ip_module,用 set_real_ip_from 明确声明可信代理网段
- 配合 real_ip_header X-Forwarded-For 提取原始客户端 IP
- 在 proxy_pass 前确保 X-Real-IP 和 X-Forwarded-For 正确透传
配置写法直接影响是否生效
ip_hash 对语法和上下文极其敏感,稍有偏差就会静默降级为轮询:
- 必须放在 upstream 块第一行,不能缩进,不能换行空格
- upstream 内至少定义两台 server;单节点或仅 localhost 会导致 Nginx 启动报错或忽略 ip_hash
- server 行只写 IP:PORT,不加 http://、路径或协议头
- 禁止与 weight、backup、down 等参数共存,否则配置校验失败
节点变更会破坏原有精准性
所谓“精准”依赖静态拓扑。一旦后端列表发生变化,哈希映射整体偏移:
- 新增一台 server → 模数变大 → 原有大部分 IP 映射目标改变
- 下线一台 server(未标记 down)→ 模数变小 → 所有哈希结果重分布
- 仅当某台 server 显式配置 down 或触发 max_fails+fail_timeout 被自动剔除时,剩余节点才维持原有哈希秩序











