邏輯架構(gòu)圖
Nginx負(fù)載均衡的邏輯架構(gòu)圖如下圖所示:
Nginx負(fù)載均衡邏輯架構(gòu)圖
負(fù)載均衡配置
Nginx負(fù)載均衡服務(wù)器清單:
服務(wù)器名稱 | IP | 說明 |
Load Balance Server | 10.0.0.10 | Nginx負(fù)載均衡服務(wù)器 |
Web Server 1 | 10.0.0.20 | Web應(yīng)用服務(wù)器 |
Web Server 2 | 10.0.0.21 | Web應(yīng)用服務(wù)器 |
負(fù)載均衡服務(wù)器Nginx.conf配置如下:
worker_process 1;events {worker_connections 1024;}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream www_pools { # 定義Web服務(wù)池server 10.0.0.20:80 weight = 1;server 10.0.0.21:80 weight = 1;}server { # 定義負(fù)載均衡虛擬主機(jī)listen 80;server_name www.test.com; # 根據(jù)實(shí)際域名填寫location / {proxy_pass http://www_pools; # 訪問www.test.com,請求轉(zhuǎn)發(fā)給www_pools中的節(jié)點(diǎn)}}}
重啟Nginx服務(wù):
nginx -s reload
至此,已經(jīng)完成了一個簡單的負(fù)載均衡集群網(wǎng)絡(luò)的配置,當(dāng)用戶輸入網(wǎng)址http://www.test.com/訪問負(fù)載均衡服務(wù)器時,負(fù)載均衡會根據(jù)設(shè)置的負(fù)載均衡算法將訪問請求分發(fā)到Web Server 1和Web Server 2兩個節(jié)點(diǎn)。
負(fù)載均衡核心組件
upstream 模塊
模塊簡介
Nginx負(fù)載均衡功能依賴于ngx_http_upstream_module模塊,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass。
模塊語法
示例1:基本upstream配置
upstream www_pools { # upstream關(guān)鍵詞必須有,www_pools為集群組名稱,自定義server 10.0.0.20:80 weight=5; # server固定關(guān)鍵詞,后接域名或IP,端口不指定默認(rèn)80server 10.0.0.21:80 weight=10; # weight表示權(quán)重,權(quán)重越大被分配幾率越大}
示例2:較完整的upstream配置
upstream web_pools {server 10.0.0.5;server 10.0.0.6:80 weight=1 max_fails=1 fail_timeout=10s;server 10.0.0.10:80 weight=2 max_fails=2 fail_timeout=20s backup;}
示例3:使用域名及socket的upstream配置
upstream backend {server backend1.example.com weight=5;server backend2.example.com:8080;server unix:/tmp/backend3; # 指定socket文件server backup1.example.com:8080 backup;server backup2.example.com:8080 backup; #backup表示備份服務(wù)器,其他指定服務(wù)器都不可用時啟動}
相關(guān)參數(shù)
upstream模塊內(nèi)部server標(biāo)簽參數(shù)說明
Server標(biāo)簽 | 參數(shù)說明 |
server 10.0.0.10:80 | 節(jié)點(diǎn)地址可以是IP或者域名,端口不寫則默認(rèn)為80端口 |
weight=1 | 服務(wù)器權(quán)重,默認(rèn)值為1。權(quán)重越大表示接收請求比例越大 |
max_fails=1 | Nginx嘗試連接后端主機(jī)節(jié)點(diǎn)失敗的次數(shù) |
backup | 熱備配置參數(shù),當(dāng)前面激活的節(jié)點(diǎn)都失敗后會自動啟動熱備節(jié)點(diǎn)。注意:當(dāng)負(fù)載調(diào)度算法為ip_hash時,狀態(tài)不能是weight和backup。 |
fail_timeout=10s | 在max_fails定義的失敗次數(shù)后,距離下次檢查的間隔時間,默認(rèn)是10s。 |
down | 標(biāo)志著該節(jié)點(diǎn)永遠(yuǎn)不可用,這個參數(shù)可配合ip_hash使用。 |
http_proxy_module模塊
proxy_pass指令屬于ngx_http_proxy_module模塊,此模塊可以將請求轉(zhuǎn)發(fā)到另一臺服務(wù)器。 在實(shí)際的反向代理工作中,會通過location功能匹配指定的URI,然后把接收到的符合匹配URI的請求通過proxy_pass拋給定義好的upstream節(jié)點(diǎn)池。
常見的使用案例:
(1)將匹配URI為name的請求拋給http://127.0.0.1/remote:
location /name/ {proxy_pass http://127.0.0.1/remote/;}
(2)將匹配URI為name的請求應(yīng)用指定的rewrite規(guī)則,然后拋給http://127.0.0.1:
location /name/ {rewrite /name/([^/]+) /users?name=$1 break;proxy_pass http://127.0.0.1;}
負(fù)載均衡調(diào)度算法
調(diào)度算法一般可以分為兩類:
靜態(tài)調(diào)度算法: 負(fù)載均衡器根據(jù)自身設(shè)定的規(guī)則進(jìn)行分配,不考慮后端節(jié)點(diǎn)服務(wù)器的情況。比如rr、wrr、ip_hash都屬于靜態(tài)調(diào)度算法。
動態(tài)調(diào)度算法: 負(fù)載均衡器會根據(jù)后端服務(wù)器當(dāng)前狀況來決定是否分發(fā)請求。比如least_conn、fair等都屬于動態(tài)調(diào)度算法。
rr輪詢算法
按照客戶端請求順序把客戶端請求逐一分配給不同的后端節(jié)點(diǎn),若后端節(jié)點(diǎn)宕機(jī),則會被自動從節(jié)點(diǎn)池中剔除。
wrr權(quán)重輪詢算法
在rr輪詢算法的基礎(chǔ)上加上權(quán)重,即權(quán)重輪詢算法。權(quán)重和用戶訪問量成正比,權(quán)重值越大,被轉(zhuǎn)發(fā)的請求也就越多。
ip_hash算法
每個請求按照客戶端IP的hash結(jié)果分配,當(dāng)新的請求到達(dá)時,先講起客戶端的IP通過哈希算法哈希出一個值,相同的哈希值會被分配到同一臺節(jié)點(diǎn)服務(wù)器。
該調(diào)度算法可以解決動態(tài)網(wǎng)頁的session共享問題。
fair算法
根據(jù)后端節(jié)點(diǎn)服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的有限分配。
Nginx本身不支持fair調(diào)度算法,如果要使用該算法,必須下載upstream_fair模塊。
least_conn算法
根據(jù)后端節(jié)點(diǎn)的連接數(shù)來決定分配情況,哪個節(jié)點(diǎn)連接數(shù)少就分給哪個節(jié)點(diǎn)。
url_hash算法
根據(jù)訪問URL的hash結(jié)果來分配請求,讓每個URL定向到同一個后端服務(wù)器。
Nginx本身不支持url_hash的,如果需要使用該算法,必須安裝Nginx的hash模塊軟件包。