nginx使用ip_hash后,同一客户端访问 都是同一个线路,未负载均衡
    文章作者:恒爱网络 阅读次数:2360 发布时间:2021-11-22

    如下图所示,上面名为service的upstream,包含的网站没有用到session,所以没有加ip_hash,负载是起作用的,请求能分发到不同的服务器中。

    下面名为pub-service的upstream,包含的网站有用到session,所以需要增加ip_hash,来解决每次请求session不一致的问题。但是增加ip_hash后,所有请求都分发到了一台服务器上了,也就是说,另外的服务器是闲置的,没有起到负载均衡的作用。



    查了一下ip_hash的原理,原来ip_hash的原理是截取访问者ip地址的前三段进行hash运算,如果结果相同,那么就一直定位到一个分发服务器上,所以没有负载分担的效果。


    静态调度算法

      rr轮询(默认调度算法)

                       按照客户端请求顺序把客户端的请求逐一分配到不同后端节点服务器

        wrr权重轮序

                     在rr轮询算法的基础上加上权重,权重值越大,别转发的请求越多,可以根据服务器状态进行指定权重值大小

          ip_hash

                     每个请求按照客户端IP的hash结果分配,新的请求到达时,先将客户端IP通过哈希算法哈希出一个值,在随后的的客户端请求中,客户IP的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页的session共享问题,但是会导致请求分配不均

          (在upstream里配置,如果是ip_hash,不能有weight和bakcup)

    解决方案,

    要么更换成其他的调度算法 

    要么修改 nigix 的源码不让用前3段来判断。

    进入nginx目录下的src/http/modules/ngx_http_upstream_ip_hash_module.c文件  

    查找 iphp->addrlen = 3;

    改为  iphp->addrlen = 4;

    注意有多个行需要修改。

    重新编译即可。