iphash(IP哈希)是负载均衡领域里最经典的会话保持方案之一。它的核心目标很明确:让来自同一个客户端IP的请求,始终被转发到同一台后端服务器上。这解决了一个非常实际的问题——当应用把用户登录状态、购物车数据保存在服务器本地内存或本地文件中时,如果负载均衡器把同一用户的请求随机分发到不同机器,用户就会莫名被登出。iphash通过“IP决定归属”的方式,让这种有状态部署依然能正常工作。下面我们从原理、配置、常见疑问三个层面把这个机制讲透。

iphash的工作原理:从哈希取模说起
iphash的底层逻辑可以用一句话概括:对客户端IP做哈希运算得到一个整数,再用这个整数对后端服务器数量取模,得到的结果就是目标服务器的编号。举个例子,假设有三台后端服务器,客户端IP经过哈希函数计算得到数值200,那么200 % 3 = 2,请求就会发给编号为2的那台服务器。只要服务器列表不变、哈希算法不变,这个IP的请求永远落在同一台机器上。
在nginx的实现中,ip_hash指令默认取的是客户端IP的前三个八位段参与计算,也就是说192.168.1.10和192.168.1.99会被认为是同一个来源。这个设计是有意为之的,因为在早期的网络环境中,同一个公司或校园网出口往往共享同一个C类网段,把整个网段哈希到同一台服务器,可以减少局域网内多用户请求分散的情况。但这也带来一个副作用:同一局域网内的所有用户都会被压到同一台后端上,如果这个局域网用户量大,负载就会严重不均。
还需要理解一点,iphash本质上是一种“确定性分发”而非“公平分发”。轮询(round robin)追求的是请求数量均等,least_conn追求的是连接数均衡,而iphash优先保证的是会话粘性。当后端某台服务器宕机被剔除出集群时,nginx会把原本发往该机器的请求按剩余服务器重新哈希分发,这个过程会造成部分用户的session丢失,这是取模类哈希的天然缺陷,后面我们会详细讨论。
nginx中ip_hash的配置方法与操作要点
配置iphash非常简单,只需要在upstream块中加入ip_hash指令即可。下面是一个典型的配置示例:
upstream backend {
ip_hash; # 开启IP哈希负载均衡
server 192.168.1.101:8080; # 后端服务器A
server 192.168.1.102:8080; # 后端服务器B
server 192.168.1.103:8080; # 后端服务器C
}
server {
listen 80;
server_name www.ipipp.com;
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}配置时有几个要点需要注意。第一,ip_hash指令必须写在server列表之前,写在后面会导致配置报错。第二,如果使用了多级代理,nginx拿到的客户端IP可能是上一级代理的IP而不是真实用户IP,此时需要结合real_ip_header和set_real_ip_from指令从X-Forwarded-For中还原真实IP,否则哈希的结果会失真——所有经过同一代理的请求都会被哈希到同一台服务器,负载均衡完全失效。
第三,权重参数weight在iphash模式下可以配合使用,但效果与轮询时不同。hash结果对权重求模后,权重高的机器会被分配到更多的哈希区间,从而承接更多不同的IP段。另外,如果希望手动控制某台服务器只接特定流量,可以用down参数临时摘除机器,被摘除机器上的IP会自动重新哈希到其他存活节点;backup参数标记的备份服务器只有在所有主服务器不可用时才会参与哈希计算。
iphash与其他负载均衡策略的对比
要真正理解iphash的适用场景,最好的方式是和其他常见策略放在一起比较。下面的表格概括了几种主流策略的核心差异:
| 策略 | 分发依据 | 会话保持 | 负载均匀度 | 适用场景 |
|---|---|---|---|---|
| 轮询(默认) | 请求顺序 | 无 | 高 | 无状态服务 |
| 加权轮询 | 请求顺序+权重 | 无 | 按机器性能分配 | 机器配置不均的无状态服务 |
| least_conn | 当前连接数 | 无 | 动态均衡 | 请求耗时差异大的场景 |
| ip_hash | 客户端IP哈希 | 有 | 受IP分布影响 | 有状态服务、session本地存储 |
| 一致性哈希 | key哈希+哈希环 | 有 | 较均匀 | 缓存代理、分布式存储 |
iphash负载均衡负载均衡原理nginx ip_hash修改时间:2026-09-13 21:57:11