Nginx 介紹

一、反向代理:Web服務器的“經紀人”

1.1 反向代理初印象

反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現爲一個服務器

Nginx搭建反向代理服務器過程詳解

從上圖可以看出:反向代理服務器位於網站機房,代理網站Web服務器接收Http請求,對請求進行轉發。

1.2 反向代理的作用

保護網站安全:任何來自Internet的請求都必須先經過代理服務器;

Nginx搭建反向代理服務器過程詳解

通過配置緩存功能加速Web請求:可以緩存真實Web服務器上的某些靜態資源,減輕真實Web服務器的負載壓力;

Nginx搭建反向代理服務器過程詳解

實現負載均衡:充當負載均衡服務器均衡地分發請求,平衡集羣中各個服務器的負載壓力;

Nginx搭建反向代理服務器過程詳解

二、初識Nginx:簡單卻不平凡

2.1 Nginx是神馬?

Nginx搭建反向代理服務器過程詳解

Nginx是一款輕量級的網頁服務器、反向代理器以及電子郵件代理服務器。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。

Source:Nginx(發音同engine x),它是由俄羅斯程序員Igor Sysoev所開發的。起初是供俄國大型的門戶網站及搜索引擎Rambler(俄語:Рамблер)使用。此軟件BSD-like協議下發行,可以在UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows等操作系統中運行。

說到Web服務器,Apache服務器和IIS服務器是兩大巨頭;但是運行速度更快、更靈活的對手:Nginx 正在迎頭趕上。

2.2 Nginx的應用現狀

Nginx 已經在俄羅斯最大的門戶網站── Rambler Mediawww.rambler.ru)上運行了3年時間,同時俄羅斯超過20%的虛擬主機平臺採用Nginx作爲反向代理服務器。

Nginx搭建反向代理服務器過程詳解Nginx搭建反向代理服務器過程詳解Nginx搭建反向代理服務器過程詳解Nginx搭建反向代理服務器過程詳解Nginx搭建反向代理服務器過程詳解

在國內,已經有 淘寶、新浪博客、新浪播客、網易新聞、六間房、56.com、Discuz!、水木社區、豆瓣、YUPOO、海內、迅雷在線 等多家網站使用 Nginx 作爲Web服務器或反向代理服務器。

2.3 Nginx的核心特點

(1)跨平臺:Nginx 可以在大多數 Unix like OS編譯運行,而且也有Windows的移植版本;

(2)配置異常簡單:非常容易上手。配置風格跟程序開發一樣,神一般的配置;

(3)非阻塞、高併發連接:數據複製時,磁盤I/O的第一階段是非阻塞的。官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2~3萬併發連接數。(這得益於Nginx使用了最新的epoll模型);

PS:對於一個Web服務器來說,首先看一個請求的基本過程:建立連接—接收數據—發送數據,在系統底層看來 :上述過程(建立連接—接收數據—發送數據)在系統底層就是讀寫事件

①如果採用阻塞調用的方式,當讀寫事件沒有準備好時,必然不能夠進行讀寫事件,那麼久只好等待,等事件準備好了,才能進行讀寫事件,那麼請求就會被耽擱 。

②既然沒有準備好阻塞調用不行,那麼採用非阻塞調用方式。非阻塞就是:事件馬上返回,告訴你事件還沒準備好呢,你慌什麼,過會再來吧。好吧,你過一會,再來檢查一下事件,直到事件準備好了爲止,在這期間,你就可以先去做其它事情,然後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的。

(4)事件驅動:通信機制採用epoll模型,支持更大的併發連接。

①非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大,因此就有了異步非阻塞的事件處理機制。這種機制讓你可以同時監控多個事件,調用他們是阻塞的,但可以設置超時時間,在超時時間之內,如果有事件準備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。

②以epoll模型爲例:當事件沒有準備好時,就放入epoll(隊列)裏面。如果有事件準備好了,那麼就去處 理;如果事件返回的是EAGAIN,那麼繼續將其放入epoll裏面。從而,只要有事件準備好了,我們就去處理它,只有當所有事件都沒有準備好時,纔在 epoll裏面等着。這樣,我們就可以併發處理大量的併發了,當然,這裏的併發請求,是指未處理完的請求,線程只有一個,所以同時能處理的請求當然只有一 個了,只是在請求間進行不斷地切換而已,切換也是因爲異步事件未準備好,而主動讓出的。這裏的切換是沒有任何代價,你可以理解爲循環處理多個準備好的事 件,事實上就是這樣的。

③與多線程方式相比,這種事件處理方式是有很大的優勢的,不需要創建線程,每個請求佔用的內存也很少,沒有上下文切換, 事件處理非常的輕量級,併發數再多也不會導致無謂的資源浪費(上下文切換)。對於IIS服務器,每個請求會獨佔一個工作線程,當併發數上到幾千時,就同時 有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰:因爲線程帶來的內存佔用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不 去,從而導致在高併發場景下性能下降嚴重。

總結:通過異步非阻塞的事件處理機制,Nginx實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級

(5)Master/Worker結構:一個master進程,生成一個或多個worker進程。

Nginx搭建反向代理服務器過程詳解

PS:Master-Worker設計模式核心思想是將原來串行的邏輯並行化, 並將邏輯拆分成很多獨立模塊並行執行。其中主要包含兩個主要組件Master和Worker,Master主要將邏輯進行拆分,拆分爲互相獨立的部分,同 時維護了Worker隊列,將每個獨立部分下發到多個Worker並行執行,Worker主要進行實際邏輯計算,並將結果返回給Master。

問:nginx採用這種進程模型有什麼好處?

答:採用獨立的進程,可以讓互相之間不會影響,一個進程退出後,其它進程還在工作,服務不會中斷,Master 進程則很快重新啓動新的Worker進程。當然,Worker進程的異常退出,肯定是程序有bug了,異常退出,會導致當前Worker上的所有請求失 敗,不過不會影響到所有請求,所以降低了風險。

(6)內存消耗小:處理大併發的請求內存消耗非常小。在3萬併發連接下,開啓的10個Nginx 進程才消耗150M內存(15M*10=150M)。

(7)內置的健康檢查功能:如果 Nginx 代理的後端的某臺 Web 服務器宕機了,不會影響前端訪問。

(8)節省帶寬:支持 GZIP 壓縮,可以添加瀏覽器本地緩存的 Header 頭。

(9)穩定性高:用於反向代理,宕機的概率微乎其微。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章