nginx 简介篇
Nginx(發(fā)音為“engine x”)是一款由俄羅斯軟件工程師Igor Sysoev寫的開源的web服務器。自從2004年發(fā)布以來nginx一直關注于高性能、高并發(fā)、低內(nèi)存的使用,另外還有一些特色的Web服務器功能,如負載均衡、緩存、訪問和帶寬控制以及能夠有效的與各種應用集成這些特點使得nginx成為現(xiàn)代網(wǎng)站架構中一個不錯的選擇。目前,nginx在互聯(lián)網(wǎng)最受歡迎web服務器軟件排行榜上排名第二。
1.?為什么高并發(fā)如此重要?
目前互聯(lián)網(wǎng)是如此普及和無處不在,而我們知道,這在10年前是很難想象的。而且,由于從基于NCAS(譯者注:國家超級計算機應用中心)的簡單的HTML產(chǎn)生可點擊文本到基于Apache web服務的重大演變,使得互聯(lián)網(wǎng)成為全球2億網(wǎng)民的常用溝通媒介。隨著電腦、移動設備和最近的平板電腦的永久擴散連接,導致互諒網(wǎng)領域變化非常迅速以及整個經(jīng)濟的有線數(shù)字化。線上服務也隨著生活和娛樂資訊的實時有效而變得更加細致。而且線上業(yè)務的安全方面也發(fā)生了重大變化。因此網(wǎng)站也變得比以前更加復雜,也就需要更多工程方面的工作使互聯(lián)網(wǎng)更加健壯以及具有更好的擴展性。
對一個網(wǎng)站架構來說最大的挑戰(zhàn)就是并發(fā)問題。從網(wǎng)絡服務一開始,并發(fā)級別就在持續(xù)不斷的增長。而一個網(wǎng)站同時為成百上千甚至是幾百萬用戶同時服務的情況也并不少見。十年以前,導致并發(fā)的原因是客戶端慢-當時用戶使用ADSL或者撥號上網(wǎng)來連接;如今,并發(fā)是由移動客戶端和一些需要通過持久連接來更新新聞、推特、朋友消息等的更新應用程序體系結構的組合。另外還一個造成并發(fā)增加的因素是現(xiàn)代瀏覽器同時為一個網(wǎng)站打開4到6個連接來加載網(wǎng)頁以提高頁面加載速度。
為了說明客戶端慢時存在的問題,假設有一個簡單的基于apache的web服務可以產(chǎn)生一個100k大小的響應文本或者圖片,那么這個服務只用花幾分之一秒就能生成或者查詢出這個頁面,但是在一個有80kbps(10kB/s)帶寬的客戶端中卻需要10秒鐘來發(fā)送這個請求;本來這個web服務可以很快拉到100k的內(nèi)容,但是卻要在花費10秒鐘傳送完這100k的內(nèi)容后才能釋放這個連接?,F(xiàn)在我們假設有1000個同時連接上的客戶端來請求相似的內(nèi)容,如果一個客戶端被分配到1M的額外內(nèi)存,那么為了滿足這1000客戶端100K的請求則需要1000M(大約1G)的額外內(nèi)存。實際上,一個基于apache的標準web服務通常要為每個連接分配大于1M的內(nèi)存,而且可悲的是移動通信的有效速率卻僅為數(shù)十kpbs。雖然可能通過操作系統(tǒng)內(nèi)核的socket緩沖在一定程度上可以緩解向比較慢的客戶端發(fā)送內(nèi)容的問題,但是總歸不是通用的解決辦法而且可能有不可預期的負面效果。
在對于持久連接的處理上使得并發(fā)問題變得更加突出,這是因為要避免重新創(chuàng)建http連接帶來的延遲,客戶端要一直保持與web服務器連接而且web服務還要為每個連接分配額外的內(nèi)存空間。
因此,為了能夠并且能夠持續(xù)性處理隨著日益增加的用戶量而導致的不斷增加的負載以及獲得更高的并發(fā)性,一個網(wǎng)站必須基于一系列非常高性能的模塊來構建。但是,其他部分如硬件(CPU,內(nèi)存,硬盤)、網(wǎng)絡容量、應用程序和數(shù)據(jù)存儲架構顯然也是同樣重要的,它決定了web服務器可接受和處理的客戶端連接數(shù)。所以web服務器需要能夠通過非線性擴展來滿足每秒鐘不斷增長的并發(fā)連接和請求數(shù)。
Apache是否合適?
Apache,起源于二十世紀九十年代初,目前仍是互聯(lián)網(wǎng)上占主導地位的web服務器軟件。從2000年開始,很明顯的單機web服務很難通過簡單的復制來滿足不斷增長的網(wǎng)絡服務。盡管apache為未來開發(fā)提供了一個堅實的基礎,但它為每個新連接來做一次自我復制的架構并不能滿足一個網(wǎng)站非線性擴展的要求。最終,apache成了一個功能齊全、有一系列第三方插件而且?guī)缀跗毡槠毡檫m用于任何類型二次開發(fā)的網(wǎng)站的web服務器。但是這樣重并沒有任何好處,而且這樣做的缺點是將如此多的功能和工具組合到一個軟件中也會增加每個連接的 cpu和內(nèi)存占用率從而降低軟件的可擴展性。
因此,既然服務器硬件、操作系統(tǒng)、網(wǎng)絡資源不再是限制網(wǎng)站成長的主要因素,世界各地的開發(fā)者們也開始尋求更加有效的方法來運行web服務器。大概在十年前,一位著名軟件工程師Daniel Kegel聲稱“現(xiàn)在對于web服務器來說是時候只是上萬并發(fā)請求了”而且還預測了我們現(xiàn)在稱之為互聯(lián)網(wǎng)云服務的東西。Kegel的C10K清單里也進行了一些對web服務器最佳狀態(tài)下并發(fā)連接數(shù)問題的嘗試解決,最終證明nginx是最有效的解決途徑。
為了解決C10K清單上同時10000連接數(shù)的問題,nginx考慮采用的不同架構方式-一個在并發(fā)連接數(shù)和每秒請求數(shù)都更適合非線性擴展的架構。由于 nginx基于事件模型,所以它并不遵循apache復制每個新的進程或者為每個頁面創(chuàng)建單獨線程的規(guī)則。結果,即使負載的增加,內(nèi)存和CPU使用率仍然可控,這也使得nginx在一臺服務器上通過普通硬件就可以處理數(shù)萬并發(fā)請求。
nginx 第一個版本的發(fā)布是為了對基于apache的應用服務器中部署在apache下的靜態(tài)內(nèi)容,比如html,css,javascript腳本以及圖片可以通過nginx來卸載并發(fā)和超時處理。在其發(fā)展過程中,nginx通過使用FastCGI、uswgi 或者SCGI協(xié)議實現(xiàn)了與第三方應用的集成,而且具有像memcache這樣的分布式對象緩存系統(tǒng)。同時還增加了一些有用的功能,例如含有負載均衡機制的反向代理以及緩存等。這些額外的特色功能使nginx成為構建一個基于可伸縮web基礎設施的有效工具的組合。
使用nginx時候還有更多優(yōu)勢?
通常高效、高性能的處理大并發(fā)請求是nginx最主要的優(yōu)勢,同時,使用nginx還有一些其他好處。
在過去的幾年里,網(wǎng)絡架構師們已經(jīng)接受了松耦合的思想并開始從web服務中將應用的基礎組件分離出來。然而,之前已經(jīng)存在的基于 LAMP(Linux,Apache,MYSQL,PHP,Python或者Perl)的網(wǎng)站,現(xiàn)在可能包括不僅僅基于LEMP(E發(fā)音為“engine x”)的網(wǎng)站卻在實際中越來越經(jīng)常的需要將web服務器推到基礎設施的邊緣地帶或者需要通過不同的方式將相同的或者一些新的應用以及數(shù)據(jù)工具整合起來。
對于以上情況來說nginx非常適合,這是因為nginx從應用層到更高效的邊緣服務器(譯者注:不熟悉的讀者可查詢邊緣服務器)層提供了一些主要功能例如卸載并發(fā)、超時處理、SSL(安全套接層)、內(nèi)容靜態(tài)化、壓縮和緩存、連接數(shù)和請求的節(jié)流甚至是HTTP流媒體。同時nginx還可以直接和 memcached、Redis以及其他的NoSQL解決方案來提高大并發(fā)用戶下的性能。
隨著最新的開放工具組件和編程語言的流行,越來越多的公司開始改變他們開發(fā)和部署應用的習慣。而nginx也已經(jīng)成為這類改變的典范,發(fā)展成為最重要的組件之一,同時它也已經(jīng)幫助許多公司在預算范圍內(nèi)來實現(xiàn)web服務持續(xù)快速的發(fā)展。
nginx的第一行代碼寫于2002年,到2004年nginx通過2-two-clause BSD許可協(xié)議發(fā)布。自從nginx發(fā)布以來,它的用戶群一直持續(xù)增長,并且貢獻各種想法以及提交bug、提出各種意見和建議為整個社區(qū)提供了非常大的幫助。
nginx 的代碼庫是原創(chuàng)的,而且完全通過C語言來實現(xiàn)。它也已經(jīng)被移植到多種架構下的操作系統(tǒng)中,比如Linux, FreeBSD, Solaris, Mac OS X, AIX 和Windows系統(tǒng)。nginx也有自己的庫,而且這些庫并沒有使用系統(tǒng)中不存在的C庫,因此,除了zlib、PCRE和OpenSSL這幾個庫之外,用戶可以去掉自己不需要或者可能有許可沖突的庫。
這里稍微說一下windows版本的nginx。運行在windows下的nginx更像是一個概念驗證而不是一個功能齊全的端口。在windows下 nginx也是有限制的,那就是nginx不能很好的和windows內(nèi)核兼容,已經(jīng)知道的低版本的nginx在windows的問題有支持并發(fā)數(shù)少、性能低、緩存失效以及帶寬策略失效。今后,windows版本nginx將更加匹配主流功能。
?
總結
- 上一篇: NGINX介绍及参数
- 下一篇: MySQL与PostgreSQL:该选择