ip hash的核心作用是确保同一客户端ip的所有请求始终路由至同一台后端服务器,从而实现会话保持;其原理是对ipv4取前三段、ipv6取前64位哈希后取模定位服务器,但服务器增减会导致会话漂移,且依赖真实ip透传。

IP Hash 的核心作用是让同一客户端 IP 的所有请求始终落到同一台后端服务器上,从而避免因服务节点切换导致的会话丢失。它不靠外部存储或复杂协调,而是用确定性哈希实现“请求处理一致性”——只要输入不变、规则不变,输出就固定。
哈希输入有明确范围
IPv4 地址取前三个字节参与计算(如 192.168.1.x 全部视为同一组),不是完整四段;IPv6 默认只用前 64 位,而非整个地址。这意味着: - 同一局域网内多个终端可能被映射到同一后端 - 双栈环境下 IPv4 和 IPv6 用户即使来自同一设备,也可能分到不同节点
映射结果稳定但不弹性
哈希值对后端服务器数量取模,得到固定索引。只要 upstream 列表没变、服务器状态没变,同一个 IP 就永远打到同一台 server。但这也带来刚性问题: - 增删任一 server,所有哈希结果重算,大量用户会话中断 - 无法设置 weight,强性能机器不能多分流量 - 某台 server 标记为 down 时,其原分配的 IP 会重新散列到剩余节点,但不会自动“漂移”过去
真实请求 IP 必须准确传递
如果前端有 CDN、WAF 或代理层,$remote_addr 会变成中间节点 IP,导致哈希失效。必须确保: - 使用 X-Real-IP 或 X-Forwarded-For 获取原始 IP - 在 proxy_set_header 中正确透传,并在 ip_hash 前确认该变量已赋值 - 若用 $http_x_forwarded_for,需注意多级代理时取最左有效 IP
故障时行为可预期但需配合
ip_hash 本身不主动踢除故障节点,但能响应健康检查配置: - 配置 max_fails 和 fail_timeout 后,连续失败会临时屏蔽该 server - 屏蔽期间,原属该节点的 IP 请求将返回 502,不会自动 fallback 到其他节点 - 可手动加 backup 标识备用机,在主节点全宕时承接流量











