012.Nginx負載均衡

木二發表於2020-07-17

一 負載均衡概述

1.1 負載均衡介紹

負載均衡是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度,帶給使用者更好的體驗。對於Web應用,通過負載均衡,可以將一臺伺服器的工作擴充套件到多臺伺服器中執行,提高整個網站的負載能力。其本質採用一個排程者,保證所有後端伺服器都將效能充分發揮,從而保持伺服器叢集的整體效能最優,這就是負載均衡。

二 Nginx負載均衡

2.1 優點

  • 高併發連線
  • 記憶體消耗少
  • 配置檔案非常簡單
  • 成本低廉
  • 支援Rewrite重寫規則
  • 內建的健康檢查功能
  • 節省頻寬
  • 穩定性高
  • 2.2 主要均衡機制

  • round-robin:輪詢。以輪詢方式將請求分配到不同伺服器上。
  • least-connected:最少連線數。將下一個請求分配到連線數最少的那臺伺服器上。
  • ip-hash:基於客戶端的IP地址。雜湊函式被用於確定下一個請求分配到哪臺伺服器上。
  • 2.3 負載均衡策略

    nginx的負載均衡策略可以劃分為兩大類:內建策略和擴充套件策略,擴充套件策略為第三方提供。
    內建策略
  • 輪詢(預設):Nginx根據請求次數,將每個請求均勻分配到每臺伺服器;
  • weight:加權輪詢,加權輪詢則是在第一種輪詢的基礎上對後臺的每臺服務賦予權重,伺服器的權重比例越大,被分發到的概率也就越大。
  • least_conn:最少連線,將請求分配給連線數最少的伺服器。Nginx會統計哪些伺服器的連線數最少。
  • ip_hash:IP 雜湊,繫結處理請求的伺服器。第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到叢集中的某一臺伺服器上。後面該客戶端的所有請求,都將通過HASH演算法,找到之前處理這臺客戶端請求的伺服器,然後將請求交給它來處理。
  • 擴充套件策略
  • fair:按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
  • url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。
  • 提示:預設輪詢可能存在一個問題,假如使用者在某臺伺服器上登入了,那麼該使用者第二次請求的時候,其登入資訊會丟失。因為在負載均衡系統中,每次請求都會重新定位到伺服器叢集中的某一個,那麼就會導致已經登入某一個伺服器的使用者在重新定位到另一個伺服器了,所以就會導致丟失登入資訊。
    因此針對如上問題,可以採用ip_hash方式解決,如果客戶已經訪問了某個伺服器,當使用者再次訪問時,會將該請求通過雜湊演算法,自動定位到該伺服器。

    2.4 負載均衡內建變數

    nginx負載均衡器內建變數(Embedded Variables),nginx負載均衡模組ngx_http_upstream_module支援下列內建變數:
  • $upstream_addr:儲存一個伺服器的IP地址和埠號或者UNIX-domain套接字檔案的路徑。如果在處理請求過程中使用了多個伺服器,那麼它們的地址將以逗號分割,例如 :“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock”。如果一個內建的從一個伺服器組到另一個伺服器組的重定向使用X-Accel-Redirect” or error_page ,那麼那些伺服器組以冒號隔開,例如“192.168.1.1:80, 192.168.1.2:80, unix:/tmp/sock : 192.168.10.1:80, 192.168.10.2:80”。
  • $upstream_response_time:儲存nginx負載均衡伺服器響應時間,以毫秒計。多個響應也以逗號和冒號隔開。
  • $upstream_status:儲存nginx負載均衡伺服器響應程式碼。多個響應程式碼也以逗號或冒號隔開。
  • $upstream_http_:儲存nginx負載均衡伺服器響應頭欄位。例如,the “Server” response header field is made available through the $upstream_http_server variable.注意,只有最後一個伺服器響應頭欄位被儲存。
  • 2.5 負載均衡健康檢查

    nginx反向代理包含內建的或第三方擴充套件來實現伺服器健康檢測的。如果後端某臺伺服器響應失敗,nginx會標記該臺伺服器失效,在特定時間內,請求不分發到該臺上。
    fail_timeout:該指令定義了多長時間伺服器將被標記為失敗。在fail_timeout後,伺服器還是failed,nginx將檢測該伺服器是否存活,如果探測成功,將標記為活的。
    max_fails:該指令設定在fail_timeout期間內連續的失敗嘗試。預設情況下,max_fails為1。如果被設定為0,該伺服器的健康檢測將禁用。

    2.6 負載均衡狀態碼


    狀態

    概述
    max_fails
    允許請求失敗的次數,預設為1。
    max_conns
    限制最大接受的連線數。
    fail_timeout
    在經歷了max_fails次失敗後,暫停服務的時間。
    backup
    預留的備份機器。
    down
    表示當前的server暫時不參與負載均衡。

    三 預設輪詢負載均衡

    3.1 環境預設



    主機

    IP

    備註
    nginx01
    172.24.10.21
    Nginx負載均衡
    nginx02
    172.24.10.22
    後端RS 01
    nginx03
    172.24.10.23
    後端RS 02
    nginx04
    172.24.10.24
    後端RS 03
    所有節點安裝Nginx:略
    配置RS測試頁面:
      1 [root@nginx02 ~]# mkdir /usr/share/nginx/balanc/
      2 [root@nginx02 ~]# echo '<h1>Rs_172.24.10.22</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx02 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
      2 server {
      3     listen  9090;
      4     server_name 172.24.10.22;
      5     location / {
      6         root   /usr/share/nginx/balanc;
      7         index  index.html;
      8         access_log  /var/log/nginx/rs.access.log  main;
      9         error_log   /var/log/nginx/rs.error.log  warn;
     10     }
     11 }
     12 EOF
      1 [root@nginx02 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@nginx02 ~]# nginx -s reload			#過載配置檔案

      1 [root@nginx03 ~]# mkdir /usr/share/nginx/balanc/
      2 [root@nginx03 ~]# echo '<h1>Rs_172.24.10.23</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx03 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
      2 server {
      3     listen  9090;
      4     server_name 172.24.10.23;
      5     location / {
      6         root   /usr/share/nginx/balanc/;
      7         index  index.html;
      8         access_log  /var/log/nginx/rs.access.log  main;
      9         error_log   /var/log/nginx/rs.error.log  warn;
     10     }
     11 }
     12 EOF
      1 [root@nginx03 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@nginx03 ~]# nginx -s reload			#過載配置檔案

      1 [root@nginx04 ~]# mkdir /usr/share/nginx/balanc/
      2 [root@nginx04 ~]# echo '<h1>Rs_172.24.10.24</h1>' > /usr/share/nginx/balanc/index.html
      1 [root@nginx04 ~]# cat > /etc/nginx/conf.d/rs.conf <<EOF
      2 server {
      3     listen  9090;
      4     server_name 172.24.10.24;
      5     location / {
      6         root   /usr/share/nginx/balanc/;
      7         index  index.html;
      8         access_log  /var/log/nginx/rs.access.log  main;
      9         error_log   /var/log/nginx/rs.error.log  warn;
     10     }
     11 }
     12 EOF
      1 [root@nginx04 ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@nginx04 ~]# nginx -s reload			#過載配置檔案
      3 [root@client ~]# curl 172.24.10.22:9090
      4 <h1>Rs_172.24.10.22</h1>
      5 [root@client ~]# curl 172.24.10.23:9090
      6 <h1>Rs_172.24.10.23</h1>
      7 [root@client ~]# curl 172.24.10.24:9090
      8 <h1>Rs_172.24.10.24</h1>

    3.2 預設輪詢方式配置

      1 [root@nginx01 ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     server 172.24.10.22:9090;
      4     server 172.24.10.23:9090;
      5     server 172.24.10.24:9090;
      6 }
      7 
      8 server {
      9     listen  80;
     10     server_name  balance.linuxds.com;
     11     access_log  /var/log/nginx/mybalance.access.log  main;
     12     error_log   /var/log/nginx/mybalance.error.log  warn;
     13     location / {
     14         proxy_pass http://mybalance01;
     15         index index.html;
     16         proxy_redirect     off;
     17         proxy_set_header   Host             $host;
     18         proxy_set_header   X-Real-IP        $remote_addr;
     19         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
     20         client_max_body_size       10m;		#允許客戶端請求的最大單檔案位元組數
     21         client_body_buffer_size    128k;	#緩衝區代理緩衝使用者端請求的最大位元組數
     22         proxy_connect_timeout      300;		#nginx跟後端伺服器連線超時時間(代理連線超時)
     23         proxy_send_timeout         300;		#後端伺服器資料回傳時間(代理髮送超時)
     24         proxy_read_timeout         300;		#連線成功後,後端伺服器響應時間(代理接收超時)
     25         proxy_buffer_size          4k;		#設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
     26         proxy_buffers              4 32k;	#proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
     27         proxy_busy_buffers_size    64k;		#高負荷下緩衝大小(proxy_buffers*2)
     28         proxy_temp_file_write_size 64k;		#設定快取資料夾大小,大於這個值,將從upstream伺服器傳
     29     }
     30 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案

    3.3 確認測試

    瀏覽器訪問:http://balance.linuxds.com/,並且重新整理3次測試效果。
    clipboard

    四 加權輪詢負載均衡

    4.1 環境預設

    參考3.1。

    4.2 加權輪詢方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     server 172.24.9.11:9090 weight=1 max_fails=1 fail_timeout=2;
      4     server 172.24.9.12:9090 weight=8 max_fails=2 fail_timeout=2;
      5     server 172.24.9.13:9090 backup;		#配置為備份伺服器
      6 }
      7 
      8 server {
      9     listen  80;
     10     server_name  balance.linuxds.com;
     11     access_log  /var/log/nginx/mybalance.access.log  main;
     12     error_log   /var/log/nginx/mybalance.error.log  warn;
     13     location / {
     14         proxy_pass http://mybalance01;
     15         index index.html;
     16         proxy_redirect     off;
     17         proxy_set_header   Host             $host;
     18         proxy_set_header   X-Real-IP        $remote_addr;
     19         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
     20         client_max_body_size       10m;
     21         client_body_buffer_size    128k;
     22         proxy_connect_timeout      300;
     23         proxy_send_timeout         300;
     24         proxy_read_timeout         300;
     25         proxy_buffer_size          4k;
     26         proxy_buffers              4 32k;
     27         proxy_busy_buffers_size    64k;
     28         proxy_temp_file_write_size 64k;
     29     }
     30 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案
    配置釋義:
    weight:引數值越高則被分配到的概率越大。

    4.3 確認測試

    瀏覽器訪問:http://balance.odocker.com/,並且重新整理3次測試效果。此時測試172.24.9.12更容易被分配,172.24.9.13在其他RS正常的時候不會參與響應。

    五 最小連線負載均衡

    5.1 環境預設

    參考3.1。

    5.2 最小連線方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     least_conn;
      4     server 172.24.10.21:9090;
      5     server 172.24.10.22:9090;
      6     server 172.24.10.23:9090;
      7 }
      8 
      9 server {
     10     listen  80;
     11     server_name  balance.linuxds.com;
     12     access_log  /var/log/nginx/mybalance.access.log  main;
     13     error_log   /var/log/nginx/mybalance.error.log  warn;
     14     location / {
     15         proxy_pass http://mybalance01;
     16         index index.html;
     17     }
     18 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案

    5.3 確認測試

    瀏覽器訪問:http://balance.linuxds.com/。
    提示:此方式主要應用於請求處理時間長短不一造成伺服器過載的情況。

    六 IP hash負載均衡

    6.1 環境預設

    參考3.1。

    6.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     ip_hash;
      4     server 172.24.10.21:9090;
      5     server 172.24.10.22:9090;
      6     server 172.24.10.23:9090;
      7 }
      8 
      9 server {
     10     listen  80;
     11     server_name  balance.linuxds.com;
     12     access_log  /var/log/nginx/mybalance.access.log  main;
     13     error_log   /var/log/nginx/mybalance.error.log  warn;
     14     location / {
     15         proxy_pass http://mybalance01;
     16         index index.html;
     17     }
     18 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案

    6.3 確認測試

    瀏覽器訪問:http://balance.linuxds.com/。
    提示:此方式主要應用於會話保持。

    七 fair負載均衡

    7.1 環境預設

    參考3.1。

    7.2 fair方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     fair;
      4     server 172.24.10.21:9090;
      5     server 172.24.10.22:9090;
      6     server 172.24.10.23:9090;
      7 }
      8 
      9 server {
     10     listen  80;
     11     server_name  balance.linuxds.com;
     12     access_log  /var/log/nginx/mybalance.access.log  main;
     13     error_log   /var/log/nginx/mybalance.error.log  warn;
     14     location / {
     15         proxy_pass http://mybalance01;
     16         index index.html;
     17     }
     18 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案

    7.3 確認測試

    瀏覽器訪問:http://balance.linuxds.com/。
    提示:該方式下響應快的伺服器都會優先分配,接著才會分配響應速度較慢的伺服器。因此此方式主要應用於後端伺服器效能不均一。

    八 url_hash負載均衡

    8.1 環境預設

    參考3.1。

    8.2 ip hash方式配置

      1 [root@balance ~]# vi /etc/nginx/conf.d/balance.conf
      2 upstream mybalance01 {
      3     hash $request_uri;
      4     hash_method crc32;
      5     server 172.24.10.21:9090;
      6     server 172.24.10.22:9090;
      7     server 172.24.10.23:9090;
      8 }
      9 
     10 server {
     11     listen  80;
     12     server_name  balance.linuxds.com;
     13     access_log  /var/log/nginx/mybalance.access.log  main;
     14     error_log   /var/log/nginx/mybalance.error.log  warn;
     15     location / {
     16         proxy_pass http://mybalance01;
     17         index index.html;
     18     }
     19 }
      1 [root@balance ~]# nginx -t -c /etc/nginx/nginx.conf	#檢查配置檔案
      2 [root@balance ~]# nginx -s reload			#過載配置檔案

    8.3 確認測試

    瀏覽器訪問:http://balance.linuxds.com/。
    提示:此方式主要應用於後端伺服器為快取時比較適用。
    參考文件:
    https://ifeve.com/nginx-http/
    https://www.cnblogs.com/lcword/p/11800474.html

    相關文章