Nginx服务器ip_hash策略

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 服务器上发送一个请求

  • Nginx服务器ip_hash策略_第1张图片
    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的源码,我在之上加了些日志
    Nginx服务器ip_hash策略_第2张图片
    下面是 175服务器请求后nginx服务器日志截图
    Nginx服务器ip_hash策略_第3张图片

  • 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值。

Nginx服务器ip_hash策略_第4张图片

  • 获取后端服务器

如下代码分析,如果没有设置权重,那么就会走到if代码段, 通过上面求出的hash值 % 后端server个数得到一个值,这个值就是 upstream中server的索引

Nginx服务器ip_hash策略_第5张图片

总结:在IPV4 网络下、Nginx版本1.8.0, 轮询策略ip_hash
       1、指定客户端的ip对应的后端服务器是固定的
       2、ip地址前三段一样的客户端请求会路由到同一个后端服务器
       

你可能感兴趣的:(Nginx)