負載均衡主要經過專門的硬件設備或者經過軟件算法實現。經過硬件設備實現的負載均衡效果好、效率高、性能穩定,可是成本比較高。經過軟件實現的負載均衡主要依賴於均衡算法的選擇和程序的健壯性。均衡算法也是多種多樣的,常見的有兩大類:即靜態負載均衡算法和動態負載均衡算法。靜態算法實現比較簡單,在通常網絡環境下也能達到比較好的效果,主要有通常輪詢算法、基於比率的加權輪詢算法以及基於優先級的加權輪詢算法等。動態負載均衡算法在較爲複雜的網絡環境中適應性更強,效果更好,主要有基於任務量的最少鏈接優先算法、基於性能的最快響應優先算法、預測算法及動態性能分配算法等。html
網絡負載均衡技術的大體原理是利用必定的分配策略將網絡負載平衡地分攤到網絡集羣的各個操做單元上,使得單個重負載任務可以分擔到多個單元上並行處理,或者使得大量併發訪問或數據 流量分擔到多個單元上分別處理,從而減小用戶的等待響應時間。web
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服務器組中實現加權負載均衡。實例代碼以下:bash
... 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; ... } ... }
首先,咱們來看具體的源碼,這是在實例一的基礎上作的修改:
... 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服務器。