從現在開始學習Nginx——1.基礎知識

從現在開始學習Nginx——1.基礎知識

作爲高速、輕量、高性能等優點集於一身的服務器,Nginx在近些年迅速發展並不斷擴大市場份額,甚至在最近其市場份額一舉超過微軟的IIS,躍身到第二位,僅次於Apache。

但是由於其高性能的特點,尤其適用於高流量網站,在全球前 10,000個站點中的市場份額爲58.4%,穩居第一。

 

Nginx的誕生

Nginx是俄羅斯人Igor Sysoev在2002年開發的一個HTTP站點服務器,它被聲稱可以每天處理5億個請求。並於2004年公開,使用BSD開源協議,能運行在幾乎所有主流的操作系統上。

在Nginx誕生的年代,軟件界中有一個問題被大家討論得最爲熱烈,那就是C10K問題(如何解決10萬個客戶端的併發請求問題)。

即使當時的硬件規格依舊在不斷上升,但是如果像Apache HTTP那樣對於每一個請求都要單獨分成一個進程或者線程來執行,進程號或者線程堆棧這些系統資源將不可避免地會被耗盡。因此,輕量級服務器勢在必行。

在當時,爲了解決C10K問題,還有其它兩款輕量級Web服務器被廣泛關注————lighttpdBoa,但是它們的表現性能都難以企及Nginx。

 

Nginx的反向代理

Nginx能在衆多輕量級服務器中脫穎而出的一個很重要的原因,就是它擁有超強的反向代理能力。

不同於一般中小型網站的服務器直接接受用戶請求,然後運行對應的PHP、Java等程序代碼,反向代理是把反向代理服務器作爲接受用戶請求的終端,然後在其後方在配置若干真正提供服務的web應用服務器。

反向代理

反向代理服務器一般會根據請求的任務類型和備選邏輯服務器的負載情況進行任務分發(負載均衡)。

除此以外Nginx支持HTTPS的SSL/TLS協議,可以爲本來不具備此功能的應用添加HTTPS支持(用戶與反向代理服務器通過有加密功能的HTTPS進行通信,反向代理服務器再通過安全的內網直接和各邏輯服務器通信)。

同時,反向代理服務器還能緩存各種靜態資源(如圖片文件和HTML文件),這使得它十分善於處理大量的重複請求。

除了上面提到的最主流的HTTP/HTTPS以外,Nginx也能處理SMTP、IMAP、POP3等協議的負載均衡。甚至很快也能支持“下一代的HTTP”——SPDY協議。

 

談談模塊的擴展

因爲Nginx是一個輕量級的Web服務器,因此除了反向代理和資源緩存等核心功能外,要儘可能地避免添加不必要的功能模塊。

當然,Nginx不乏許多優秀的標準庫和第三方模塊,比如流量和連接監控和限制、圖像格式轉換等等。

但是,如果要添加新模塊的話,必須將整個程序重新編譯。雖然這樣不如Apache HTTP的動態加載來得方便,但是可以保證運行效率的最大化和佔用資源的最小化。

Nginx一般有各種各樣的安裝包,裏面附帶有不盡相同的非核心模塊,在安裝前務必瞭解清楚。

 

如何處理動態資源

Nginx很擅長負載均衡和處理HTML文件和圖片等靜態資源,但是除了SSI(Server Side Include)技術以外基本不能夠自己動態地生成資源。

這時,其實我們可以通過UNIX Domain Socket來讓其他進程處理並返回對應的動態資源。如果該進程位於其他機器上,則可以通過TCP來進行通信。

特別地,對於和PHP程序之間的通信可以使用FastCGI,對於Python可以使用uWSGI,對於Ruby on Rails可以使用Phusion Passenger

 

高性能的祕訣————事件驅動

Nginx之所以能同時處理大量的請求,原因在於它採用了十分巧妙的事件驅動機制。

作爲一個Web服務器,要同時處理多個請求,不可避免地要面對這麼一個問題,如何同時處理像磁盤和網絡等等的I/O請求,即如何實現I/O複用。

爲了解決該問題,操作系統在很久之前就開始提供諸如“select”、“poll”等系統調用。Apache HTTP的多處理模塊(MPM,multi-processing module)就會用到這些系統調用。

但是,select/poll爲了識別出哪些文件或者socket已經準備就緒,必須將所有已註冊的文件描述符(fd)一個個地檢查一遍。如果註冊列表越長,那麼每次的掃描所需的時間也越長。

而Nginx的I/O複用機制使用的是“epoll”這個基於事件驅動的系統調用。因爲epoll會在系統內核管理和監聽這些文件描述符(fd),並自動把就緒的加入到Ready隊列當中。

所以,程序只需在需要時往Ready隊列中取出一個進行處理即可,而不用切換到內核態,然後一個個地檢查,然後又切換回用戶態。

這樣,無論需要註冊監聽的I/O有多少,都不會影響程序的運行效率。

爲了避免select/poll帶來的線性增長的負擔,Apache HTTP必須將這些IO分散到各個進程/線程中處理,這樣勢必會造成佔用內存的增長。

但是,Nginx可以通過利用“epoll”,保證可以使用一個進程/線程完成所有請求的處理,這樣可以大大減少內存的佔用,從而使應對上萬併發請求成爲可能。

 

Apache VS Nginx

橫座標代表併發連接數
01
02
03
04

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