写点什么

Nginx 实现在局域网内真正的 ip_hash 负载均衡​

用户头像
会飞的猪
关注
发布于: 2021 年 01 月 21 日

一、问题说明:

Nginx 的 IP Hash 是使用 C 网段进行 HASH 值计算,即 IP4 的前三段。那么同一局域网的所有机器都会路由到一个应用服务器。


  • 为什么无法实现在同一局域网内 ip_hash 负载均衡说明

在同一个局域网中,大多数情况下我们在同一局域网内的所有机器 IP 前 3 位都是相同的,假设都为 192.168.1.xxx。

根据官方的解析(参考网上大神的说法)

This directive causes requests to be distributed between upstreams based on the IP-address of the client.

The key for the hash is the class-C network address or the entire IPv6-address of the client. IPv6 is supported for ip_hash since 1.3.2 or 1.2.2. This method guarantees that the client request will always be transferred to the same server. But if this server is considered inoperative, then the request of this client will be transferred to another server. This gives a high probability clients will always connect to the same server. (简译:将客户端 ip 转化成 C 类网络地址,然后将该网络地址当作 hash 关键字,来保证这个客户端请求总是被转发到一台服务器上)


由此可以知道 ip_hash 是用 C 类 IP 地址的前 3 位网络号码进行 hash 计算的。

(C 类 IP 地址是指在 IP 地址的四段号码中,前三段号码为网络号码,剩下的一段号码为本地计算机的号码,解析来自百度百科),由于我们在同一局域网内,ip 地址的前 3 位都是一样的,不管你是那台客服端发送的请求,hash 计算出来的值都是一样的,所以所有的请问访问都会打在同一个服务器上,导致没有实现真正的负载均衡!


二、解决方案:

参考:https://www.manongdao.com/article-2417203.html

修改 nginx 目录下的 src/http/modules/ngx_http_upstream_ip_hash_module.c 文件,实现 Nginx 在局域网内真正的 ip_hash 负载均衡。


修改 iphp->addrlen 长度(一共有 3 处地方需要修改),修改内容如下:



三、部署说明

使用“https://gitee.com/zhuweifly/nginx-1.12.2”源码重新安装 Nginx。


发布于: 2021 年 01 月 21 日阅读数: 37
用户头像

会飞的猪

关注

还未添加个人签名 2008.12.14 加入

还未添加个人简介

评论

发布
暂无评论
Nginx实现在局域网内真正的ip_hash负载均衡​