Nginx在局域網(wǎng)內(nèi)實(shí)現(xiàn)真正的ip_hash負(fù)載均衡
遇到的問(wèn)題
本人在以前公司的局域網(wǎng)內(nèi)搭載Nginx負(fù)載均衡的時(shí)候發(fā)現(xiàn)使用ip_hash實(shí)現(xiàn)負(fù)載均衡會(huì)發(fā)生一個(gè)奇怪的顯現(xiàn)湿酸,所有客戶端的請(qǐng)求訪問(wèn)都打在了同一個(gè)服務(wù)器上荧缘!
這使得負(fù)載均衡根本就沒(méi)有起到任何作用撬陵,本人查閱了相關(guān)資料最終發(fā)現(xiàn)解決方法切厘,多謝網(wǎng)上的各位大神,參考文獻(xiàn)在最后說(shuō)明懊缺。
為什么無(wú)法實(shí)現(xiàn)在同一局域網(wǎng)內(nèi)ip_hash負(fù)載均衡說(shuō)明
在同一個(gè)局域網(wǎng)中疫稿,大多數(shù)情況下我們?cè)谕痪钟蚓W(wǎng)內(nèi)的所有機(jī)器IP前3位都是相同的,假設(shè)都為192.168.1.xxx鹃两。
根據(jù)官方的解析(參考網(wǎng)上大神的說(shuō)法)
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. (簡(jiǎn)譯:將客戶端ip轉(zhuǎn)化成C類網(wǎng)絡(luò)地址遗座,然后將該網(wǎng)絡(luò)地址當(dāng)作hash關(guān)鍵字,來(lái)保證這個(gè)客戶端請(qǐng)求總是被轉(zhuǎn)發(fā)到一臺(tái)服務(wù)器上)
由此可以知道ip_hash是用C類IP地址的前3位網(wǎng)絡(luò)號(hào)碼進(jìn)行hash計(jì)算的俊扳。
(C類IP地址是指在IP地址的四段號(hào)碼中途蒋,前三段號(hào)碼為網(wǎng)絡(luò)號(hào)碼,剩下的一段號(hào)碼為本地計(jì)算機(jī)的號(hào)碼,解析來(lái)自百度百科)
到此問(wèn)題就很明顯了馋记,由于我們?cè)谕痪钟蚓W(wǎng)內(nèi)号坡,ip地址的前3位都是一樣的,不管你是那臺(tái)客服端發(fā)送的請(qǐng)求梯醒,hash計(jì)算出來(lái)的值都是一樣的宽堆,所以所有的請(qǐng)問(wèn)訪問(wèn)都會(huì)打在同一個(gè)服務(wù)器上,導(dǎo)致沒(méi)有實(shí)現(xiàn)真正的負(fù)載均衡茸习!
修改ip_hash代碼算法中的取值畜隶,解決問(wèn)題
1.在我們下載好的Nginx按轉(zhuǎn)包中打開(kāi)壓縮包(以1.18.0版本為例子)
2.找到nginx目錄下的src/http/modules/ngx_http_upstream_ip_hash_module.c文件
3.打開(kāi)該文件,在180行左右會(huì)找到hash變量的賦值語(yǔ)句
4.修改iphp->addrlen長(zhǎng)度(一共有3處地方需要修改)
5.保存修改
在保存中xx.tar.gz文件不允許修改后直接保存号胚,360壓縮可以直接轉(zhuǎn)為zip保存籽慢,這個(gè)沒(méi)啥影響,如果不想轉(zhuǎn)為zip猫胁,可先解壓把ngx_http_upstream_ip_hash_module.c文件修改好后直接替換箱亿。
6.把重新編寫過(guò)的Nginx安裝在服務(wù)器上,這時(shí)候ip_hash在局域網(wǎng)內(nèi)客戶端發(fā)送請(qǐng)求就能實(shí)現(xiàn)真正的負(fù)載均衡杜漠,會(huì)發(fā)送到不同的服務(wù)器上极景。