Nginx在局域網內實作真正的ip_hash負載均衡
- 遇到的問題
- 本人在以前公司的局域網內搭載Nginx負載均衡的時候發現使用ip_hash實作負載均衡會發生一個奇怪的顯現,所有客戶端的請求訪問都打在了同一個服務器上!
- 這使得負載均衡根本就沒有起到任何作用,本人查閱了相關資料最終發現解決方法,多謝網上的各位大神,參考文獻在最后說明,
- 為什么無法實作在同一局域網內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計算出來的值都是一樣的,所以所有的請問訪問都會打在同一個服務器上,導致沒有實作真正的負載均衡!
- 修改ip_hash代碼演算法中的取值,解決問題
1.在我們下載好的Nginx按轉包中打開壓縮包(以1.18.0版本為例子)

2.找到nginx目錄下的src/http/modules/ngx_http_upstream_ip_hash_module.c檔案

3.打開該檔案,在180行左右會找到hash變數的賦值陳述句

4.修改iphp->addrlen長度(一共有3處地方需要修改)


5.保存修改
在保存中xx.tar.gz檔案不允許修改后直接保存,360壓縮可以直接轉為zip保存,這個沒啥影響,如果不想轉為zip,可先解壓把ngx_http_upstream_ip_hash_module.c檔案修改好后直接替換,
6.把重新撰寫過的Nginx安裝在服務器上,這時候ip_hash在局域網內客戶端發送請求就能實作真正的負載均衡,會發送到不同的服務器上,
如有不足之處請多多指出,
參考文章地址:https://blog.csdn.net/zhangjunli/article/details/81115323
參考文章地址:https://blog.csdn.net/yswknight/article/details/107180893
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/237106.html
標籤:其他
上一篇:野指標,陣列指標,指標陣列
下一篇:作業分配問題【回溯演算法】
