本文由秀依林楓提供友情贊助,首發於爛泥行天下

今天我們來學習下有關nginx的負載均衡配置。nginx的負載均衡是通過nginx的upstream模組和proxy_pass反向代理來實現的。

說明:有三臺伺服器,前端的A伺服器使用nginx進行負載均衡配置。後端是兩臺配置的相同伺服器,以訪問a.ilanni.com這個域名為例。結構圖,如下:

A伺服器對外(公網)開放80埠,B、C伺服器就是兩臺配置相同的伺服器。B伺服器開放8080埠,C伺服器開放8090埠。當客戶端訪問a.ilanni.com域名時,A伺服器根據nginx的upstream模組相應策略進行分配客戶端訪問到B伺服器還是C伺服器。

注意B伺服器和C伺服器內容是相同的。但是在此,我們為了看到實驗效果,我在B、C伺服器配置了不同的內容。B伺服器的預設頁面現實的內容為:The Server is web1_192.168.1.249:8080。C伺服器的預設頁面現實的內容為:The Server is web2_192.168.1.249:8090。如下:

nginx負載均衡的預設是使用輪詢方式進行分配的,而且預設的權重為1,並且權重越大被訪問的機率越大。

我們先配置A伺服器的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;

}

注意上圖中,標記出來的第一部分。其中upstream就是做負載均衡使用的。http://a.ilanni.com;就是我們要訪問的域名,通過proxy_pass反向代理到upstream下的伺服器中。

第二部分就是我們要反向代理的域名,注意在此我們監聽的是80埠,而且這個server標籤中,我並沒有配置server_name。其實配置server_name也是可以的,不過最後的效果是一樣的,這個是經過測試的。

第三部分,在此我配置的就是一個虛擬主機。監聽的是8080埠,並且在此我也配置了server_name。這個主要是為了做對比使用的。

我們現在先啟動A伺服器的nginx,並且訪問a.ilanni.com:8080。如下:

可以看到目前A伺服器的nginx已經可以正常訪問了。注意我們在此訪問的是http://a.ilanni.com:8080

現在開始配置B、C伺服器的nginx,配置內容如下:

B、C伺服器的nginx配置完畢後,我們現在來啟動各自的nginx服務並訪問,如下:

通過上圖,我們可以看到B、C伺服器的nginx已經正常訪問了。那麼我現在來訪問http://a.ilanni.com看看能不能達到我們所要的效果。如下:

可以看到我們現在訪問http://a.ilanni.com已經反向代理到upstream下的B伺服器,並且現在顯示的是B伺服器的內容。

再次重新整理頁面,顯示如下:

重新整理頁面後,你會發現這次顯示的是C伺服器的內容。也說明http://a.ilanni.com已經反向代理到C伺服器上。

你可以多次重新整理頁面,會發現顯示的內容是B、C伺服器交替出現。

為什麼會是這樣呢?

其實在文章前面,我已經介紹了nginx的upstream負載均衡,在沒有其他配置的情況預設使用的策略是輪詢方式的,而且預設的權重為1。

也就是說:upstream a.ilanni.com {

server 192.168.1.248:8080;

server 192.168.1.249:8090;

}

中B、C伺服器的預設權重都是一樣為1。那麼在nginx輪詢時,所以B、C伺服器會交替出現。

如果我們現在把B伺服器的權重設定為5,C伺服器還是使用預設看看實際情況。配置如下:

upstream a.ilanni.com {

server 192.168.1.248:8080 weight=5;

server 192.168.1.249:8090;

}

再次訪問http://a.ilanni.com,首先顯示的還是B伺服器的內容。然後重新整理,你會發現大約大約重新整理了5次左右,才會顯示C伺服器的內容。這就權重的作用,伺服器的權重數值越高,被分配到客戶端的請求次數越多。

注意以上實驗,我們是在A、B、C伺服器是在同一個區域網,對公網來說只是開放了A伺服器的80埠。如果這三臺伺服器全部是公網IP的話,那就是我們下篇文章要介紹的內容了,有關nginx反向代理的使用。

到此,有關nginx的負載均衡我們基本上介紹完畢後。下面在輔助介紹下,nginx的upstream目前支援以下幾種方式的分配:

1)、輪詢(預設) 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

2)、weight 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。設定伺服器的權重,權重數值越高,被分配到客戶端的請求次數越多,預設值為1。

3)、ip_hash 每個請求按訪問IP的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

4)、fair(第三方) 按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

5)、url_hash(第三方)按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。