Nginx的背景

Nginx和Apache一樣都是一種WEB伺服器。基於REST架構風格,以URI(Uniform Resources Identifier,統一資源描述符)或URL(Uniform Resources Locator,統一資源定位符)作為溝通依據,通過HTTP協議提供各種網路服務。WEB伺服器的設計受網路規模、網路頻寬、產品特點等因素侷限,且各自的定位和發展不同,因此各種WEB伺服器有著各自的鮮明特點。

Apache的發展時期很長,而且是毫無爭議的世界第一大伺服器。它有著很多特點:穩定、開源、跨平臺等。它出現的時間太長了,它興起的年代,網際網路產業遠遠比不上現在,所以它被設計為一個重量級的WEB伺服器,不支援高併發。在Apache上執行數以萬計的併發訪問,會導致伺服器消耗大量記憶體。作業系統對其進行程序或執行緒間的切換也消耗了大量的CPU資源,導致HTTP請求的平均響應速度降低。這些因素都決定了Apache不可能稱為高效能的WEB伺服器,因此輕量級的高併發伺服器Nginx就登上了舞臺。

Nginx的反向代理與負載均衡

Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外Nginx可以作為反向代理伺服器進行負載均衡的實現。

反向代理伺服器指的是服務端做代理,客戶端要訪問服務端就要通過反向代理伺服器,訪問的時候客戶端並不知道自己訪問的是代理(無感知代理存在),因此實際訪問的服務端對客戶端來說是隱藏的。有反向代理自然就有正向代理,正向代理則是代理客戶端去訪問不能直接訪問的服務端。

實際的專案場景通常會同時應用到正向代理和反向代理:正向代理伺服器代理客戶端的請求去訪問目標伺服器,目標伺服器是一個反向代理伺服器,方向代理了多個真正的業務處理伺服器。

明白了反向代理伺服器的概念,就知道反向代理伺服器會將來自客戶端的請求轉發給實際的業務處理伺服器進行業務處理和返回響應。那麼,如果有多個處理相同業務的業務處理伺服器的話,Nginx會按照一定的規則將請求分發到每一個業務處理伺服器,保證每一個請求都能夠及時被處理和響應,這就是負載均衡。

負載均衡分為其實硬體負載均衡和軟體負載均衡兩種。硬體負載均衡也稱為硬負載,如F5負載均衡,相對造價昂貴成本較高,但是資料的穩定性安全性等等有非常好的保障,如中國移動、中國聯通這樣財大氣粗的公司就會選擇硬負載進行操作。然而,更多的公司因為成本因素,會選擇軟體負載均衡,軟體負載均衡是使用軟體來進行負載均衡,是一種利用現有的技術結合主機硬體實現的訊息佇列分發機制。Nginx就是一款實現軟體負載均衡的應用。

Nginx支援的負載均衡排程演算法

輪詢(weight,預設):接收到的請求按照順序逐一分配到不同的後端伺服器,即使在使用過程中,某一臺後端伺服器宕機,Nginx會自動將該伺服器剔除出佇列,請求受理情況不會受到任何影響。這種方式下,可以給不同的後端伺服器設定一個權重值(weight),用於調整不同的伺服器上請求的分配率。權重的數值越大,被分配到請求的機率越大。權重值可以根據不同的後端伺服器的硬體配置進行調整,在配置的server後面加上weight=number修改權重值,這種方式叫做加權輪詢。

IP繫結(ip_hash):每個請求按照發起客戶端的IP的hash結果進行匹配,同樣IP地址的客戶端總是會訪問同一個後端伺服器,在一定程度上解決了叢集部署環境下Session共享的問題。

最快響應時間(fair):智慧排程演算法,動態地根據後端伺服器的處理處理效率和響應時間對請求進行均衡分配,響應時間短、處理效率高的伺服器分配到請求的概率高,響應時間長、處理效率低的伺服器分配到請求的概率低。使用這種演算法需要安裝upstream_fair模組。

URL繫結(url_hash):按照訪問的URL的hash結果分配請求,相同的URL會訪問同一個後端伺服器,在一定程度上可以提高快取的效率。使用這種演算法需要安裝Nginx的hash軟體包。

最小連線數(least_conn):優先將請求分配給壓力較小的後端伺服器,這樣可以平衡每個後端伺服器下等待佇列的長度,並避免向壓力大的伺服器新增更多的請求。

"凡世的喧囂與明亮,世俗的快樂和幸福,如同清亮的溪澗,在風裡,在我眼前,汨(mi)汨而過,溫暖如同泉水一樣湧出來。我沒有奢望,我只要你快樂,不要悲傷。"