負載均衡
將用戶的請求均勻的或者按照一定的優(yōu)先級分配到一組服務(wù)器中的一臺上,而接收到請求的服務(wù)器獨立的處理請求并返回。負載均衡技術(shù)主要用于擴展后端服務(wù)的性能。
反向代理
代理服務(wù)器將接收到的用戶請求轉(zhuǎn)發(fā)給內(nèi)部服務(wù)器,再將內(nèi)部服務(wù)器返回的結(jié)果返回給用戶,此時代理服務(wù)器就充當一個服務(wù)器的角色。
實例
在配置文件里寫上如下的代碼:
[plain]view plaincopy
upstream?backend?{
server?192.168.x.x:8086?weight=4?max_fails=2?fail_timeout=30s;
server?192.168.x1.x2 weight=4?max_fails=2?fail_timeout=30s;
server?unix:/tmp/backends?weight=4?max_fails=2?fail_timeout=30s;
}
server?{
listen?80?;
server_name?frontend.com;
location?=?/?{
proxy_pass?http://backend;
proxy_set_header?Host?backend.com;
proxy_set_header?Forwarded?$remote_addr;
}
}
proxy_pass用于指定反向代理的upstream服務(wù)器集群,proxy_set_header用于添加指定的頭信息,這里向header里添加了host信息,用于當后端服務(wù)器上有多個基于域名的虛擬主機時,host可以指定要訪問哪一個虛擬主機,同時也添加了forwarded信息,用于告訴后端服務(wù)器終端用戶的ip地址,否則后端服務(wù)器只能獲取前端代理服務(wù)器的ip地址。
Upstream 模塊
nginx 利用 upstream 模塊來實現(xiàn)負載均衡,并且該模塊還可以對后端服務(wù)器進行健康檢查。
ip_hash指令
ip_hash 指令可以將某個客戶端的請求通過ip hash算法定位到同一臺后端服務(wù)器上,這樣就能保證客戶端的請求能一直被定向到一臺后端服務(wù)器上,否則就會隨機被定向到不同的后端服務(wù)器上。
ip_hash 的缺點就是無法保證后端服務(wù)器的負載均衡,因為ip的不均勻?qū)е掠锌赡苡械暮蠖朔?wù)器接收的請求多,而且即使設(shè)置后端服務(wù)器的權(quán)重也不起作用。
如果某個后端服務(wù)器要從nginx負載均衡中摘除一段時間,必須將其標記為“down”,而不是直接從配置文件中刪掉或者注釋掉。代碼如下:
[plain]view plaincopy
upstream?backend?{
ip_hash;
server?backend1.com;
server?backend2.com;
server?backend3.com;
server?backend4.com?down;
}
如果直接將backend4.com從配置文件中刪除的話,nginx就會按照3臺后端服務(wù)器重新hash,原來定向到backend1的用戶就有可能重新定向到backend2,這樣backend1上的用戶數(shù)據(jù)就會失效,比如SESSION數(shù)據(jù)。
server指令
該指令用于指定后端服務(wù)器的名稱和參數(shù),服務(wù)器的名稱可以是一個域名,一個ip,端口號或者unix scoket。
參數(shù)主要有:
weight,設(shè)置后端服務(wù)器的權(quán)重,權(quán)重越高,被分配到的客戶端請求數(shù)越多。如果沒有設(shè)置權(quán)重,則權(quán)重值默認為1;
max_fails,指定在參數(shù) fail_timeout 時間內(nèi)后端服務(wù)器請求失敗的次數(shù),如果檢測到后端服務(wù)器無法連接或者服務(wù)器內(nèi)部錯誤,則標記失敗,默認值為1,設(shè)置為0將會關(guān)閉這項檢查;
fail_timeout,在指定的時間內(nèi)如果失敗次數(shù)到達max_fails時,后端服務(wù)器將會暫停服務(wù)的時間;
down,標記服務(wù)器為永久離線狀態(tài),僅用于ip_hash指令;
backup,僅僅在非backup服務(wù)器全部宕機或繁忙的時候才啟用。
upstream 相關(guān)變量
當要使用日志來記錄upstream服務(wù)器狀態(tài)的時候,可以在log_format中使用相關(guān)的變量,比如:
$upstream_addr:表示處理請求的upstream中的服務(wù)器地址;
$upstream_status:表示upstream服務(wù)器的應(yīng)對狀態(tài);
$upstream_response_time:upstream服務(wù)的響應(yīng)時間(毫秒);
$upstream_http_$HEADER:任意的http協(xié)議頭信息,例如:$upstream_http_host。
實例如下:
[plain]view plaincopy
upstream?backend?{
server?172.28.x.x:80?max_fails=3?fail_timeout=10s;
server?172.28.x1.x1:80?max_fails=3?fail_timeout=10s;
}
server?{
listen?8360?;
server_name?${DOMAIN};
location?=?/?{
proxy_pass?http://backend;
proxy_set_header?Host?${DOMAIN};
proxy_set_header?Forwarded?$remote_addr;
}
log_format?up?'$upstream_addr?$upstream_status?$upstream_response_time?$upstream_http_host';
access_log??access.log?up;
}