
您好,我是湘王,這是我的51CTO博客,歡迎您來(lái),歡迎您再來(lái)~
除了反向代理,Nginx另一個(gè)主要的功能就是「負(fù)載均衡」。
【資料圖】
所謂負(fù)載均衡,就是將請(qǐng)求分?jǐn)偟蕉鄠€(gè)服務(wù)器上執(zhí)行,從而減輕單臺(tái)服務(wù)器的訪(fǎng)問(wèn)壓力。負(fù)載均衡一般都需要同時(shí)配置反向代理,通過(guò)反向代理跳轉(zhuǎn)到指定的服務(wù)器上。
Nginx目前支持自帶三種負(fù)載均衡策略,還有兩種常用的第三方策略。
先準(zhǔn)備好環(huán)境:
1、先安裝三臺(tái)Linux虛擬機(jī),每臺(tái)虛擬機(jī)上安裝好JDK環(huán)境(不想裝虛擬機(jī),docker也可以)
2、開(kāi)發(fā)一個(gè)最簡(jiǎn)單的SpringBoot應(yīng)用
3、分別部署到其中兩臺(tái)服務(wù)器上,一臺(tái)叫server01,一臺(tái)叫server02
4、另一臺(tái)服務(wù)器安裝Nginx,做負(fù)載均衡,叫做server03
在application.properties文件中增加:server.port=8080
修改啟動(dòng)類(lèi),排除數(shù)據(jù)源的自動(dòng)加載:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
增加Controller類(lèi):
打包應(yīng)用,并上傳到server02,啟動(dòng)應(yīng)用
java -jar nginx-0.0.1-SNAPSHOT.jar
修改Controller類(lèi)
打包應(yīng)用,并上傳到server03,啟動(dòng)應(yīng)用
java -jar nginx-0.0.1-SNAPSHOT.jar
訪(fǎng)問(wèn)server01和server02(或者docker)的地址:
http://172.16.185.130:8080/test?username=test1
http://172.16.185.131:8080/test?username=test1
使用Nginx的默認(rèn)方式,也就是輪詢(xún):每個(gè)請(qǐng)求按順序輪流地分配到不同的后端服務(wù)器。如果某些后端服務(wù)器宕機(jī)或離線(xiàn),也能自動(dòng)剔除。
修改配置:
重新加載Nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
訪(fǎng)問(wèn)server03的地址:http://172.16.185.136/test?username=test1
結(jié)果是:
第n次訪(fǎng)問(wèn)會(huì)返回「server02」
第n+1次訪(fǎng)問(wèn)會(huì)返回「server03」
或者相反。
說(shuō)明配置已生效。
現(xiàn)在給輪詢(xún)?cè)黾右幌聶?quán)重,避免平均主義:每個(gè)請(qǐng)求指定輪詢(xún)幾率,weight和訪(fǎng)問(wèn)比率成正比。這可以用于后端服務(wù)器性能不均的情況,如果某些后端服務(wù)器宕機(jī)或離線(xiàn),也能自動(dòng)剔除。
修改配置,增加weight關(guān)鍵字:
重新加載Nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
再訪(fǎng)問(wèn)server03:??http://172.16.185.136/test?username=test1??
連續(xù)訪(fǎng)問(wèn)多次的結(jié)果:
多數(shù)訪(fǎng)問(wèn)會(huì)返回「server02」
少數(shù)訪(fǎng)問(wèn)會(huì)返回「server03」
大概就是三七開(kāi),說(shuō)明配置已生效。
輪詢(xún)和權(quán)重的方式只能滿(mǎn)足無(wú)狀態(tài)的或者冪等的業(yè)務(wù)應(yīng)用。但很多時(shí)候業(yè)務(wù)需要滿(mǎn)足一個(gè)客戶(hù)只能訪(fǎng)問(wèn)一個(gè)服務(wù)器的條件因此,這種情況就需要采用iphash方式來(lái)分配后端服務(wù)器。
修改配置,增加ip_hash關(guān)鍵字:
重新加載Nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
再次訪(fǎng)問(wèn)server03:http://172.16.185.136/test?username=test1
連續(xù)訪(fǎng)問(wèn)多次的結(jié)果:如果每次訪(fǎng)問(wèn)都只返回了「server01」或者「server02」,則說(shuō)明配置已生效。
除了輪詢(xún)、權(quán)重和iphash,另外還可以通過(guò)第三方插件來(lái)設(shè)置負(fù)載均衡的方式:
如果需要按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求的話(huà),可以使用第三方插件fair。
1、下載地址:https://github.com/gnosek/nginx-upstream-fair
(或者h(yuǎn)ttps://www.nginx.com/resources/wiki/modules/index.html)
2、下載后解壓到/home/work/upstream-fair/
3、安裝時(shí)增加參數(shù):./configure --add-module=/home/work/upstream-fair/
4、錯(cuò)誤「"ngx_http_upstream_srv_conf_t"沒(méi)有名為"default_port"的成員」的解決辦法:
cd /home/work/upstream-fair/
Linux輸入:sed -i "s/default_port/no_port/g" ngx_http_upstream_fair_module.c
mac輸入:sed -i "" "s/default_port/no_port/g" ngx_http_upstream_fair_module.c
修改配置,將關(guān)鍵字ip_hash改為fair:
重新加載Nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
訪(fǎng)問(wèn)server03:http://172.16.185.136/test?username=test1
連續(xù)訪(fǎng)問(wèn)多次的結(jié)果:
有時(shí)返回「server02」
有時(shí)返回「server03」
既不是輪詢(xún)、也不是權(quán)重和ip,這說(shuō)明配置已生效。
另外一種第三方插件是「一致性hash」:它可以根據(jù)參數(shù)采取不同的方式,將請(qǐng)求均勻映射到后端服務(wù)器:
1、根據(jù)客戶(hù)端ip映射;
2、根據(jù)客戶(hù)端uri映射;
3、根據(jù)客戶(hù)端參數(shù)映射。
安裝插件:
1、下載:https://github.com/replay/ngx_http_consistent_hash
(或者h(yuǎn)ttps://www.nginx.com/resources/wiki/modules/index.html)
2、下載后解壓到/home/work/upstream-hash/
3、安裝時(shí)增加參數(shù):./configure --add-module=/home/work/upstream-hash/
4、修改配置,將關(guān)鍵字fair改為consistent_hash $request_uri
重新加載Nginx:
cd /usr/local/nginx/sbin/
./nginx -s reload
訪(fǎng)問(wèn)server03:http://172.16.185.136/test?username=test1
連續(xù)訪(fǎng)問(wèn)多次的結(jié)果:每次訪(fǎng)問(wèn)都只返回了「server01」或者「server02」
說(shuō)明配置已生效。
感謝您的大駕光臨!咨詢(xún)技術(shù)、產(chǎn)品、運(yùn)營(yíng)和管理相關(guān)問(wèn)題,請(qǐng)關(guān)注后留言。歡迎騷擾,不勝榮幸~
?