(014)Nginx靜態資源web服務 負載均衡

2022-06-14 23:57:10 字數 3901 閱讀 6184

1、負載均衡簡介

負載均衡可以緩解單台服務的壓力,防止單點故障。負載均衡按照範圍分為gslb和slb,區別是影響範圍不同。gslb是乙個全域性負載均衡,節點龐大,地域範圍廣,往往以國家、省地區為單位進行全域性負載均衡。如圖:

gslb由排程中心節點、邊緣排程節點、應用服務中心節點、應用服務節點組成。不可能所有訪問都去請求中心節點,而是先去請求排程節點。比如張三在北京,先去請求排程節點,排程節點返回給張三對應的位址,張三根據位址請求對應的應用服務。排程節點由排程中心節點控制。

往往接觸最多的是slb:排程節點和服務節點在乙個服務單元或乙個地域裡面。請求過來給排程節點,排程節點**給服務節點,服務節點響應給客戶。如圖:

slb按照網路osi模型分為:四層負載均衡和七層負載均衡。

四層負載均衡在osi模型中的傳輸層,傳輸層支援到tcp/ip協議的控制,它只需對客戶端請求進行tcp/ip的包**就可以實現負載均衡,好處是效能快,只需要最底層進行應用處理,而不需要進行複雜的邏輯,只需要進行包的**。

七層負載均衡在osi模型中的應用層,可以完成許多應用方面協議的請求。比如http的應用層負載均衡:實現http資訊的改寫、頭資訊的改寫、安全應用規則的控制以及**、 rewrite等規則,nginx是乙個典型的七層負載均衡的slb。

2、配置語法

nginx負載均衡用到了proxy_pass,它把所有客戶端的請求**到後端的伺服器上,只是不是**到一台伺服器,而是一組虛擬的服務池,稱為upstream server,它裡面可以定義很多服務。當請求過來會通過upstream server分發到不同的服務上,實現負載均衡。語法如下:

大括號中可以是網域名稱、網域名稱:埠、網域名稱:埠 引數等,如下:

upstream backend

引數及其含義:

down:當前的server暫時不參與負載均衡。

backup:預留的備份伺服器,當其它節點不存活了,再啟動。

max_fails:允許請求失敗的次數,當請求失敗的次數用完了就不在嘗試,休息,執行fail_timeout。

fail_timeout:經過max_fails失敗後,服務暫停的時間。

max_conns:限制最大的接收的連線數,節點效能不一致時配置。

3、nginx的排程演算法

輪詢(預設):按時間順序逐一分配到不同的後端伺服器。

加權輪詢:weight值越大,分配到的訪問機率越高。

ip_hash:每個請求按訪問ip的hash結果分配,這樣來自同乙個ip的固定訪問乙個後端伺服器。

url_hash:按照訪問的url的hash結果來分配請求,是每個url定向到同乙個後端伺服器。

least_conn:最少連線數,哪個機器連線數少就分發。

hash關鍵數值:hash自定義的key。

ip_hash缺陷:如果前端再走一層**,那麼取到的remote_addr就不是使用者真實的ip。

4、示例

準備兩台虛擬機器151和152。151上配置nginx負載均衡,152上由nginx配置3個不同埠提供服務。

server 1

server 2

server 3

在152的/etc/nginx/conf.d中新建server1.conf、server2.conf、server3.conf,分別指定埠和首頁路徑

server 

... ...

}

server 

... ...

}

server 

... ...

}

在151的/etc/nginx/conf.d中新建upstream_test.conf,其中myload是定義的負載名字 

upstream myload 

server

... ...

}

1)演示輪詢和某節點宕機後依然能正常訪問

啟動152和151的nginx,瀏覽器輸入:驗證是輪流訪問3個埠。

驗證乙個節點宕機,剩餘的節點可以正常服務。現在用的是一台虛擬機器模擬3個應用,手動禁掉8002埠:

iptables -i input -p tcp --dport 8002 -j drop
再次訪問驗證是輪流訪問8001和8003埠。清除掉臨時的規則,使8002埠可以正常訪問:

iptables -f
清除掉規則後,瀏覽器輸入:變成了3個埠輪流訪問。

2)演示backup

重新修改151上的配置檔案,負載均衡部分改為如下:

upstream myload
重新啟動nginx,並訪問發現不在再輪詢,只有8003能訪問。使用iptables禁掉8003後發現8002頂了上來,8002可以訪問。重新啟用8003後,8002不可以訪問了,只有8003可以訪問。

3)演示加權輪詢

重新修改151上的配置檔案,負載均衡部分改為如下:

upstream myload
重新啟動nginx,並訪問發現訪問7次,有5次訪問的是埠8002,其它各訪問了1次。

4)演示ip_hash

重新修改151上的配置檔案,負載均衡部分改為如下:

upstream myload
重新啟動nginx,並訪問多次重新整理發現一直訪問8002,因為基於$remote_addr做hash,客戶端ip固定。

5)演示hash key

說明:ip_hash可以理解為hash key的變體,ip_hash是固定的ip訪問同一臺伺服器,hash key是固定的key訪問同一臺伺服器。在實際工作中,我們會遇到這種情況,瀏覽器請求乙個url,訪問的是伺服器1,伺服器1快取了一部分內容,瀏覽器又請求了一遍該url,訪問的是伺服器2,伺服器2又快取了一部分內容,這兩部分內容可能不一致,這樣瀏覽器訪問同乙個url可能會出現不一致的結果。原則上使用ip_hash可以解決,但是往往無法取到客戶端的ip。這時可以使hash key實現。語法如下:

下面演示一下hash $request_uri,請求的是同乙個url的時候就定位到同一臺伺服器上。

server 1 url 1

其餘8個html檔案基本類似,修改一下背景色和顯示內容即可

code1/url2.html:背景色yellow,顯示內容server 1 url 2code1/url3.html:背景色yellow,顯示內容server 1 url 3code2/url1.html:背景色red,   顯示內容server 2 url 1code2/url2.html:背景色red,   顯示內容server 2 url 2code2/url3.html:背景色red,   顯示內容server 2 url 3code3/url1.html:背景色blue,  顯示內容server 3 url 1code3/url2.html:背景色blue,  顯示內容server 3 url 2code3/url3.html:背景色blue,  顯示內容server 3 url 3
重新修改151上的配置檔案,負載均衡部分改為如下:

upstream myload
重新啟動nginx,並訪問多次重新整理發現同乙個url訪問同一臺伺服器。

備註:實際url可能很長,可以根據規則,使用表示式擷取後的來定位同一臺伺服器。hash key支援表示式。

Nginx 靜態資源Web服務

注 非伺服器動態生成的檔案 1 瀏覽器端渲染 html css js 2 jpeg gif png 1 配置語法 檔案讀取 2 配置語法 tcp nopush sendfile開啟情況下,提高網路包傳輸效率 3 配置語法 tcp nodelay keeplive連線下,提高網路包的傳輸實時性 注 無...

Nginx作為靜態資源Web服務

nginx作為靜態資源 cdn分發資源 配置語法 配置語法 將多個資源一起傳送 提高效率 作用 sendfile開啟的情況下 提高網路包的傳輸效率 配置語法 壓縮 nginx壓縮模組 http gzip static module 預讀gzip功能 http gunzip module 應用支援gu...

Nginx服務系列 靜態資源web服務

sendfile on off 預設off http server location if in location tcp nopush on off 預設off http server location sendfile開啟的情況下,提高網路包的傳輸效率 tcp nodelay on off 預設...