分配方式
Nginx的upstream支持5種 分配方式,其中 輪詢、權重、IP散列這三種為Nginx原生支持的分配方式,fair 和 url_hash 為第三方支持的分配方式。
1,輪詢
輪詢是upstream的默認分配方式,即每個請求按照時間順序輪流分配到不同的后端服務器,如果某個后端服務器 down 掉后,能自動剔除。
upstream zhang21(名稱){
? ? server 192.168.1.11:8888;
? ? ?server 192.168.1.22:8888;
? ? server 192.168.1.33:8888;
}
2,weight(權重)
輪詢的加強版,既可以指定輪詢比率,weight 和訪問幾率成正比,主要應用于后端服務器異質的場景下。
upstream zhang21 {
? ? server 192.168.1.11 weight=1;
? ? server 192.168.1.22 weight=2;
? ? server 192.168.1.33 weight=3;
}
3,ip_hash
每個請求按照訪問 Ip(即Nginx的前置服務器或客戶端IP)的 hash結果分配,這樣每個訪客會固定訪問一個后端服務器,可以解決 session 一致問題。
upstream zhang21 {
? ? ip_hash;
? ? server 192.168.1.11:7777;
? ? server 192.168.1.22:8888;
? ? server 192.168.1.33:9999;
}
4,fair
fair顧名思義,公平地按照后端服務器的響應時間(rt)來分配請求,響應時間(rt)小的后端服務器優先分配請求。
upstream zhang21 {
? ? server 192.168.1.11;
? ? server 192.168.1.22;
? ? server 192.168.1.33;
}
5,url_hash
與 ip_hash類似,但是按照訪問 url 的 hash 結果來分配請求,使得每個 url 定向到同一個后端服務器,主要應用于后端服務器為緩存的場景下。
upstream zhang21 {
? ? server 192.168.1.11;
? ? server 192.168.1.22;
? ? server 192.168.1.33;
? ?hash $request_uri;
? ? hash_method crc32;
}
其中,hash_method為使用的hash算法,需要注意,此時server語句中不能添加 weight等參數。
設備狀態
從上面可以看出upstream中server指令語法如下:
server ?address ?[ parameters ]
address可以是主機名、域名、ip或Unix Socket,也可以指定端口號;
parameters表示可選參數,有如下這些:
down,表示當前server已停用;
backup,表示當前server是備用服務器,只有其它非backup后端服務器都掛掉了或很忙才會分配請求給它;
weight,表示當前server負載權重,權重越大幾率愈高;
max_fails 和 fail_timeout 一般會關聯使用,如果某臺server在 fail_timeout 時間內出現了 max_fails 次連接失敗,那么Nginx會認為其已經掛掉,從而在 fail_timeout 時間內不再去請求它,fail_timeout默認是 10s,max_fails默認是1,即默認情況只要是發生錯誤就認為服務器掛了,如果將max_fails設置為0,則表示取消這項檢查。
舉個栗子
四臺主機,一臺處理轉發,另外三臺為后端處理服務器。
192.168.1.11 ? ?#前
192.168.1.22
192.168.1.33
192.168.1.44
在 1.11上的簡單配置
在nginx.conf的http{ }下;
upstream zhang21 {
server 192.168.1.22;
server 192.168.1.33;
server 192.168.1.44;
}
在虛擬主機server { } 中配置;
location / {
? ? root html;
? ? index index.html index.htm;
? ? proxy_pass http://zhang21(upstream名稱);
}
在三臺后臺主機上的簡單配置
配置虛擬主機server { };
server {
? ? listen 80;
? ? root /var/www;
? ? location / {
? ? ? ? fastcgi_pass? 127.0.0.1:9000;
? ? ? ? fastcgi_index? index.php;
? ? ? ? fastcgi_param? SCRIPT_FILENAME? $document_root/$fastcgi_script_name;
? ? ? ? include? ? ? ? fastcgi_params;
? ? }
}