Nginx(發音為「engine x」)是一款由俄羅斯軟體工程師Igor Sysoev寫的開源的web伺服器。 自從2004年發布以來nginx一直關注於高性能、高並發、低內存的使用,另外還有一些特色的Web 、存取和頻寬控制以及能夠有效的與各種應用整合這些特點使得nginx成為現代網站架構中一個不錯的選擇。目前,nginx在網路最受歡迎web伺服器軟體排行榜上排名第二。
1. 為什麼高併發如此重要?
目前網路是如此普及且無所不在,而我們知道,這在10年前是很難想像的。而且,由於從基於NCAS(譯者註:國家超級電腦應用中心)的簡單的HTML產生可點擊文本到基於 web服務的重大演變,使得網路成為全球2億網民的常用溝通媒介。隨著電腦、行動裝置和最近的平板電腦的永久擴散連接,導致互諒網領域變化非常迅速以及整個經濟的有線數位化。線上服務也隨著生活和娛樂資訊的即時有效而變得更加細緻。而且線上業務的安全方面也發生了重大變化。因此網站也變得比以前更加複雜,也就需要更多工程方面的工作使互聯網更加健壯以及具有更好的擴展性。
對一個網站架構來說最大的挑戰就是並發問題。從網路服務一開始,並發等級就在持續不斷的成長。而一個網站同時為數百上千甚至數百萬用戶同時服務的情況也並不少見。十年以前,導致並發的原因是客戶端慢-當時用戶使用ADSL或者撥號上網來連接;如今,發一些連結來更新新聞、推特、朋友訊息等的更新應用程式體系結構的組合。另外另一個造成並發增加的因素是現代瀏覽器同時為一個網站開啟4到6個連線來載入網頁以提高頁面載入速度。 為了說明客戶端慢時存在的問題,假設有一個簡單的基於
apache的web服務可以產生一個文只用花幾分之一秒就能產生或查詢出這個頁面,但是在一個有80kbps(10kB/s)頻寬的客戶端中卻需要10秒鐘來發送這個請求;原本這個web服務可以很快拉到100k的內容,但是卻要在花費10秒鐘傳送完這10後才能釋放這100k100k100k10k33333573333333333333(100k的內容。現在我們假設有1000個同時連接上的客戶端來請求相似的內容,如果一個客戶端被分配到1M的額外內存,那麼為了滿足這1000的額外內存,那麼為了滿足這1000 100K的請求則需要1000M(大約1G)的額外記憶體。實際上,一個基於apache的標準web服務通常要為每個連接分配大於1M的內存,而且可悲的是移動通信的有效速率卻僅為幾十 kpbs。雖然可能透過作業系統核心的socket緩衝在一定程度上可以緩解向比較慢的客戶端發送內容的問題,但是總歸不是通用的解決辦法而且可能有不可預期的負面效果。
在對於持久連接的處理上使得並發問題變得更加突出,這是因為要避免重新創建http連接帶來的延遲,客戶端要一直保持與而且web服務還要為每個連線分配額外的記憶體空間。
因此,為了能夠並且能夠持續性處理隨著日益增加的用戶量而導致的不斷增加的負載以及獲得更高的並發性,一個網站必須基於一系列非常高性能的模組來構建。但是,其他部分如硬體(CPU,記憶體,硬碟)、網路容量、應用程式和資料儲存架構顯然也是同樣重要的,它決定了、網路容量、應用程式和資料儲存架構顯然也是同樣重要的,它決定了web可接受和處理的客戶端連線數。所以web伺服器需要能夠透過非線性擴展來滿足每秒鐘不斷增長的並發連接和請求數。
Apache是否合適?
Apache,起源於二十世紀九十年代初,目前仍是互聯網上占主導地位的web伺服器軟體。從2000年開始,很明顯的單機web服務很難透過簡單的複製來滿足不斷增長的網路服務。儘管apache為未來開發提供了一個堅實的基礎,但它為每個新連結來做一次自我複製的架構並不能滿足一個網站非線性擴展的要求。最終,apache成了一個功能齊全、有一系列第三方插件而且幾乎普遍普遍適用於任何類型二次開發的網站的web伺服器。但是這樣重並沒有任何好處,而且這樣做的缺點是將如此多的功能和工具組合到一個軟體中也會增加每個連接的 cpu和記憶體佔用率從而降低軟體的可擴展性。
因此,既然伺服器硬體、作業系統、網路資源不再是限制網站成長的主要因素,世界各地的開發者們也開始尋求更有效的方法來運行web服務
為了解決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將更符合主流功能。
以上就介紹了nginx 簡介篇,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。