nginx介紹(一) 簡介篇

Nginx(發音爲“engine x)是一款由俄羅斯軟件工程師Igor Sysoev寫的開源的web服務器。自從2004年發佈以來nginx一直關注於高性能、高併發、低內存的使用,另外還有一些特色的Web服務器功能,如負載均衡、緩存、訪問和帶寬控制以及能夠有效的與各種應用集成這些特點使得nginx成爲現代網站架構中一個不錯的選擇。目前,nginx在互聯網最受歡迎web服務器軟件排行榜上排名第二。

1.爲什麼高併發如此重要?

目前互聯網是如此普及和無處不在,而我們知道,這在10年前是很難想象的。而且,由於從基於NCAS(譯者注:國家超級計算機應用中心)的簡單的HTML產生可點擊文本到基於Apache web服務的重大演變,使得互聯網成爲全球2億網民的常用溝通媒介。隨着電腦、移動設備和最近的平板電腦的永久擴散連接,導致互諒網領域變化非常迅速以及整個經濟的有線數字化。線上服務也隨着生活和娛樂資訊的實時有效而變得更加細緻。而且線上業務的安全方面也發生了重大變化。因此網站也變得比以前更加複雜,也就需要更多工程方面的工作使互聯網更加健壯以及具有更好的擴展性。

對一個網站架構來說最大的挑戰就是併發問題。從網絡服務一開始,併發級別就在持續不斷的增長。而一個網站同時爲成百上千甚至是幾百萬用戶同時服務的情況也並不少見。十年以前,導致併發的原因是客戶端慢-當時用戶使用ADSL或者撥號上網來連接;如今,併發是由移動客戶端和一些需要通過持久連接來更新新聞、推特、朋友消息等的更新應用程序體系結構的組合。另外還一個造成併發增加的因素是現代瀏覽器同時爲一個網站打開46個連接來加載網頁以提高頁面加載速度。

爲了說明客戶端慢時存在的問題,假設有一個簡單的基於apacheweb服務可以產生一個100k大小的響應文本或者圖片,那麼這個服務只用花幾分之一秒就能生成或者查詢出這個頁面,但是在一個有80kbps(10kB/s)帶寬的客戶端中卻需要10秒鐘來發送這個請求;本來這個web服務可以很快拉到100k的內容,但是卻要在花費10秒鐘傳送完這100k的內容後才能釋放這個連接。現在我們假設有1000個同時連接上的客戶端來請求相似的內容,如果一個客戶端被分配到1M的額外內存,那麼爲了滿足這1000客戶端100K的請求則需要1000M(大約1G)的額外內存。實際上,一個基於apache的標準web服務通常要爲每個連接分配大於1M的內存,而且可悲的是移動通信的有效速率卻僅爲數十kpbs。雖然可能通過操作系統內核的socket緩衝在一定程度上可以緩解向比較慢的客戶端發送內容的問題,但是總歸不是通用的解決辦法而且可能有不可預期的負面效果。

在對於持久連接的處理上使得併發問題變得更加突出,這是因爲要避免重新創建http連接帶來的延遲,客戶端要一直保持與web服務器連接而且web服務還要爲每個連接分配額外的內存空間。

因此,爲了能夠並且能夠持續性處理隨着日益增加的用戶量而導致的不斷增加的負載以及獲得更高的併發性,一個網站必須基於一系列非常高性能的模塊來構建。但是,其他部分如硬件(CPU,內存,硬盤)、網絡容量、應用程序和數據存儲架構顯然也是同樣重要的,它決定了web服務器可接受和處理的客戶端連接數。所以web服務器需要能夠通過非線性擴展來滿足每秒鐘不斷增長的併發連接和請求數。

Apache是否合適?

Apache,起源於二十世紀九十年代初,目前仍是互聯網上占主導地位的web服務器軟件。從2000年開始,很明顯的單機web服務很難通過簡單的複製來滿足不斷增長的網絡服務。儘管apache爲未來開發提供了一個堅實的基礎,但它爲每個新連接來做一次自我複製的架構並不能滿足一個網站非線性擴展的要求。最終,apache成了一個功能齊全、有一系列第三方插件而且幾乎普遍普遍適用於任何類型二次開發的網站的web服務器。但是這樣重並沒有任何好處,而且這樣做的缺點是將如此多的功能和工具組合到一個軟件中也會增加每個連接的 cpu和內存佔用率從而降低軟件的可擴展性。

因此,既然服務器硬件、操作系統、網絡資源不再是限制網站成長的主要因素,世界各地的開發者們也開始尋求更加有效的方法來運行web服務器。大概在十年前,一位著名軟件工程師Daniel Kegel聲稱“現在對於web服務器來說是時候只是上萬併發請求了”而且還預測了我們現在稱之爲互聯網雲服務的東西。Kegel的C10K清單裏也進行了一些對web服務器最佳狀態下併發連接數問題的嘗試解決,最終證明nginx是最有效的解決途徑。

爲了解決C10K清單上同時10000連接數的問題,nginx考慮採用的不同架構方式-一個在併發連接數和每秒請求數都更適合非線性擴展的架構。由於 nginx基於事件模型,所以它並不遵循apache複製每個新的進程或者爲每個頁面創建單獨線程的規則。結果,即使負載的增加,內存和CPU使用率仍然可控,這也使得nginx在一臺服務器上通過普通硬件就可以處理數萬併發請求。

nginx 第一個版本的發佈是爲了對基於apache的應用服務器中部署在apache下的靜態內容,比如html,css,javascript腳本以及圖片可以通過nginx來卸載併發和超時處理。在其發展過程中,nginx通過使用FastCGI、uswgi 或者SCGI協議實現了與第三方應用的集成,而且具有像memcache這樣的分佈式對象緩存系統。同時還增加了一些有用的功能,例如含有負載均衡機制的反向代理以及緩存等。這些額外的特色功能使nginx成爲構建一個基於可伸縮web基礎設施的有效工具的組合。

使用nginx時候還有更多優勢?

通常高效、高性能的處理大併發請求是nginx最主要的優勢,同時,使用nginx還有一些其他好處。

在過去的幾年裏,網絡架構師們已經接受了鬆耦合的思想並開始從web服務中將應用的基礎組件分離出來。然而,之前已經存在的基於 LAMP(Linux,Apache,MYSQL,PHP,Python或者Perl)的網站,現在可能包括不僅僅基於LEMP(E發音爲“engine x”)的網站卻在實際中越來越經常的需要將web服務器推到基礎設施的邊緣地帶或者需要通過不同的方式將相同的或者一些新的應用以及數據工具整合起來。

對於以上情況來說nginx非常適合,這是因爲nginx從應用層到更高效的邊緣服務器(譯者注:不熟悉的讀者可查詢邊緣服務器)層提供了一些主要功能例如卸載併發、超時處理、SSL(安全套接層)、內容靜態化、壓縮和緩存、連接數和請求的節流甚至是HTTP流媒體。同時nginx還可以直接和 memcached、Redis以及其他的NoSQL解決方案來提高大併發用戶下的性能。

隨着最新的開放工具組件和編程語言的流行,越來越多的公司開始改變他們開發和部署應用的習慣。而nginx也已經成爲這類改變的典範,發展爲最重要的組件之一,同時它也已經幫助許多公司在預算範圍內來實現web服務持續快速的發展。

nginx的第一行代碼寫於2002年,到2004年nginx通過2-two-clause BSD許可協議發佈。自從nginx發佈以來,它的用戶羣一直持續增長,並且貢獻各種想法以及提交bug、提出各種意見和建議爲整個社區提供了非常大的幫助。

nginx 的代碼庫是原創的,而且完全通過C語言來實現。它也已經被移植到多種架構下的操作系統中,比如Linux, FreeBSD, Solaris, Mac OS X, AIX 和Windows系統。nginx也有自己的庫,而且這些庫並沒有使用系統中不存在的C庫,因此,除了zlib、PCRE和OpenSSL這幾個庫之外,用戶可以去掉自己不需要或者可能有許可衝突的庫。

這裏稍微說一下windows版本的nginx。運行在windows下的nginx更像是一個概念驗證而不是一個功能齊全的端口。在windows下 nginx也是有限制的,那就是nginx不能很好的和windows內核兼容,已經知道的低版本的nginx在windows的問題有支持併發數少、性能低、緩存失效以及帶寬策略失效。今後,windows版本nginx將更加匹配主流功能。


(未完,待續。。。)

1. 本文由程序員學架構譯,mathew同學校審

2. 本文譯自The Architecture of Open Source Applications

3. 轉載請務必註明本文出自程序員學架構(微信號:archleaner )



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