Nginx服务器ip_hash策略
注:本次ip_hash策略验证基于nginx-1.8.0版本
简介:当nginx服务器的upstream轮询策略配置为ip_hash的时候,nginx路由用户请求采用的是通过终端用户的IP地址路由(hash算法)到指定的后端服务器
下面基于一个请求结合nginx源码详细分析一下Nginx的Hash策略
基础介绍:
Nginx服务器:172.30.0.206
后端服务器: 172.30.0.98:30523
172.30.0.98:30059
upstream 轮询策略 ip_hash
本例旨在分析ip_hash策略
- 在172.30.0.175 服务器上发送一个请求
- curl -v http://172.30.0.206/TestWebApp/index nginx服务器接受到这个请求后通过ngx_http_upstream_ip_hash_module这个模块处理后端服务轮询,源码位置:src/ http/modules/ngx_http_upstream_ip_hash_module.c
下面是Nginx-1.8.0的源码,我在之上加了些日志
下面是 175服务器请求后nginx服务器日志截图 - hash算法,hash算法如下图
以上代码可以看出Nginx服务器循环iphp->addrlen次 做hash求值,而iphp-addrlen在Ipv4网络下默认为3,见下图。也就是说 循环三次最终算出一个hash值,每次循环获取一个ip段(iphp->[i]),由此得知如果ip地址固定,初始hash值固定那么最终的hash值也就确定。初始hash值是固定的见下图默认为89. 所以最终的hash值只和ip地址的前三段有关系,也就是说在通网段访问nginx得到的hash值是固定的。严格意义上说应该是ip前三段一样的都会得出同样的hash值。
- 获取后端服务器
如下代码分析,如果没有设置权重,那么就会走到if代码段, 通过上面求出的hash值 % 后端server个数得到一个值,这个值就是 upstream中server的索引
总结:在IPV4 网络下、Nginx版本1.8.0, 轮询策略ip_hash
1、指定客户端的ip对应的后端服务器是固定的
2、ip地址前三段一样的客户端请求会路由到同一个后端服务器