1. 程式人生 > >Nginx進階之負載均衡服務

Nginx進階之負載均衡服務

進階階段回顧:

Nginx進階之靜態Web資源服務

Nginx進階之代理服務

模型:

① GSLB(全域性負載均衡), 特點: 節點龐大, 範圍廣

② SLB(伺服器負載均衡), 特點: 範圍小, 實時性/響應性好

SLB分為四層負載均衡和七層負載均衡, Nginx是典型的七層負載均衡.

Nginx的負載均衡:

測試Nginx的負載均衡

要測試Nginx的負載均衡功能需要兩臺伺服器, 192.168.19.134和192.168.19.136

136伺服器提供三個server服務:

134伺服器提供負載均衡服務:

客戶端(瀏覽器)訪問:

http://192.168.19.134

預設的結果是在這3個服務埠之間輪詢

可以使用命令關閉其中某個埠, 模擬其中一個服務掛掉的情況, 測試其他兩個服務還能否正常訪問.

命令如下:

iptables -I INPUT -p tcp --dport 8082 -j DROP   #關閉8082埠

iptables -I INPUT -p tcp --dport 8082 -j ACCEPT  #開啟8082埠

測試結果是8082埠的服務無法訪問, 而其他兩個服務正常訪問.

上面提到的upstream模組還有其他的配置項:

upstream [自定義的虛擬服務的名稱, 如上面我自定義的"testSLB"] {

    server [域名的寫法www.example.com] weight=[權重值越大則訪問越多, 值為1/2/3/4/5/...];

    server [域名+埠的寫法www.example.com:8080];

    server [socket的寫法unix:/tmp/...];

}

配置引數:

down 表示當前的server不參與負載均衡
backup 備份伺服器, 當其他服務沒有完全掛掉的情況下不使用該備份伺服器, 一旦全部掛掉, 則啟用該備份伺服器
max_fails 允許請求失敗的次數, 如: max_fails=1
fail_timeout 經過max_fails失敗後服務暫停的時間, 如: fail_timeout=10s
max_conns 限制最大的接收連線數(用於每臺伺服器配置不統一的情況, 降低低配置伺服器的壓力)

進入134伺服器的.conf配置, 在upstream的每一臺server後面加上對應的引數再測試

測試結果是隻能訪問到8083埠, 利用上面的命令關閉8083埠, 測試能夠訪問到的是8082埠.

Nginx的排程演算法

Nginx的排程演算法預設是輪詢策略, 依次訪問.

排程演算法:

輪詢 按照時間順序逐一分配到不同的後端伺服器
加權輪詢 weight值越大, 分配到的訪問機率就越大
ip_hash 每個請求按照訪問的ip的hash結果進行分配, 使得來自同一個ip的固定訪問同一個後端伺服器
least_conn 最少連結數, 當前哪個伺服器的連線數少就分發給哪個伺服器
url_hash 每個請求按照訪問的url的hash結果進行分配, 使得來自同一個url的請求定向到同一個後端伺服器
hash關鍵值 hash自定義的key

測試加權輪詢:

134伺服器的配置:

輪詢和加權輪詢都是基於請求來實現的, 這種輪詢有個缺點會導致使用者的cookie等資訊丟失, 可以採取ip_hash的排程演算法:

此時通過ip下的方問就只會固定一個server

ip_hash的缺陷在於, 如果使用者在前端再走代理的話, 此時nginx是無法獲取到使用者的真是ip的, 同時如果使用者訪問的後臺是多臺伺服器的話, 那麼會導致使用者的快取發生改變, 那麼資訊也將發生改變.

解決辦法: hash關鍵值/url_hash

url_hash跟hash關鍵值其實是同一個道理, 配置語法如下:

systax: hash [key, 如$request_uri]

default: 無配置

context: upstream域

進入.conf檔案進行配置:

134伺服器:

136伺服器分別在code1/code2/code3裡面新增url1.html/url2.html/url3.html檔案, 用於區別訪問的路徑而已.

重新載入配置檔案

訪問: http://192.168.19.134/url1.html, 此時只能定向訪問到server1下的url1.html, 

訪問: http://192.168.19.134/url2.html, 此時只能定向訪問到server3下的url2.html,

訪問: http://192.168.19.134/url3.html, 此時只能定向訪問到server2下的url3.html,

具體訪問哪臺伺服器則根據url的hash計算結果進行分發的.