文章目錄
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會根據權重輪詢,分發請求
第一次請求:
第二次請求:
第三次請求: