1. 程式人生 > 程式設計 >Nginx反向代理和負載均衡(後端複習)

Nginx反向代理和負載均衡(後端複習)

Nginx反向代理和負載均衡(後端複習)

一,Nginx基礎

1.Nginx簡介

nginx是一個開源高效能,可靠的http中介軟體,代理服務。它是一個web伺服器,可以用作反向代理,負載均衡器和http快取

2.Nginx由來

早期

一個網站的初期,訪問的流量比較小,選用的架構可能就是使用者通過域名,經過域名解析,拿到後端伺服器的IP地址,直接訪問這個ip對應的Tomcat伺服器。

發展

隨著使用者流量的增大,一臺Tomcat伺服器無法滿足使用者的請求,人們會想到兩個辦法:

  • 垂直擴充套件:升級伺服器硬體(成本高)
  • 水平擴充套件:增加新的伺服器來分擔流量(DNS伺服器難以管理這麼多的ip)
    • 後端的某臺機器宕機後,DNS 伺服器不知道該機器宕機,仍然解析到了這個 IP,如果使用者訪問到了這個宕機的 IP,那麼系統無法為使用者提供服務;
    • DNS 伺服器配置新的 IP 後,它不會立即生效,那麼在它生效的這個時間段,新加的伺服器不會為使用者提供服務。

反向代理和負載均衡

現在,使用者通過域名訪問,DNS伺服器返回反向代理伺服器的IP,反向代理伺服器根據被代理伺服器的IP配置和負載均衡策略,轉發使用者的請求到不同的後端伺服器處理,後端伺服器將處理結果響應給反向代理伺服器,在通過反向代理伺服器反映給使用者。這就是nginx所要做的.

叢集

隨著流量的繼續增大,單臺反向代理伺服器成為了瓶頸,我們就會對其做叢集,解決高效能的問題,對其做主備解決高可用的問題。

二,Nginx反向代理實現

1.正向代理和反向代理

正向代理

  • 正向代理隱藏了真實的客戶端,服務端不知道是哪個客戶端請求服務端,雖然客戶端是通過代理伺服器請求的服務端,但是因為服務端只知道是代理伺服器的請求,所以,正向代理可以將真實客戶端和代理伺服器整個看成一個客戶端

在這裡插入圖片描述

反向代理

  • 反向代理則和正向代理相反,在反向代理中,客戶端不知道請求的服務端是誰,只知道是代理伺服器帶來的響應,所以在反向代理中,可以將服務端和代理伺服器整體看成是服務端。

在這裡插入圖片描述

2.反向代理例項

啟動Tomcat8080埠

在這裡插入圖片描述

將本機ip加監聽埠的請求轉發到8080埠

    server {
        listen       8082;  #監聽埠
        
        #server_name  localhost;

		location / {
            proxy_pass   http://127.0.0.1:8080;
			proxy_set_header Host $host;
			index  index.html index.htm index.jsp;
        }
複製程式碼

在這裡插入圖片描述

三,Nginx負載均衡實現

1.什麼是負載均衡?

負載均衡就是使用者通過(IP)訪問入口訪問nginx伺服器,nginx伺服器通過負載均衡策略將請求分發到某一個後端Tomcat伺服器

在這裡插入圖片描述

2. 負載均衡如何選擇要轉發的後端伺服器

  • 第一個就是確保所選擇的後端伺服器是正常工作的,能給對使用者的請求做出響應

  • 第二個就是根據負載均衡演演算法從健康伺服器池中進行選擇。

3.負載均衡演演算法

在具體談負載均衡演演算法時,我們先了解下nginx中的upstream模組中的引數

upstream test.net{
   #ip_hash;
     server 127.0.0.1:8082;
     server 127.0.0.1:8080;
    #server 127.0.0.1:8080 down;
    #server 127.0.0.1:8080 backup;
}
複製程式碼

在upstream模組中配置的是server即後端伺服器列表,上邊我配置了兩個,是同一ip下的(條件不允許我,也沒去弄虛擬機器器,願體諒)

- down:配上down的server不參與負載均衡
- weight:權重,weight越大的,權重越大
- backup:其他全部的非backup機器忙或者down的時候,才請求backup機器,backup 不能和ip_hash一起使用
- ip_hash:使用ip雜湊負載均衡演演算法,weight\backup 不能和 ip_hash 關鍵字一起使用。
-  least_conn 最少連線數
複製程式碼
  • 輪詢:

為第一個請求選擇健康池中的第一個後端伺服器,然後按順序往後依次選擇,直到最後一個,然後迴圈。 不必關心伺服器實際的連線數和當前的系統負載

​ 正常情況下沒配置,預設是輪詢演演算法

upstream test.net{
     server 127.0.0.1:8082;
     server 127.0.0.1:8080;
}
複製程式碼
  • ip_hash:

根據請求源的 IP 的雜湊(hash)來選擇要轉發的伺服器。這種方式可以一定程度上保證特定使用者能連線到相同的伺服器。如果你的應用需要處理狀態而要求使用者能連線到和之前相同的伺服器,可以考慮採取這種方式。(同一ip地址的客戶端,當後端伺服器列表不變時,他每次都會對映到同一臺後端伺服器進行訪問)

upstream test.net{
     ip_hash;
     server 127.0.0.1:8082;
     server 127.0.0.1:8080;
}
複製程式碼
  • 最小連線優先:

優先選擇連線數最少,也就是壓力最小的後端伺服器,在會話較長的情況下可以考慮採取這種方式。

upstream test.net{
     least_conn;
     server 127.0.0.1:8082;
     server 127.0.0.1:8080;
}
複製程式碼
  • 隨機分配:

    通過系統的隨機演演算法,隨機從後端伺服器列表選取一臺伺服器進行訪問

  • 加權輪詢:

    根據給後端伺服器分配的比重不同,nginx在分配請求時會根據權重不同,把配置高,負載低的機器配置更高的權重,讓這些機器處理更多的請求,讓配置低,負載高的機器分配的權重低,處理的請求少。 將請求順序且按照權重分配到後端。

    upstream test.net{
         server 127.0.0.1:8082 weight=3;
         server 127.0.0.1:8080 weight=1;
    }
    複製程式碼
  • 加權隨機:

    與加權輪詢法一樣,加權隨機法也根據後端機器的配置,系統的負載分配不同的權重。不同的是,它是按照權重隨機請求後端伺服器,而非順序。

4.例項

     upstream www.kevin.com {
         server 127.0.0.1:8082 weight=3;
         server 127.0.0.1:8080 weight=1;
     }


    server {
        listen       80;  #監聽埠
        
        #server_name  localhost;

		location / {
             proxy_pass   http://www.kevin.com;
			proxy_set_header Host $host;
			index  index.html index.htm index.jsp;
        }
複製程式碼

啟動一個springboot專案,內建Tomcat是8082埠,因為這是個原先的專案,我直接用來nginx測試,待會如果看到報錯500是因為請求需要token,但是看到這個之後,證明分到了這個埠

在這裡插入圖片描述

在開啟8080的tomacat

在這裡插入圖片描述

​ 在瀏覽器使用本機ip加監聽埠訪問,nginx會根據權重輪詢,分發請求

第一次請求:

在這裡插入圖片描述

第二次請求:

在這裡插入圖片描述

第三次請求:

在這裡插入圖片描述