本文由秀依林楓提供友情贊助,首發(fā)于爛泥行天下。
今天我們來(lái)學(xué)習(xí)下有關(guān)nginx的負(fù)載均衡配置。nginx的負(fù)載均衡是通過(guò)nginx的upstream模塊和PRoxy_pass反向代理來(lái)實(shí)現(xiàn)的。
說(shuō)明:有三臺(tái)服務(wù)器,前端的A服務(wù)器使用nginx進(jìn)行負(fù)載均衡配置。后端是兩臺(tái)配置的相同服務(wù)器,以訪問(wèn)a.ilanni.com這個(gè)域名為例。結(jié)構(gòu)圖,如下:

A服務(wù)器對(duì)外(公網(wǎng))開(kāi)放80端口,B、C服務(wù)器就是兩臺(tái)配置相同的服務(wù)器。B服務(wù)器開(kāi)放8080端口,C服務(wù)器開(kāi)放8090端口。當(dāng)客戶端訪問(wèn)a.ilanni.com域名時(shí),A服務(wù)器根據(jù)nginx的upstream模塊相應(yīng)策略進(jìn)行分配客戶端訪問(wèn)到B服務(wù)器還是C服務(wù)器。
注意B服務(wù)器和C服務(wù)器內(nèi)容是相同的。但是在此,我們?yōu)榱丝吹綄?shí)驗(yàn)效果,我在B、C服務(wù)器配置了不同的內(nèi)容。B服務(wù)器的默認(rèn)頁(yè)面現(xiàn)實(shí)的內(nèi)容為:The Server is web1_192.168.1.249:8080。C服務(wù)器的默認(rèn)頁(yè)面現(xiàn)實(shí)的內(nèi)容為:The Server is web2_192.168.1.249:8090。如下:

nginx負(fù)載均衡的默認(rèn)是使用輪詢方式進(jìn)行分配的,而且默認(rèn)的權(quán)重為1,并且權(quán)重越大被訪問(wèn)的幾率越大。
我們先配置A服務(wù)器的nginx,如下:
cat /usr/local/nginx/conf/nginx.conf|grep -v ^#|grep -v ^$
upstream a.ilanni.com {
server 192.168.1.248:8080;
server 192.168.1.249:8090;
}
location / {
proxy_pass http://a.ilanni.com;
proxy_set_header Host $host;
proxy_set_header X-Real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

注意上圖中,標(biāo)記出來(lái)的第一部分。其中upstream就是做負(fù)載均衡使用的。http://a.ilanni.com;就是我們要訪問(wèn)的域名,通過(guò)proxy_pass反向代理到upstream下的服務(wù)器中。
第二部分就是我們要反向代理的域名,注意在此我們監(jiān)聽(tīng)的是80端口,而且這個(gè)server標(biāo)簽中,我并沒(méi)有配置server_name。其實(shí)配置server_name也是可以的,不過(guò)最后的效果是一樣的,這個(gè)是經(jīng)過(guò)測(cè)試的。
第三部分,在此我配置的就是一個(gè)虛擬主機(jī)。監(jiān)聽(tīng)的是8080端口,并且在此我也配置了server_name。這個(gè)主要是為了做對(duì)比使用的。
我們現(xiàn)在先啟動(dòng)A服務(wù)器的nginx,并且訪問(wèn)a.ilanni.com:8080。如下:

可以看到目前A服務(wù)器的nginx已經(jīng)可以正常訪問(wèn)了。注意我們?cè)诖嗽L問(wèn)的是http://a.ilanni.com:8080。
現(xiàn)在開(kāi)始配置B、C服務(wù)器的nginx,配置內(nèi)容如下:


B、C服務(wù)器的nginx配置完畢后,我們現(xiàn)在來(lái)啟動(dòng)各自的nginx服務(wù)并訪問(wèn),如下:

通過(guò)上圖,我們可以看到B、C服務(wù)器的nginx已經(jīng)正常訪問(wèn)了。那么我現(xiàn)在來(lái)訪問(wèn)http://a.ilanni.com看看能不能達(dá)到我們所要的效果。如下:

可以看到我們現(xiàn)在訪問(wèn)http://a.ilanni.com已經(jīng)反向代理到upstream下的B服務(wù)器,并且現(xiàn)在顯示的是B服務(wù)器的內(nèi)容。
再次刷新頁(yè)面,顯示如下:

刷新頁(yè)面后,你會(huì)發(fā)現(xiàn)這次顯示的是C服務(wù)器的內(nèi)容。也說(shuō)明http://a.ilanni.com已經(jīng)反向代理到C服務(wù)器上。
你可以多次刷新頁(yè)面,會(huì)發(fā)現(xiàn)顯示的內(nèi)容是B、C服務(wù)器交替出現(xiàn)。
為什么會(huì)是這樣呢?
其實(shí)在文章前面,我已經(jīng)介紹了nginx的upstream負(fù)載均衡,在沒(méi)有其他配置的情況默認(rèn)使用的策略是輪詢方式的,而且默認(rèn)的權(quán)重為1。
也就是說(shuō):upstream a.ilanni.com {
server 192.168.1.248:8080;
server 192.168.1.249:8090;
}
中B、C服務(wù)器的默認(rèn)權(quán)重都是一樣為1。那么在nginx輪詢時(shí),所以B、C服務(wù)器會(huì)交替出現(xiàn)。
如果我們現(xiàn)在把B服務(wù)器的權(quán)重設(shè)置為5,C服務(wù)器還是使用默認(rèn)看看實(shí)際情況。配置如下:
upstream a.ilanni.com {
server 192.168.1.248:8080 weight=5;
server 192.168.1.249:8090;
}

再次訪問(wèn)http://a.ilanni.com,首先顯示的還是B服務(wù)器的內(nèi)容。然后刷新,你會(huì)發(fā)現(xiàn)大約大約刷新了5次左右,才會(huì)顯示C服務(wù)器的內(nèi)容。這就權(quán)重的作用,服務(wù)器的權(quán)重?cái)?shù)值越高,被分配到客戶端的請(qǐng)求次數(shù)越多。
注意以上實(shí)驗(yàn),我們是在A、B、C服務(wù)器是在同一個(gè)局域網(wǎng),對(duì)公網(wǎng)來(lái)說(shuō)只是開(kāi)放了A服務(wù)器的80端口。如果這三臺(tái)服務(wù)器全部是公網(wǎng)IP的話,那就是我們下篇文章要介紹的內(nèi)容了,有關(guān)nginx反向代理的使用。
到此,有關(guān)nginx的負(fù)載均衡我們基本上介紹完畢后。下面在輔助介紹下,nginx的upstream目前支持以下幾種方式的分配:
1)、輪詢(默認(rèn)) 每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動(dòng)剔除。
2)、weight 指定輪詢幾率,weight和訪問(wèn)比率成正比,用于后端服務(wù)器性能不均的情況。設(shè)置服務(wù)器的權(quán)重,權(quán)重?cái)?shù)值越高,被分配到客戶端的請(qǐng)求次數(shù)越多,默認(rèn)值為1。
3)、ip_hash 每個(gè)請(qǐng)求按訪問(wèn)IP的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
4)、fair(第三方) 按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。
5)、url_hash(第三方)按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
|
新聞熱點(diǎn)
疑難解答
圖片精選