Nginx 負載均衡是什麼以及該如何配置

什麼是負載均衡

負載均衡主要通過專門的硬件設備或者通過軟件算法實現。通過硬件設備實現的負載均衡效果好、效率高、性能穩定,但是成本比較高。通過軟件實現的負載均衡主要依賴於均衡算法的選擇和程序的健壯性。均衡算法也是多種多樣的,常見的有兩大類:即靜態負載均衡算法和動態負載均衡算法。靜態算法實現比較簡單,在一般網絡環境下也能達到比較好的效果,主要有一般輪詢算法、基於比率的加權輪詢算法以及基於優先級的加權輪詢算法等。動態負載均衡算法在較為復雜的網絡環境中適應性更強,效果更好,主要有基於任務量的最少連接優先算法、基於性能的最快響應優先算法、預測算法及動態性能分配算法等。

網絡負載均衡技術的大致原理是利用一定的分配策略將網絡負載平衡地分攤到網絡集群的各個操作單元上,使得單個重負載任務能夠分擔到多個單元上並行處理,或者使得大量並發訪問或數據 流量分擔到多個單元上分別處理,從而減少用戶的等待響應時間。

Nginx服務器負載均衡配置

Nginx服務器實現瞭靜態的基於優先級的加權輪詢算法,主要使用的配置是proxy_pass指令和upstream指令,這些內容實際上很容易理解,關鍵點在於Nginx服務器的配置靈活多樣,如何在配置負載均衡的同時合理地整合其他功能,形成一套可以滿足實際需求的配置方案。

下面的有一些基礎示例片段,當然不可能將所有的配置情況包括在內,希望能夠起到拋磚引玉的效果,同時也需要大傢在實際應用過程中多總結多積累。在配置中需要註意的地方將以註釋的形式添加。

配置實例一:對所有請求實現一般輪詢規則的負載均衡

     在以下實例片段中,backend服務器組中所有服務器的優先級全部配置為默認的weight=1,這樣它們會按照一般輪詢策略依次接收請求任務。該配置是一個最簡單的實現Nginx服務器負載均衡的配置。所有訪問www.myweb.name 的請求都會在backend服務器組中實現負載均衡。實例代碼如下:

...
 
upstream backend                    #配置後端服務器組
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;          #默認weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
} 

配置實例二:對所有請求實現加權輪詢規則的負載均衡

    與“配置實例一”相比,在該實例片段中,backend服務器組中的服務器被賦予瞭不同的優先級別,weight變量的值就是輪詢策略中的“權值”。其中,192.168.1.2:80的級別最高,優先接收和處理客戶端請求;192.168.1.4:80的級別最低,是接收和處理客戶端請求最少的服務器,192.168.1.3:80將介於以上兩者之間。所有訪問www.myweb.name的請求都會在backend服務器組中實現加權負載均衡。實例代碼如下:

...
 
upstream backend                    #配置後端服務器組
{
    server 192.168.1.2:80 weight=5;
    server 192.168.1.3:80 weight=2;
    server 192.168.1.4:80;          #默認weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
}

配置實例三:對特定資源實現負載均衡

在該實例片段中,我們設置瞭兩組被代理的服務器組,名為“videobackend”的一組用於對請求video資源的客戶端請求進行負載均衡,另一組用於對請求filed資源的客戶端請求進行負載均衡。所有對“http://www.mywebname/video/* ”的請求都會在videobackend服務器組中獲得均衡效果,所有對“http://www.mywebname/file/* ”的請求都會在filebackend服務器組中獲得均衡效果。該實例中展示的是實現一般負載均衡的配置,對於加權負載均衡的配置可以參考“配置實例二”。

    在location /file/ {……}塊中,我們將客戶端的真實信息分別填充到瞭請求頭中的“Host”、“X-Real-IP”和“X-Forwareded-For”頭域,這樣後端服務器組收到的請求中就保留瞭客戶端的真實信息,而不是Nginx服務器的信息。實例代碼如下:

...
 
upstream videobackend                    #配置後端服務器組1
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;
}
upstream filebackend                    #配置後端服務器組2
{
    server 192.168.1.5:80;
    server 192.168.1.6:80;
    server 192.168.1.7:80;
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
    location /video/ {
        proxy_pass http://videobackend; #使用後端服務器組1
        prox_set_header Host $host;
        ...
    }
    location /file/ {
        proxy_pass http://filebackend;  #使用後端服務器組2
                                        #保留客戶端的真實信息
        prox_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
}  

配置實例四:對不同域名實現負載均衡

在該實例片段中,我們設置瞭兩個虛擬服務器和兩組後端代理的服務器組,分別用來接收不同的域名請求和對這些請求進行負載均衡處理。如果客戶端請求域名為“home.myweb.name”,則服務器server1接收並轉向homebackend服務器組進行負載均衡處理;如果客戶端請求域名為“bbs.myweb.name”,則由服務器server2接收bbsbackend服務器級進行負載均衡處理。這樣就實現瞭對不同域名的負載均衡。

需要註意兩組後端服務器組中有一臺服務器server 192.168.1.4:80是公用的。在該服務器上需要部署兩個域名下的所有資源才能保證客戶端請求不會出現問題。實例代碼如下:

...
upstream bbsbackend                    #配置後端服務器組1
{
    server 192.168.1.2:80 weight=2;
    server 192.168.1.3:80 weight=2;
    server 192.168.1.4:80;
}
upstream homebackend                    #配置後端服務器組2
{
    server 192.168.1.4:80;
    server 192.168.1.5:80;
    server 192.168.1.6:80;
}
                                        #開始配置server 1
server
{
    listen 80;
    server_name home.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://homebackend;
        prox_set_header Host $host;
        ...
    }
    ...
}
                                        #開始配置server 2
server
{
    listen 80;
    server_name bbs.myweb.name;
    index index.html index.htm;
    location / {
        proxy_pass http://bbsbackend;
        prox_set_header Host $host;
        ...
    }
    ...
}

配置實例五:實現帶有URL重寫的負載均衡

    首先,我們來看具體的源碼,這是在實例一的基礎上做的修改:

...
upstream backend                    #配置後端服務器組
{
    server 192.168.1.2:80;
    server 192.168.1.3:80;
    server 192.168.1.4:80;          #默認weight=1
}
server
{
    listen 80;
    server_name www.myweb.name;
    index index.html index.htm;
     
    location /file/ {
        rewrite ^(/file/.*)/media/(.*)\.*$) $1/mp3/$2.mp3 last;
    }
     
    location / {
        proxy_pass http://backend;
        prox_set_header Host $host;
    }
    ...
}

該實例片段與“配置一”相比,增加瞭對URI包含“/file/”的URL重寫功能。例如客戶端請求的URL為“http://www.myweb.name/file/downlaod/media/1.mp3 ”時,該虛擬服務器首先使用location file/ {……}塊轉發到後端的backend服務器組中實現負載均衡。這樣,就車輕而易舉地實現瞭帶有URL重寫功能的負載均衡。在該配置方案中,一定要掌握清楚rewrite指令中last標記和break標記的區別,才能達到預計的效果。

以上5個配置實例展示瞭Nginx服務器實現不同情況下負載均衡配置的基本方法。由於Nginx服務器的功能在結構上是增量式的,因此 ,我們可以在這些配置的基礎上繼續添加更多功能,比如Web緩存等功能,以及Gzip壓縮技術、身份認證、權限管理等。同時在使用upstream指令配置服務器組時,可以充分發揮各個指令的功能,配置出滿足需求、高效穩定、功能豐富的Nginx服務器。

以上就是Nginx 負載均衡是什麼以及該如何配置的詳細內容,更多關於Nginx 負載均衡的資料請關註WalkonNet其它相關文章!

推薦閱讀: