天天看點

《深入了解Nginx:子產品開發與架構解析》一1.2 為什麼選擇Nginx

為什麼選擇nginx?因為它具有以下特點:

(1)更快

這表現在兩個方面:一方面,在正常情況下,單次請求會得到更快的響應;另一方面,在高峰期(如有數以萬計的并發請求),nginx可以比其他web伺服器更快地響應請求。

實際上,本書第三部分中大量的篇幅都是在說明nginx是如何做到這兩點的。

(2)高擴充性

nginx的設計極具擴充性,它完全是由多個不同功能、不同層次、不同類型且耦合度極低的子產品組成。是以,當對某一個子產品修複bug或進行更新時,可以專注于子產品自身,無須在意其他。而且在http子產品中,還設計了http過濾器子產品:一個正常的http子產品在處理完請求後,會有一串http過濾器子產品對請求的結果進行再處理。這樣,當我們開發一個新的http子產品時,不但可以使用諸如http核心子產品、events子產品、log子產品等不同層次或者不同類型的子產品,還可以原封不動地複用大量已有的http過濾器子產品。這種低耦合度的優秀設計,造就了nginx龐大的第三方子產品,當然,公開的第三方子產品也如官方釋出的子產品一樣容易使用。

nginx的子產品都是嵌入到二進制檔案中執行的,無論官方釋出的子產品還是第三方子產品都是如此。這使得第三方子產品一樣具備極其優秀的性能,充分利用nginx的高并發特性,是以,許多高流量的網站都傾向于開發符合自己業務特性的定制子產品。

(3)高可靠性

高可靠性是我們選擇nginx的最基本條件,因為nginx的可靠性是大家有目共睹的,很多家高流量網站都在核心伺服器上大規模使用nginx。nginx的高可靠性來自于其核心架構代碼的優秀設計、子產品設計的簡單性;另外,官方提供的常用子產品都非常穩定,每個worker程序相對獨立,master程序在1個worker程序出錯時可以快速“拉起”新的worker子程序提供服務。

(4)低記憶體消耗

一般情況下,10 000個非活躍的http keep-alive連接配接在nginx中僅消耗2.5mb的記憶體,這是nginx支援高并發連接配接的基礎。

從第3章開始,我們會接觸到nginx在記憶體中為了維護一個http連接配接所配置設定的對象,屆時将會看到,實際上nginx一直在為使用者考慮(尤其是在高并發時)如何使得記憶體的消耗更少。

(5)單機支援10萬以上的并發連接配接

這是一個非常重要的特性!随着網際網路的迅猛發展和網際網路使用者數量的成倍增長,各大公司、網站都需要應付海量并發請求,一個能夠在峰值期頂住10萬以上并發請求的server,無疑會得到大家的青睐。理論上,nginx支援的并發連接配接上限取決于記憶體,10萬遠未封頂。當然,能夠及時地處理更多的并發請求,是與業務特點緊密相關的,本書第8~11章将會詳細說明如何實作這個特點。

(6)熱部署

master管理程序與worker工作程序的分離設計,使得nginx能夠提供熱部署功能,即可以在7×24小時不間斷服務的前提下,更新nginx的可執行檔案。當然,它也支援不停止服務就更新配置項、更換日志檔案等功能。

(7)最自由的bsd許可協定

這是nginx可以快速發展的強大動力。bsd許可協定不隻是允許使用者免費使用nginx,它還允許使用者在自己的項目中直接使用或修改nginx源碼,然後釋出。這吸引了無數開發者繼續為nginx貢獻自己的智慧。

以上7個特點當然不是nginx的全部,擁有無數個官方功能子產品、第三方功能子產品使得nginx能夠滿足絕大部分應用場景,這些功能子產品間可以疊加以實作更加強大、複雜的功能,有些子產品還支援nginx與perl、lua等腳本語言內建工作,大大提高了開發效率。這些特點促使使用者在尋找一個web伺服器時更多考慮nginx。

當然,選擇nginx的核心理由還是它能在支援高并發請求的同時保持高效的服務。

如果web伺服器的業務通路量巨大,就需要保證在數以百萬計的請求同時通路服務時,使用者可以獲得良好的體驗,不會出現并發通路量達到一個數字後,新的使用者無法擷取服務,或者雖然成功地建立起了tcp連接配接,但大部分請求卻得不到響應的情況。

通常,高峰期伺服器的通路量可能是正常情況下的許多倍,若有熱點事件的發生,可能會導緻正常情況下非常順暢的伺服器直接“挂死”。然而,如果在部署伺服器時,就預先針對這種情況進行擴容,又會使得正常情況下所有伺服器的負載過低,這會造成大量的資源浪費。是以,我們會希望在這之間取得平衡,也就是說,在低并發壓力下,使用者可以獲得高速體驗,而在高并發壓力下,更多的使用者都能接入,可能通路速度會下降,但這隻應受制于帶寬和處理器的速度,而不應該是伺服器設計導緻的軟體瓶頸。

事實上,由于中國網際網路使用者群體的數量巨大,緻使對web伺服器的設計往往要比歐美公司更加困難。例如,對于全球性的一些網站而言,歐美使用者分布在兩個半球,歐洲使用者活躍時,美洲使用者通常在休息,反之亦然。而國内巨大的使用者群體則對業界的程式員提出更高的挑戰,早上9點和晚上20點到24點這些時間段的并發請求壓力是非常巨大的。尤其節假日、寒暑假到來之時,更會對伺服器提出極高的要求。

另外,國内業務上的特性,也會引導使用者在同一時間大并發地通路伺服器。例如,許多sns網頁遊戲會在固定的時間點重新整理遊戲資源或者允許“偷菜”等好友互動操作。這些會導緻伺服器處理高并發請求的壓力增大。

上述情形都對我們的網際網路服務在大并發壓力下是否還能夠給予使用者良好的體驗提出了更高的要求。若要提供更好的服務,那麼可以從多方面入手,例如,修改業務特性、引導使用者從高峰期分流或者把服務分層分級、對于不同并發壓力給使用者提供不同級别的服務等。但最根本的是,web伺服器要能支援大并發壓力下的正常服務,這才是關鍵。

快速增長的網際網路使用者群以及業内所有網際網路服務提供商越來越好的使用者體驗,都促使我們在大流量服務中用nginx取代其他web伺服器。nginx先天的事件驅動型設計、全異步的網絡i/o處理機制、極少的程序間切換以及許多優化設計,都使得nginx天生善于處理高并發壓力下的網際網路請求,同時nginx降低了資源消耗,可以把伺服器硬體資源“壓榨”到極緻。

繼續閱讀