012.Nginx負載均衡

来源:https://www.cnblogs.com/itzgr/archive/2020/07/17/13330613.html
-Advertisement-
Play Games

一 負載均衡概述 1.1 負載均衡介紹 負載均衡是將負載分攤到多個操作單元上執行,從而提高服務的可用性和響應速度,帶給用戶更好的體驗。對於Web應用,通過負載均衡,可以將一臺伺服器的工作擴展到多台伺服器中執行,提高整個網站的負載能力。其本質採用一個調度者,保證所有後端伺服器都將性能充分發揮,從而保持 ...


一 負載均衡概述

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
    您的分享是我們最大的動力!

    -Advertisement-
    Play Games
    更多相關文章
    • ASP.NET中 params 是關鍵字,可以指定在參數數目可變處採用參數的方法參數。在函數的參數數目可變而執行的代碼差異很小的時候很有用! 在方法聲明中的 params 關鍵字之後不允許任何其他參數,並且在方法聲明中只允許一個 params 關鍵字。 形式為:方法修飾符 返回類型 方法名(para ...
    • When working with Web applications, use a context instance per request. Install-Package EntityFramework -Version using System.Data.Entity; public clas ...
    • 這是系列文章中的第一篇:使用GraphvizOnline可視化ASP.NETCore3.0終結點。. 第1部分-使用DOT語言來可視化你的ASP.NETCore3.0終結點(本文) 第2部分-向ASP.NET Core應用程式添加終結點圖 第3部分-使用ImpromptuInterface創建一個自 ...
    • Tips:本篇已加入系列文章閱讀目錄,可點擊查看更多相關文章。 前言 上一篇【.Net Core微服務入門全紀錄(八)——Docker Compose與容器網路】完成了docker-compose.yml文件的編寫,最後使用docker compose的一個up指令即可在docker中運行整個複雜的 ...
    • 背 景 Read the fucking source code! --By 魯迅 A picture is worth a thousand words. --By 高爾基 說明: Kernel版本:4.14 ARM64處理器,Contex-A53,雙核 使用工具:Source Insight 3 ...
    • 前言 ​ 最近公司里比較新的項目裡面,看到了很多關於java8新特性的用法,由於之前自己對java8的新特性不是很瞭解也沒有去做深入研究,所以最近就系統的去學習了一下,然後總結了一篇文章第一時間和大家分享一下。 ​ ​ 在瞭解一項新技術之前,我們需要瞭解我們為什麼要去學習它以及它的優點,以下是我總結 ...
    • TiDB 是 PingCAP 公司自主設計、研發的開源分散式關係型資料庫,是一款同時支持線上事務處理與線上分析處理 (Hybrid Transactional and Analytical Processing, HTAP)的融合型分散式資料庫產品,具備水平擴容或者縮容、金融級高可用、實時 HTAP... ...
    • 首先參照https://www.cnblogs.com/wdw984/p/13330074.html,來進行如何安裝Centos和離線下載rpm包。 離線下載jemalloc,上傳到CentOS的/data/rpm/jemalloc目錄 因為redis6.0.5推薦使用jemalloc管理記憶體,所以 ...
    一周排行
      -Advertisement-
      Play Games
    • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
    • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
    • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
    • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
    • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
    • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
    • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
    • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
    • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
    • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...