nginx的基礎應用(續)
一、簡介
上一篇文章我們介紹了nginx的基礎應用,其中講到了nginx作為代理伺服器的使用,但是漏了一個重要的,也是使用非常普遍的特性——負載均衡。今天,我們将這段内容補上。
通過多個執行個體進行負載均衡是一個比較常用的技術,它用來是資源利用最大化、提高通過率、降低延遲響應、確定容災等。
二、負載均衡的方法
- 輪詢——應用伺服器間的請求按照輪詢的方式配置設定;
- 最小連接配接數——下一個請求将會配置設定給目前連接配接數最小的伺服器;
- ip哈希——以一種哈希的方式決定下一個請求配置設定到哪個伺服器上(基于用戶端的ip進行哈希)。
三、預設的負載均衡配置
nginx最簡單的負載均衡配置如下:
http {
upstream myapp1 {
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://myapp1;
}
}
}
上面的例子中,有3個相同的執行個體運作在srv1-srv3上。當負載均衡的方法沒有特别指定時,它将預設使用輪詢的方式。所有的請求都會被代理到服務組myapp1上,nginx将應用HTTP的負載均衡配置設定請求。
nginx的反向代理實作包含負載均衡的種類:HTTP、HTTPS、FastCGI、uwsgi、SCGI和緩存等。
如果要用HTTPS的負載均衡,隻需要使用HTTPS的協定即可。
當為FastCGI、uwsgi、SCGI和緩存設定負載均衡時,使用相應的fastcgi_pass、uwsgi_pass、scgi_pass和memcached_pass的指令集即可,這裡不做詳細介紹。
四、最小連接配接負載均衡
另外一個負載連接配接方式是最小連接配接。最小連接配接的方式可以使應用執行個體間的負載更公平,例如在一些請求需要花費更長時間去完成的情況。
使用最小連接配接的方式,nginx不會将過多的請求配置設定到一個比較忙的應用服務上,它将把請求配置設定到相對不忙的應用服務上。
最小連接配接的負載均衡方式在nginx中的配置如下,它作為服務組中的一個配置出現:
upstream myapp1 {
least_conn;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
五、會話保持的方式
在介紹這種方式之前,大家先記住,使用輪詢和最小連接配接的負載均衡方式,同一用戶端的下一個請求有可能配置設定到不同的應用服務上。這兩種方式不能保證同一用戶端的請求總是配置設定到同一個服務上。
如果需要将一個用戶端綁定到一個特殊的應用服務上,換句話說,使用戶端的會話“粘連”或“保持”,就要使用“ip-hash”的負載均衡機制了。
使用ip-hash,用戶端的ip用來做哈希的key,決定着選擇服務組中的哪個應用服務這個用戶端的請求。這種方法決定了相同用戶端的請求總是配置設定給相同的服務,除非這個服務不可用了。
配置ip-hash的負載均衡,隻需要将ip-hash指令添加到服務組(upstream)中,如下:
upstream myapp1 {
ip_hash;
server srv1.example.com;
server srv2.example.com;
server srv3.example.com;
}
六、負載均衡的權重
通過使用服務權重,可以進一步影響負載均衡的邏輯。上面的例子中,沒有配置權重的意思是,所有指定的服務将被看做有相同的權重。
采用輪詢的方式,如果有足夠的請求,并且請求通過統一的方式處理并且快速的完成的情況下,它仍然意味着在服務之間或多或少的公平的配置設定。
當weight參數為一個服務指定時,它将是負載均衡過程中的一部分。
upstream myapp1 {
server srv1.example.com weight=3;
server srv2.example.com;
server srv3.example.com;
}
上面的配置中,每5個應用請求将配置設定如下:3個請求配置設定個srv1,1個請求配置設定給srv2,另一個請求配置設定給srv3。在nginx最近的版本中,在最小連接配接和ip-hash的負載均衡方式中使用權重(weight)也是有可能的。
七、健康檢查
nginx的反向代理包括帶内(或被動)的健康檢查。如果一個服務的響應是失敗的,nginx将會标記這個服務是失敗的,并且在短暫的時間内,避免為下一個請求選擇這個服務。
max_fails指令設定是,在fail_timeout時間内,嘗試和這台服務連續通信失敗的次數。預設情況下,max_fails設定為1,當設定為0時,這個服務的健康檢查将失效。fail_timeout參數定義了這個服務多長時間會被标記為失效,在服務失敗的fail_timeout間隔後,nginx使用活的用戶端請求優雅的探測服務,如果探測成功了,這個服務将會标記為成功的。
至此,nginx用的最多的,也是最常用的部分——負載均衡 講完了,歡迎大家拍磚~~