1. 程式人生 > 實用技巧 >Nginx進階使用-負載均衡原理及配置例項

Nginx進階使用-負載均衡原理及配置例項

介紹

跨多個應用程式例項的負載平衡是一種用於優化資源利用率,最大化吞吐量,減少延遲和確保容錯配置的常用技術。可以將Nginx用作非常有效的HTTP負載平衡器,以將流量分配到多個應用程式伺服器,並使用Nginx改善Web應用程式的效能,可伸縮性和可靠性。

負載均衡

什麼是負載均衡,單從字面理解可以解釋為N臺伺服器平均分擔負載,不會因為某臺伺服器負載高宕機而出現某臺伺服器閒置的情況。那麼負載均衡的前提就是要有多臺伺服器才能實現,目的是達到整個系統的高效能和高可用性。

Nginx負載均衡介紹

嚴格地說,Nginx僅僅是作為Nginx Proxy反向代理使用的,因為這個反向代理功能表現的效果是負載均衡叢集的效果,所以我們稱之為Nginx負載均衡。

Nginx負載均衡元件

實現Nginx負載均衡的元件主要有兩個:

  • ngx_http_upstream_module
    負載均衡模組,可以實現網站的負載均衡功能及節點的健康檢查
  • ngx_http_proxy_module
    proxy代理模組,用於把請求轉發給伺服器節點或upstream伺服器池

http_upstream模組

  1. upstream模組介紹

upstream模組允許Nginx定義一組或多組節點伺服器組,使用時可以通過proxy_pass代理方式把網站的請求傳送到事先定義好的對應upstream組的名字上,具體寫法為:
proxy_pass http://server_pool_name
其中server_pool_name就是一個upstream節點伺服器組名字。

  1. upstream典配
upstream server_pool_name {
server 192.168.0.2;   #這行標籤和下行是等價的
server 192.168.0.3:80 weight=1 max_fails=1 fail_timeout=10s;       #這行標籤和上一行是等價的,此行多餘的部分就是預設配置,不寫也可以。
server 192.168.0.4:80 weight=1 max_fails=2 fail_timeout=20s backup; #server最後面可以加很多引數,具體引數作用看下文的表格
}
  1. upstream模組引數
  • server
    負載後面的RS配置,可以是ip或者域名。

  • weight
    請求伺服器的權重。預設值為1,越大表示接受的請求比例越大。

  • max_fails
    nginx 嘗試連線後端主機失敗的次數。
    這個數值需配合proxy_net_upstream,fastcgi_next_upstream和memcached_next_upstream這三個引數來使用的。
    當nginx接收後端伺服器返回這三個引數定義的狀態碼時,會將這個請求轉發給正常工作的後端伺服器,例如404,502,503

  • fail_timeout
    在max_fails定義的失敗次數後,距離下次檢查的時間間隔,預設10s

  • backup
    熱備配置,標誌這臺伺服器作為備份伺服器,若主伺服器全部宕機了,就會向它轉發請求

  • down
    表示這個伺服器永不可用,可配合ip_hash使用

  • 舉例

upstream web_pools {
server 192.168.0.3:80 weight=5; 
server 192.168.0.4:80 max_fail=5 fail_timeout=10s;// 當5次連續檢查失敗後,間隔10s後重新檢測。
server 192.168.0.5:80 backup; // 指定備份伺服器。作用:等上面伺服器全部不可訪問時就向它轉發請求。
}

http_proxy模組

  1. proxy_pass指令介紹

proxy_pass指令屬於ngx_http_proxy_module模組,此模組可以將請求轉發到另一臺伺服器。在實際的反向代理工作中,會通過location功能匹配指定的URI,然後把接收到的符合匹配URI的請求通過proxy_pass拋給定義好的upstream節點池,就location指令具體如何配置和使用,會在後續文章中專題介紹,敬請期待。

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
  1. http proxy模組引數
  • proxy_set_header
    設定http請求header項傳給後端伺服器節點。例如,可以實現讓代理後端的伺服器節點獲取訪問客戶端使用者真實的IP地址

  • client_body_buffer_size
    用於指定客戶端請求主題緩衝區大小

  • proxy_connect_timeout
    表示反向代理與後端節點伺服器連線的超時時間,即發起握手等候響應的超時時間

  • proxy_send_timeout
    表示代理後端伺服器的資料回傳時間,即在規定時間之內,後端伺服器必須傳完所有的資料,否則,nginx將斷開這個連線

  • proxy_read_timeout
    設定nginx從代理的後端伺服器獲取資訊的時間,表示連線建立成功後,nginx等待後端伺服器的響應時間,其實是nginx在後端排隊等候處理的時間

  • proxy_buffer_size
    設定緩衝區大小,預設該緩衝區大小等於指令proxy_buffers設定的大小

  • proxy_buffers
    設定緩衝區的數量和大小,nginx從代理的後端伺服器獲取的響應資訊,會放置在緩衝區

  • proxy_busy_buffers_size
    用於設定系統很忙時可以使用的proxy_buffers大小,官方推薦的大小為proxy_bufer*2

  • proxy_temp_file_write_size
    指定proxy快取臨時檔案的大小

Nginx負載均衡排程演算法

Nginx負載均衡是通過upstream模組來實現的,內建實現了三種負載策略,配置還是比較簡單的。官網負載均衡配置說明:http://nginx.org/en/docs/http/load_balancing.html
此外

  1. round-robin(輪詢)
    預設排程演算法,按照客戶端請求逐一分配到不同的後端伺服器,宕機的伺服器會自動從節點伺服器池中剔除。
upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

注意:對於伺服器效能不同的叢集,該演算法容易引發資源分配不合理等問題。

  1. least-connected(最少連線)
    最少連線允許在某些請求需要較長時間才能完成的情況下更公平地控制應用程式例項上的負載。使用最少連線的負載平衡,nginx將嘗試不使繁忙的應用程式伺服器因過多的請求而過載,而是將新的請求分配給不太繁忙的伺服器。可以將nginx用作非常有效的HTTP負載平衡器,以將流量分配到多個應用程式伺服器,並使用nginx改善Web應用程式的效能,可伸縮性和可靠性
upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
  1. ip-hash
    每個請求按訪問 IP 的hash結果分配,每個訪客固定訪問一個後端伺服器,可解決session不共享的問題。
upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

參考

結語

歡迎關注微信公眾號『碼仔zonE』,專注於分享Java、雲端計算相關內容,包括SpringBoot、SpringCloud、微服務、Docker、Kubernetes、Python等領域相關技術乾貨,期待與您相遇!