博文精选 | Nginx 实现在局域网内真正的 ip_hash 负载均衡
2022-04-26 11:10:39
F5小安
文章速览:
行业:互联网
关键字:Nginx、局域网、ip_hash、负载均衡
摘要:Nginx 实现在局域网内真正的 ip_hash 负载均衡
阅读时长:3分钟
以下文章来源于InfoQ!作者:会飞的猪
一、问题说明:
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。
以上是针对在同一局域网内 ip_hash 负载均衡说明的分享,希望对大家有帮助!
声明:本文章版权归原作者及原出处所有 。凡本社区注明“来源:XXX或转自:XXX”的作品均转载自其它媒体,转载目的在于传递分享更多知识,内容为作者个人观点,仅供参考,并不代表本社区赞同其观点和对其真实性负责。本社区转载的文章,我们已经尽可能的对作者和来源进行了注明,若因故疏忽,造成漏注,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本社区拥有对此声明的最终解释权。
发布评论 加入社群
相关文章

博文精选 | nginx 性能优化 -- 配置解析
F5小安
2022-07-21 10:35:06 512

博文精选 | 漫画 Nginx 的 subfilter
F5小安
2022-05-27 13:57:18 410

博文精选 | 一篇文章搞定 Nginx 反向代理与负载均衡
F5小安
2022-05-26 10:31:14 917

回复评论
发布评论