nginx的基礎應用(續)

小忽悠發表於2018-06-21

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用的最多的,也是最常用的部分——負載均衡 講完了,歡迎大家拍磚~~


相關文章