1. 程式人生 > >基於Nginx的負載均衡

基於Nginx的負載均衡

一、Nginx反向代理

nginx的代理過程,客戶端請求到達nginx代理伺服器,nginx伺服器並不對請求做應答處理,而是判斷請求型別,並將請求合理的排程到後端伺服器,由後端伺服器隊請求做處理,處理完畢在經由nginx代理伺服器返回給客戶端。後端伺服器可在遠端也可在本地,也可以是nginx伺服器內部定義的其他虛擬主機。這些接收nginx轉發的伺服器被稱為上游(upstream)。

使用nginx做代理的目的之一是擴充套件基礎架構的規模。nginx可以處理大量併發連線,請求到來後,nginx可將其轉發給任意數量的後臺伺服器進行處理,這等於將負載均衡分散到整個叢集。

語法:proxy_pass URL


說明:URL的形式可以如下:http://location:8000/uri/ 等,可在location中進行配置。
例子:下面是一個簡單的代理到本機其他埠的示例

在80埠監聽的目錄下沒有test_proxy的檔案,但在8080埠監聽目錄下有,在80埠的server裡面新增如下內容:

location ~ /test_proxy.html$ {
proxy_pass http://127.0.0.1:8080;
}

然後在瀏覽器上輸入http://IP地址/test_proxy.html,會出現請求的資訊,實際上是80埠轉發給了8080埠並把資料請求了回來。

二、緩衝

nginx也提供了緩衝的機制,用於提高效能。沒有緩衝的情況下,資料直接從後端伺服器傳送給客戶端。緩衝的作用是在nginx上臨時儲存來自後端伺服器的處理結果,從而可以提早關閉nginx到後端的連線,減少IO的損耗。一般內容存放在記憶體當中,但當內容過多,造成的記憶體不夠時,會把內容存放在臨時檔案目錄下。下面是一些常用的緩衝的配置項,可以再http、server和location內容塊下。

proxy_buffering:控制本內容塊下是否啟用緩衝,預設是"on"
proxy_buffers:有兩個引數,第一個控制緩衝區請求數量,第二個控制緩衝區大小。預設值為8個、一頁(一般是4k或8k)。這個值越大,緩衝的內容越多。
proxy_buffer_size:後端回覆結果的首段(包含header的部分)是單獨緩衝的,此配置就是配置這部分緩衝區的大小。這個值預設與proxy_buffer的值相同,我們可以把它設定得小一些,因為header內容一般比較少。
proxy_busy_buffers_size:設定被標記為"client-ready"(客戶端就緒)的緩衝區大小。客戶端一次只能從一個緩衝讀取資料,而緩衝是按照佇列次序被分批發送給客戶端的。此語法配置的就是這個佇列的大小。
proxy_temp_path

:定義nginx儲存臨時檔案路徑。
proxy_max_temp_file_size:每個請求可以儲存臨時檔案的目錄大小。如果上游發來的結果太大以至於無法放入一個緩衝,則nginx會為其建立臨時檔案。

三、負載均衡

Nginx負載均衡示意圖
在這裡插入圖片描述
配置語法:upstream name {.......}
說明:name是自定義的一個名字,而{}則是需要定義的內容,只能在http塊定義,不能在server塊裡定義。定義完之後可在location塊下寫入如下程式碼進行呼叫:http://name

例子:由於伺服器數量的限制,此處我們是用一臺伺服器的不同的埠來模擬負載均衡,當然,多臺的配置也是類似的。

在server塊內加入如下程式碼:

upstream test {
#ip_hash 
server IP:8001; 
server IP:8002; 
server IP:8003;
}

然後,在http塊內的location中加入如下內容:

location / {#設定主機頭和客戶端真實地址,以便伺服器獲取客戶端真實IP proxy_set_header Host $http_host; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_connect_timeout 30;#設定連線超時時間為30s 
proxy_send_timeout 60; proxy_read_timeout 60; 
proxy_buffer_size 32k; #設定緩衝區大小 
proxy_buffering on; #開啟緩衝區 
proxy_buffers 4 128k; #設定緩衝區的數目和大小 
proxy_busy_buffers_size 256k; #設定客戶端就緒緩衝區大小 proxy_max_temp_file_size 256k; 
proxy_pass http://test; #呼叫上面設定的負載均衡 
}

當然,得提醒一下,我們設定的IP的埠是事先在配置檔案裡配置好的。例如如下的配置。

在這裡插入圖片描述

然後,我們訪問我們的主機地址,然後不斷的重新整理,會發現出來每個端口出來的頁面資訊。預設的負載均衡採用的是輪詢的方式。

如果是用的不同的伺服器進行負載均衡的話,只需稍稍改改,就例如如下配置:

upstream mydomain.com{
server 10.220.5.111:80; 
server 10.220.5.112:80; 
server 10.220.5.113:80;
}

配置完之後呢,剩下的在http裡的程式碼和上面的相似,然後在其他的三個伺服器那裡進行如下配置。當然,我們還得在那三個伺服器那裡的防火牆進行設定。

server{
listen 80; 
server_name www.mydomain.com; 
index index.htm index.php index.html; 
root 目錄路徑;
}

①後端伺服器在負載均衡排程中的狀態
dowm:當前的server暫時不參與負載均衡。
backup:預留的備份伺服器。
max_fails:允許請求失敗的次數。
fail_timeout:經過max_fails失敗後,伺服器暫停的時間。
max_conns:限制最大的接收連線數。

注:以上的配置都是在upstream的時候配置的,例如在{}裡面加入的server IP:8001 dowm,就表示這個服務是不參與負載均衡的,用來做備 份的,以上配置都是寫在服務的後面。

②排程演算法
輪詢:按時間順序逐一分配到不同的後端伺服器。
加權輪詢:可在配置的server後面加個weight=number,number值越高,分配的概率越大。
ip_hash:每個請求按訪問IP的hash分配,這樣來自同一IP固定訪問一個後臺伺服器。
least_hash:最少連結數,哪個機器連線數少就發分發給哪個機器。
url_hash:按訪問的url的hash結果分配請求,是每個url定向到同一後端伺服器上。
hash關鍵值:hash自定義的key。

注:排程演算法在設定upstream中配置,例如在此大括號裡面寫入ip_hash表示使用ip_hash的方式分配。

------做運維之前很矯情的小年輕-----