nginx淺談之負載均衡

nginx淺談之負載均衡

nginx負載均衡

一、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會為其創建臨時文件。

三、負載均衡

配置語法: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的端口是事先在配置文件裡配置好的。例如如下的配置。


nginx淺談之負載均衡


然後,我們訪問我們的主機地址,然後不斷的刷新,會發現出來每個端口出來的頁面信息。默認的負載均衡採用的是輪詢的方式。

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

upstream mydomain.com{
 server 47.95.242.167:80;
 server 47.95.242.168:80;
 server 47.95.242.169: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的方式分配


分享到:


相關文章: