Nginx入門(2)反向代理和負載均衡

許帥發表於2019-03-26

一.什麼是負載均衡和反向代理

隨著網站訪問量的快速增長,單臺伺服器已經無法承擔大量使用者的併發訪問,必須採用多臺伺服器協同工作,以提高計算機系統的處理能力和計算強度,滿足當前業務量的需求。而如何在完成同樣功能的多個網路裝置之間實現合理的業務量分配,使之不會出現一臺裝置過忙,而其他的裝置卻沒有充分使用的情況。要解決這一問題,可以採用負載均衡的方法。

負載均衡

負載均衡是由多臺伺服器以對稱的方式組成一個伺服器集合,每臺伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助,通過某種負載分擔技術,將外部傳送來的請求均勻分配到對稱結構中的某一臺伺服器上,而接收到請求的伺服器獨立地迴應客戶的請求,負載均衡能夠平均分配客戶請求到伺服器陣列,藉此快速獲取重要資料,解決大量併發訪問服務問題。這種群集技術可以用最少的投資獲得接近於大型主機的效能。

常見的web負載均衡的方法

1.使用者手動選擇不同的線路,不同的伺服器連結的方式。例如:

Nginx入門(2)反向代理和負載均衡
2.DNS輪詢方式

大多域名註冊商都支援對同一主機名新增多條A記錄,這就是DNS輪詢,DNS伺服器將解析請求按照A記錄的順序,隨機分配到不同的IP上,這樣就完成了簡單的負載均衡。例如:

Nginx入門(2)反向代理和負載均衡
這樣我們每次訪問A的時候域名都會被隨機解析到其中一個IP上,從而實現負載均衡的目的。

DNS輪詢的兩個明顯缺點

  • 可靠行低

假設輪詢過程中有一臺伺服器故障,那麼所有訪問該伺服器的請求都將不會在有所迴應。即使從DNS中把這個故障的伺服器IP去除,他也需要一些時間才能生效。

  • 負載分配不均衡

DNS負載均衡採用的是最簡單的輪詢負載演算法,不能區分伺服器的當前執行狀態,不能做到配置高的伺服器多分配請求,配置低的少分配,甚至可能所有請求集中在某一臺上。DNS伺服器是按照一定的層次結構組織的,本地DNS伺服器會緩衝已解析的域名到IP地址的對映,這會導致該DNS伺服器的使用者在一段時間內訪問的是同一臺web伺服器,導致負載不均衡。

反向代理

反向代理(Reverse Proxy)是指以代理伺服器來接受Internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。既然說到反向代理那有沒有正向代理呢?結果是肯定的。我們簡單概述下正向代理的概念。

正向代理

正向代理是一個位於客戶端和目標伺服器之間的代理伺服器(中間伺服器)。為了從原始伺服器取得內容,客戶端向代理伺服器傳送一個請求,並且指定目標伺服器,之後代理向目標伺服器轉交併且將獲得的內容返回給客戶端。正向代理的情況下客戶端必須要進行一些特別的設定才能使用。

區別

正向代理需要你主動設定代理伺服器ip或者域名進行訪問,由設定的伺服器ip或者域名去獲取訪問內容並返回;而反向代理不需要你做任何設定,直接訪問伺服器真實ip或者域名,但是伺服器內部會自動根據訪問內容進行跳轉及內容返回,你不知道它最終訪問的是哪些機器。

正向代理代理的是客戶端,為客戶端收發請求,使真實客戶端對伺服器不可見;並且代理伺服器與客戶端處在同一區域網中。

反向代理代理的則是服務端,並且代理伺服器與真實伺服器處在同一區域網中,為伺服器收發請求,使真實伺服器對客戶端不可見。 如何想詳細瞭解正向代理和反向代理的區別可以參考: www.jianshu.com/p/208c02c9d…

這裡就不多敘述了,下面我們講下Nginx負載均衡和反向代理如何配置

二.配置負載均衡和反向代理

講負載均衡之前我們先了解一下負載均衡的HTTP Upstream模組 Nginx的負載均衡和反向代理的配置檔案是在我們安裝Nginx的目錄下的conf資料夾下的nginx.conf檔案 下面是我的安裝路徑:

Nginx入門(2)反向代理和負載均衡

我們可以開啟的nginx.conf檔案,找到Http下的server模組,在上方新增我們的Upstream模組。如下圖:

Nginx入門(2)反向代理和負載均衡

然後我們說下Upstream模組裡的幾個重要指令

ip_hash指令

當對後端的多臺伺服器做負載均衡時,ip_hash指令能夠將某個客戶端IP的請求通過雜湊演算法定位到同一臺後端伺服器上。這樣,當某個IP的使用者在後端web伺服器A上登入後,再訪問該站點的其他URL能保證其訪問的還是伺服器A,如果不採用ip_hash指令,假設來自某個IP的使用者在伺服器A上登陸後,在訪問該站點的其他url有可能被定向到後端伺服器B,C上,由於使用者登陸後session資訊是記錄在A上的,這就會出現使用者未登陸的情況。

使用ip_hash指令無法保證後端伺服器的負載均衡,可能有些後端伺服器接受的請求多,有的少,並且設定伺服器權重登方法將不起作用,所以如果後端能做到session共享,不建議使用ip_hash方式。

upstream指令

Upstream後面的名稱可以任意,後面用於配置我們的代理路徑。

upstream模組裡就是配置我們用來做負載均衡伺服器的地方 我這邊是一臺機器啟動了2個不同埠的tomcat用於測試。

server指令

該指令用於指定後端伺服器的名稱和引數。伺服器的名稱可以是一個域名,一個IP地址,埠號等。 在伺服器名稱後,可以跟以下引數:

  • weight:伺服器的權重,權重數值越高,被分配的客戶端請求數越多,預設為1
  • max_fails:在引數fail_timeout指定的時間內對後端伺服器請求失敗的次數,如果檢測到後端伺服器無法連線或者發生錯誤(404錯誤除外),則標記為失敗,如果沒有設定,預設為1,設為0將關閉這項檢查。
  • fail_timeout:在經歷引數max_fails設定的失敗次數後,暫停的時間。
  • down:標記伺服器為永久離線狀態,用於ip_hash指令。
  • backup:僅僅在非backu伺服器全部當機或者繁忙的時候才啟用。

下面是我配置好的nginx.conf檔案

Nginx入門(2)反向代理和負載均衡
然後我們啟動nginx來訪問看一下 啟動命令:

cd /opt/local/nginx/sbin;
./nginx
複製程式碼

然後我們訪問 xs.test.cn

Nginx入門(2)反向代理和負載均衡
我們可以看到Nginx把我們的請求分發到了不同的伺服器上,因為我們之前配置的權重相同,所以請求落到兩個伺服器上的概率也差不多。

參考:《實戰Nginx.取代Apache的高效能Web伺服器》

相關文章