012.Nginx負載均衡

一 負載均衡概述


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 確認測試


    瀏覽器訪問://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 確認測試


    瀏覽器訪問://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 確認測試


    瀏覽器訪問://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 確認測試


    瀏覽器訪問://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 確認測試


    瀏覽器訪問://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 確認測試


    瀏覽器訪問://balance.linuxds.com/。


    提示:此方式主要應用於後端伺服器為快取時比較適用。


    參考文檔:


    //ifeve.com/nginx-http/


    //www.cnblogs.com/lcword/p/11800474.html