nginx系列之實現簡單的負載均衡

2021-07-27 04:07:10 字數 3450 閱讀 1845

負載均衡,個人理解,旨在於把客戶端的請求均勻地發到後端伺服器來處理,以解決單機處理能力有限的問題,同時又不讓某個伺服器負擔過重。

用nginx實現負載均主要使用upstream和proxy這個兩個模組。目前nginx的負載均衡有輪詢、ip _hash(按照客戶段ip位址來分配)、least_conn(優先選擇活動連線數最少的上游伺服器)、least_time(優先選擇處理時間最短的上游伺服器)這4種方法,預設是輪詢,可以帶權重。

筆者用的是openresty,主要是因為第三方模組眾多,其中用echo模組的echo指令可以直接向客戶端輸出內容,使得除錯方便不少。

環境搭建得益於nginx命令的 -c 選項,該選項可以讓nginx以不同的配置檔案啟動。本次測試在一台個人筆記本中進行,共開啟4個nginx服務主程序,其中1個監聽在80埠,作為負載均衡器。另外3個分別監聽8001、8002、8003埠,分別命名為server-8001、server-8002、server-8003,作為上游伺服器。

2.1 輪詢方法

upstream

@backend

將該配置置於http上下文中。

該配置定義了一組伺服器組,命名為@backend。預設是輪詢方式,請求是平均分給每乙個上游伺服器的。

location /
將該配置置於server上下文中。

proxy_set_header指令的作用是設定傳給上游伺服器的請求頭,proxy_set_header host $host 的作用是讓上游伺服器獲取到客戶端請求的真實「host」 http請求頭 。proxy_set_header x-real-ip $remote_addr的作用是讓上游伺服器獲取到真實的客戶端位址,否則獲取到的都是**伺服器的位址。

proxy_pass http://@backend,把請求傳給上游伺服器組@backend處理。

server
儲存與於conf目錄下,命名為server-8001.conf。分別用8002、8003替換8001,儲存為server-8002.conf, server-8003.conf。

測試:

第一步:開啟命令列,切換到nginx安裝目錄,輸入兩次 「start」 命令,這樣有3個相同路徑的命令列視窗了。

第二步:啟動上游伺服器,分別在3個命令列視窗輸入:

nginx -c conf/server-8001.conf

nginx -c conf/server-8002.conf

nginx -c conf/server-8003.conf

第三步:啟動負載均衡器,開啟瀏覽器,訪問 localhost,重新整理8次。

結果如下:

serving at

8001

serving at

8003

serving at

8002

serving at

8001

serving at

8003

serving at

8002

serving at

8001

serving at

8003

serving at

8002

共9次請求,依次按server-8001、server-8003、server-8002順序把請求分配到上游伺服器,的確是輪詢方法。

要使請求不分配給某台上游伺服器,可以在upstream上下文中的server指令後面增加down引數。如:

upstream

@backend

該配置使得請求不分配給server-8001。

重啟伺服器,在瀏覽器中訪問localhost,重新整理幾次,可以看到,輸出的不是 「serving at 8003」 就是 「serving at 8002」,server-8001並未收到任何請求。

2.2 帶權重的輪詢

帶權重的輪詢主要用於上游伺服器效能不一樣的情況,預設權重都是1。可以給效能好的伺服器設定大一點的權重,效能差的伺服器設定小一點的權重。

把負載均衡器的upstream指令改為如下:

upstream

@backend

該配置的功能是把伺服器8001的權重設為3,也就是說,平均每5個請求,3個分配給伺服器8001,另外2個平均分配給剩下的伺服器。

重啟伺服器,用以下php指令碼測試:

$count = 0;

$result = ;

while ($count++ < 15)

foreach ($result

as$k => $v)

輸出:

serving at

8001

serving at

8002

serving at

8001

serving at

8003

serving at

8001

serving at

8001

serving at

8002

serving at

8001

serving at

8003

serving at

8001

serving at

8001

serving at

8002

serving at

8001

serving at

8003

serving at

8001

serving at

8001 => 9

serving at

8002 => 3

serving at

8003 => 3

共15次請求,每5次請求,3個分配給了server-8001,1個分配給了server-8002, 1個分配給了server-8003。三個伺服器分配到請求的比例是3:1:1,跟負載均衡器配置的一樣。

2.3 按ip分配(ip_hash)

按ip分配要用到ip_hash指令,使得同乙個ip的請求會分配到相同的上游伺服器。用於解決session/cookie共享問題。

把負載均衡器的upstream指令改為如下:

upstream

@backend

重啟伺服器,用瀏覽器多次訪問localhost,都是輸出:

serving at

8003

本地測試,ip位址是127.0.0.1,負載均衡器把請求都分配給了sever-8003。

另外還有2個負載均衡方式是最少連線數和最短請求處理時間,分別對應指令least_conn、least_time,有時間再做測試。

Nginx學習之實現Nginx負載均衡

在集群環境下存在多台伺服器,我們需要將請求分發到多個伺服器上,將負載分發到不同的伺服器上,這就是負載均衡。輪詢是預設的分配策略,每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,會自動刪除它。weight代表權重,預設為1,權重越高被分配的客戶端越多。每個請求按訪問ip的has...

nginx 負載均衡簡單實現

nginx能夠實現負載均衡,在被反向 的伺服器中進行按需的負載均衡配置 下面是乙個配置檔案 其中主要的內容是這裡 upstream backend server location ngtt location testnnnn error page 404 404.html redirect serv...

Nginx實現簡單的負載均衡

192.168.74.201 nginx php 主 centos7.3 64位 192.168.74.202 nginx php 副 centos7.3 64位 192.168.74.203 nginx php 副 centos7.3 64位 安裝nginx 192.168.74.201 wget...