首頁 > 軟體

Nginx負載均衡之upstream模組簡介與使用詳解

2022-09-14 22:13:46

一、upstream模組簡介

Nginx的負載均衡功能依賴於ngx_http_upsteam_module模組,所支援的代理方式包括proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和grpc_pass。ngx_http_upstream_module模組有允許Nginx定義一組或多組服務組,使用的可以通過proxy_pass代理方式把網站的請求傳送到事先定義好的對應upstream組的名字上。upstream模組可以實現負載均衡,其實隱含了一個重要功能那就是冗餘,在一個web節點故障的時候,設定了upstream時可以自動切換到正常工作的節點。

二、負載均衡演演算法簡介

排程演演算法一般分為兩類:第一類為靜態排程演演算法,即負載均衡器根據自身設定的規則進行分配,不需要考慮後端節點伺服器的情。第二類為動態排程演演算法,即負載均衡器會根據後端節點的當前狀態來決定是否分發請求。

1、輪詢

rr 輪循即round robin 預設排程演演算法,靜態排程演演算法。使用者端請求順序把使用者端的請求逐一分配到不同的後端節點伺服器,這相當於 LVS 中的 rr 演演算法,如果後端節點伺服器宕機(預設情況下nginx 只檢測80埠)。宕機的伺服器會自動從節點伺服器池中剔除,以便使用者端的使用者存取不受影響。新的請求會分配給正產的伺服器。

2、權重輪詢

wrr即weight 權重輪循,靜態排程演演算法。在 rr 輪循演演算法的基礎上加上權重,即為權重輪循演演算法,當使用該演演算法時,權重和使用者存取成正比,權重值越大,被轉發的請求也就越多。可以根據伺服器的設定和效能指定權重值大小,有效解決新舊伺服器效能不均帶來的請求分配問題。

3、IP雜湊

ip_hash是靜態排程演演算法,每個請求按使用者端 IP 的 hash 結果分配,當新的請求到達時,先將其使用者端IP通過雜湊演演算法雜湊出一個值,在隨後的使用者端請求中,客戶 IP 的雜湊值只要相同,就會被分配至同一臺伺服器,該排程演演算法可以解決動態網頁的 session 共用問題,但有時會導致請求分配不均,即無法保證 1:1 的負載均衡,因為在國內大多數公司都是 NAT 上網模式,多個使用者端會對應一個外部 IP,所以,這些使用者端都會被分配到同一節點伺服器,從而導致請求分配不均。LVS 負載均衡的 -P 引數、keepalived 設定裡的 persistence_timeout 50 引數都類似這個 Nginx 裡的 ip_hash 引數,其功能均為解決動態網頁的 session 共用問題。

4、最小連線數

least_conn是動態排程演演算法,會根據後端節點的連線數來決定分配情況,哪個機器連線數少就分發。

5、最短響應時間

最短響應時間(fair)排程演演算法是動態排程演演算法,會根據後端節點伺服器的響應時間來分配請求,響應時間端的優先分配。這是更加智慧的排程演演算法。此種演演算法可以依據頁面大小和載入時間長短只能地進行負載均衡,也就是根據後端伺服器的響應時間來分配請求,響應時間短的優先分配。Nginx 本身是不支援 fair 排程演演算法的,如果需要使用這種排程演演算法,必須下載 Nginx 的相關模組 upstream_fair。

6、url_hash演演算法

url_hash演演算法是動態排程演演算法,按存取 URL 的 hash 結果來分配請求,使每個 URL 定向到同一個後端伺服器,可以進一步提高後端快取伺服器的效率命中率。(多用於後端伺服器為快取時的場景下)Nginx 本身是不支援 rul_hash的,如果需要使用這種排程演演算法,必須安裝 Nginx 的hash 模組軟體包。

三、設定範例

1、設定範例模板

upstream backend {
    server backend1.example.com       weight=5;  #執行realserver,可以賦權重
    server backend2.example.com:8080; 
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;  #backup表示該節點為熱備節點,啟用節點失效時啟用
    server backup2.example.com:8080   down;  #下線伺服器,可以在real伺服器需要維護時設定
}

server {
   listen	80;  #listen、server_name這些正常設定
   server_name	www.test.com;
    location / {
        proxy_pass http://backend;  ##反向代理執行定義的upstream名字
    }
}

2、權重輪詢設定範例

upstream  show {
        server 192.168.0.141 weight=1;
        server 192.168.0.142 weight=2; 
     }

3、ip_hash設定範例

 upstream show {
        ip_hash;
        server 192.168.0.141 ;
        server 192.168.0.142 ;
     }

4、fair設定範例

 upstream show {
        fair;
        server 192.168.0.141 ;
        server 192.168.0.142 ;
     }

5、least_conn設定範例

 upstream show {
        least_conn;
        server 192.168.0.141 ;
        server 192.168.0.142 ;
     }

6、url_hash設定範例

 upstream show {
        server 192.168.0.141 ;
        server 192.168.0.142 ;
        hash $request_uri;
        hash_method crc32;
     }

四、負載均衡效果展示

1、部署2個web伺服器

分別在s142主機和s142主機部署2個Tomcat服務,服務存取頁面內容如下:

2、設定nginx服務

upstream show {
    ip_hash ;  #使用ip_hash負載均衡排程演演算法
    server 192.168.10.141:8080 ;
    server 192.168.10.142:8080 ;
    }
server {
    listen	80;  #listen、server_name這些正常設定
    server_name	www.test.com;
    access_log /var/log/nginx/test.access.log;
    location / {
        proxy_pass http://show;  ##反向代理執行定義的upstream名字
    }
}

3、設定域名解析

這是模擬測試,使用測試域名,通過修改hosts檔案(C:WindowsSystem32driversetchosts)實現直接通過域名存取,實際應用需要申請域名並解析。

4、存取域名驗證

5、停止s142的web服務後再次存取

停止s142的web服務後應用自動切換到了s141節點,其實upstream模組可以作為負載均衡,更重要的是實現冗餘,如果是單機部署的web應用在出現節點故障時服務即無法存取,通過upstream可以實現多節點冗餘。

6、修改排程演演算法為輪詢

總結 

到此這篇關於Nginx負載均衡之upstream模組簡介與使用的文章就介紹到這了,更多相關Nginx負載均衡upstream模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com