需要學會的Nginx知識——負載均衡和緩存

操作系統:CentOS-7.8
nginx版本:1.18.0
Tomcat版本:9.0.36

在上一篇文章中我們對Nginx進行了簡單介紹,也學習了nginx的基本配置和操作,今天這次我們將學習Nginx在生產中常被使用的功能負載均衡和緩存加速。上一篇文章《需要學會的Nginx知識》

一、概念

1.OSI七層網絡模型

OSI七層網絡模型是國際標準化組織(ISO)制定的一個用於計算機或通信系統間互聯的標準體系

應用層。網絡服務與最終用戶的一個接口,與用戶交互

應用層是與用戶最近的一層,應用層爲用戶提供了交互接口,以此來爲用戶提供交互服務。在這一層常用的協議有HTTP,HTTPS,FTP,POP3等。

表示層。數據的表示、安全、壓縮

表示層提供數據格式編碼以及加解密功能,確保從請求端發出的數據到響應端能被識別。

會話層。創建、管理和銷燬會話

會話存在於從請求發出到接受響應這個過程之間,會話層充當這一過程的管理者,包括會話創建、維持到銷燬

傳輸層。定義傳輸數據的協議端口號,以及流控和差錯校驗等功能

傳輸層創建以及管理端到端的連接,提供數據傳輸服務。在傳輸層常見的協議是TCP、UDP協議

網絡層。進行邏輯地址尋址,實現不同網絡之間的路徑選擇

網絡層也被稱爲IP層,在網絡層中通過IP尋址來建立兩個節點之間的連接,選擇合適的路由和交換節點,正確無誤地按照地址將數據傳送給目的端的運輸層。

數據鏈路層。建立邏輯連接、進行硬件地址尋址、差錯校驗,提供介質訪問和鏈路管理

數據鏈路層會提供計算機MAC地址,通信的時候會攜帶,爲了確保數據的正確投遞,會對MAC地址進行校驗,以保證請求響應的可靠性

物理層。傳輸介質,物理媒介

物理層是端到端通信過程的物理介質,實際最終信號的傳輸都是通過物理層實現的。常用設備有(各種物理設備)集線器、中繼器、調制解調器、網線、雙絞線、同軸電纜等,這些都是物理層的傳輸介質。

2.負載均衡

負載均衡是指將負載(工作任務)進行平衡、分攤到多個操作單元上進行運行,在網絡應用中就是根據請求的信息不同,來決定怎麼樣轉發流量。

負載均衡建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力、提高網絡的靈活性和可用性。

在OSI七層網絡模型的基礎上,負載均衡也有不同的分類,主要有以下幾種

  • 二層負載:基於MAC地址,通過一個虛擬MAC地址接受請求,然後再分配到真實的MAC地址。

  • 三層負載:基於IP地址,通過一個虛擬IP地址,然後再分配到真實的IP。

  • 四層負載:基於IP和端口,通過虛機的IP+端口接收請求,然後再分配到真實的服務器,LVS是典型的四層負載均衡應用

  • 七層負載:基於應用信息,通過虛機主機名或者URL接收請求,再根據一些規則分配到真實的服務器,nginx就是典型的七層負載均衡應用

二、配置

1、負載均衡策略

輪詢

輪詢策略下,所有上游服務器被訪問到的概率是一致的,且是按照一定的順序依次被請求到。如下示例配置,hdh100:9001、hdh100:9002和hdh100:9003三臺tomcat服務器依次被請求,每刷新一次就切換一次。


#上游tomcat集羣
upstream www.learn.com{
        server hdh100:9001;
        server hdh100:9002;
        server hdh100:9003;
}

#反向代理服務器
server {
        listen 80;
        server_name www.learn.com;

        location / {
                proxy_pass http://www.learn.com;
        }
}

加權輪詢

加權輪詢策略下,是按照每個上游服務器分配的權重不同處理的連接數也不同,權重越大,被訪問到的次數就越多。如下示例配置,hdh100:9001、hdh100:9002和hdh100:9003的權重分別是1,3,5,權重越大,被分配的流量就越多。


#上游tomcat集羣,後面weight就是配置權重,在設置weight時,默認權重是1
upstream www.learn.com{
        server hdh100:9001 weight=1;
        server hdh100:9002 weight=3;
        server hdh100:9003 weight=5;
}

#反向代理服務器
server {
        listen 80;
        server_name www.learn.com;

        location / {
                proxy_pass http://www.learn.com;
        }
}

ip_hash

ip_hash是根據用戶的ip進行hash散列將其請求分配到指定上游服務器。在用戶ip沒有發生變化的情況下,且上游服務器無變更時,用戶的多次請求都會被轉發到同一臺上遊服務器。

且在使用ip_hash負責均衡策略時,如果需要臨時刪除其中一臺服務器,則應使用down參數對其進行標記,以便保留客戶端IP地址的當前哈希值。


upstream www.learn.com{
	   ip_hash;
	   
        server hdh100:9001 weight=1;
        server hdh100:9002 weight=3;
        server hdh100:9003 weight=5;
}

url_hash

url_hash策略是根據url進行hash散列將其請求分配到指定的上游服務器。同一個url在上游服務器沒有發生變更的情況下是請求到同一臺服務器。


upstream www.learn.com{
	   hash $request_uri;
	   
        server hdh100:9001 weight=1;
        server hdh100:9002 weight=3;
        server hdh100:9003 weight=5;
}

last_conn

last_conn將流量分發到當前連接數最少的服務器上的一個策略


upstream www.learn.com{
	   least_conn;
	   
        server hdh100:9001 weight=1;
        server hdh100:9002 weight=3;
        server hdh100:9003 weight=5;
}


2、優化配置

max_conns

限制上游服務器的最大連接數,用於保護避免過載,可以起到限流的作用,在nginx1.11.5之前,該配置只能作用於商業版本的nginx,默認值是0表示沒有限制,配置如下:


#上游服務器配置,每個服務器都可以設置max_conns
upstream www.learn.com{
        server hdh100:9001 max_conns=200;
        server hdh100:9002 max_conns=200;
        server hdh100:9003 max_conns=200;
}

slow_start

緩慢開始,當我們給上游服務器設置權重時,在配置了slow_start的情況下,該服務的權重是從0在配置的時間內慢慢增長到所配置的權重,該配置目前是在商業版本的nginx中生效

  • slow_start不適用hash和random load balancing

  • 上游服務器只有一臺的情況下,該參數也無效

如下配置則表示hdh100:9003這個服務,在啓動後的60s內權重是從0慢慢提升到5。


#上游服務器配置,給hdh100:9003配置了權重5和slow_start 60s,則在集羣啓動後該服務器的權重是在60s的時間內慢慢從0變爲5
upstream www.learn.com{
        server hdh100:9001 weight=1;
        server hdh100:9002 weight=3;
        server hdh100:9003 weight=5 slow_start=60s;
}


down和backup

down是將標記的服務器移除當前的服務器集羣,被標記的服務器不會被訪問到。

backup表示的是備用的意思,即在其他服務器可以提供服務的時候被backup標記的服務器不會被訪問到,當其他服務器都掛掉後,backup標記的服務開始提供服務。


#down配置示例,如下配置,則hdh100:9001這臺服務器是不能提供服務的,不會被分配流量
upstream www.learn.com{
        server hdh100:9001 down;
        server hdh100:9002;
        server hdh100:9003;
}

#backup配置示例,如下配置,在hdh100:9002和hdh100:9003正常服務的時候,hdh100:9001不會提供服務,僅當另外兩臺服務都掛掉後,hdh100:9001開始提供服務
upstream www.learn.com{
        server hdh100:9001 backup;
        server hdh100:9002;
        server hdh100:9003;
}


max_fails和fail_timeout

max_fails是一個驗證服務器是否能提供正常服務的校驗,需結合fail_timeout使用,表示在一定時間段內請求當前服務失敗的次數超過該值時,則認爲該服務宕機失敗掉,就將該服務剔除上游服務器集羣,不再給其分配訪問流量。

fail_timeout表示失敗服務的重試時間,即當該服務器被認爲宕機失敗時,間隔指定時間後再來重新嘗試請求,如果仍請求失敗則繼續間隔指定時間再嘗試請求,一直重複這種行爲


#如下是示例配置,表示在30s的時間內請求hdh100:9001的失敗次數超過10次時,則認爲hdh100:9001服務宕機,則隨後的30s內該服務器不再被分配請求,30s後會重新嘗試請求該服務器,若仍然請求失敗,則重複上述行爲
upstream www.learn.com{
        server hdh100:9001 max_fails=10 fail_timeout=30s;
        server hdh100:9002;
        server hdh100:9003;
}

keepalive

設置nginx和上游服務器直接保持的長連接數量,目的是爲了減少創建連接和關閉連接的損耗


#如下示例,設置保持的長連接數量爲32
upstream www.learn.com{
        server hdh100:9001 max_fails=10 fail_timeout=30s;
        server hdh100:9002;
        server hdh100:9003;
        
        keepalive 32
}

#設置http版本爲1.1,默認是http1.0版本是短連接
#設置Connection header爲空
server {
        listen 80;
        server_name www.learn.com;

        location / {
                proxy_pass http://www.learn.com;
                proxy_http_version 1.1;
                proxy_set_header Connection "";
        }
}


3、緩存配置

nginx緩存

瀏覽器中的緩存加快單個用戶瀏覽器的訪問的速度,緩存是存在瀏覽器本地。


location / {
            root   html;
            index  index.html;
            
            #設置緩存過期時間爲10s
            # expires 10s;
            #設置具體到期時間,如下示例代表緩存過期時間爲晚上10點30分時
		 # expires @22h30m;
		 #設置過期時間爲現在的前一個小時,則代表不使用緩存
		 # expires -1h;
		 #設置不使用緩存
		 # expires epoch;
		 # nginx關閉expires,則緩存機制是根據瀏覽器而定的
		 # expires off;
		 #設置緩存過期時間最大
		 # expires max;
        }
        

nginx反向代理緩存

反向代理緩存是將,要代理的上游服務器的數據緩存在nginx端,目的是爲了提升訪問nginx端的用戶的訪問速度


#proxy_cache_path 設置存儲存儲目錄
#keys_zone 設置名稱以及共享內存大小
#max_size 設置緩存大小
#inactive設置緩存過期時間,超過該時間則被清理
#use_temp_path設置是否使用臨時目錄,默認是使用,在這裏設置關閉
proxy_cache_path /home/local/cache  keys_zone=learncache:5m max_size=2g inactive=60s use_temp_path=off;

server {
        listen 80;
        server_name www.learn.com;

	   #開啓緩存
	   proxy_cache learncache;
	   #對200和304狀態的請求設置緩存過期時間
	   proxy_cache_valid 200 304 1h;

        location / {
                proxy_pass http://www.learn.com;
        }
}


個人公衆號【愛做夢的錘子】,全網同id,個站 http://te-amo.site,歡迎關注,裏面會分享更多有用知識,還有我的私密照片

覺得不錯就點個贊叭QAQ

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章