本文已經(jīng)發(fā)表于InfoQ中文站點(diǎn)(http://www.infoq.com/cn/news/2007/07/light-web-servers)
IBM developerWorks網(wǎng)站上最近發(fā)布了一則Cameron Laird的關(guān)于輕量級(jí)Web服務(wù)器的文章,
里面列舉了很多的輕型的Web服務(wù)器實(shí)現(xiàn)和它們的特點(diǎn),Cameron還從自己的經(jīng)驗(yàn)出發(fā)總結(jié)了評(píng)價(jià)Web服務(wù)器的一些指標(biāo)。這篇文章目的在于擴(kuò)展我們?cè)?
Web應(yīng)用部署時(shí)的思路,讓我們重新思考Web應(yīng)用的架構(gòu)和部署方案。眾多的輕量級(jí)Web服務(wù)器其實(shí)見(jiàn)證了動(dòng)態(tài)腳本語(yǔ)言實(shí)現(xiàn)Web應(yīng)用的火爆,給實(shí)現(xiàn)
Web應(yīng)用提供了更多解決方案。
輕量Web服務(wù)器這個(gè)概念關(guān)注“輕巧性”,這意味著簡(jiǎn)單、易于安裝、流線(xiàn)化、要求低和健壯。這種“輕巧”主要是相對(duì)于目前市場(chǎng)占有率占優(yōu)的
Apache和IIS而言的,輕量Web服務(wù)器應(yīng)該更小更簡(jiǎn)單,并且它們至少要有一些性能/特性超過(guò)這兩個(gè)產(chǎn)品(這樣它們才可能分得市場(chǎng)份額)。
Cameron這樣對(duì)比了“輕量”相比“重量”的一些優(yōu)勢(shì):
輕量級(jí)Web服務(wù)器可以適用于市場(chǎng)領(lǐng)頭產(chǎn)品和其他“重量級(jí)”服務(wù)器無(wú)法勝任的情況。例如,整個(gè)服務(wù)器可以打包在一個(gè)文件中。這意
味著開(kāi)發(fā)人員可以方便地?cái)y帶生產(chǎn)環(huán)境所需的所有工具。即使在生產(chǎn)服務(wù)器上運(yùn)行的是
Apache,也仍然可以在賓館的房間里,借助只需數(shù)秒鐘就可以安裝完畢的輕量級(jí)Web服務(wù)器以嘗試新想法。而且,由于輕量級(jí)Web服務(wù)器要求很低,因此
可以在那些無(wú)法負(fù)擔(dān)IIS的主機(jī)上順暢地運(yùn)行。
我們關(guān)注一下目前的Web服務(wù)器占有率情況,Netcraft在它2007年7月的Web服務(wù)器調(diào)查中的服務(wù)器占有率數(shù)據(jù)如下:
開(kāi)發(fā)者 |
2007年6月 |
百分比 |
2007年7月 |
百分比 |
變更率 |
Apache |
65588298 |
53.76 |
66144734 |
52.65 |
-1.11 |
Microsoft |
38836030 |
31.83 |
41257913 |
32.84 |
1.01 |
Google |
4872765 |
3.99 |
5465538 |
4.35 |
0.36 |
Sun |
2273173 |
1.86 |
2245493 |
1.79 |
-0.07 |
lighttpd |
1470930 |
1.21 |
1471779 |
1.17 |
-0.04 |
Zeus |
480698 |
0.39 |
463449 |
0.37 |
-0.02 |
其中Apache占有率最高,它是公認(rèn)的穩(wěn)定、性能優(yōu)良、開(kāi)發(fā)者活躍的開(kāi)源軟件產(chǎn)品。而Microsoft則受益于Windows平臺(tái)內(nèi)置的PWS
和IIS的優(yōu)勢(shì)及.NET平臺(tái)的市場(chǎng)占優(yōu)率,占有第二的位置。Sun則是由于歷史問(wèn)題,它的iPlanet、SunONE和一并計(jì)算的Netscape-
Communications產(chǎn)品還能躋身前4。后面的lighttpd則是輕量型Web容器的代表,已經(jīng)超過(guò)了老牌的商業(yè)Web服務(wù)器Zeus
(ServerWatch給出了一個(gè)lighttpd市場(chǎng)占有率上升的分析),主要因?yàn)橐恍〢JAX項(xiàng)目和Ruby on Rails(以下簡(jiǎn)稱(chēng)RoR)的流行對(duì)它的廣泛部署起了推波助瀾的作用。
輕量Web服務(wù)器除了lighttpd還有mongrel也經(jīng)常被提及,主要因?yàn)樗鼈兪荝oR項(xiàng)目的兩種主要部署方案。JavaEye的創(chuàng)始人Robbin Fan曾經(jīng)在它的blog中對(duì)比過(guò)RoR的這兩種部署方案:
(RoR項(xiàng)目)用fcgi方式還是http方式,我個(gè)人覺(jué)得區(qū)別不大,關(guān)鍵還是看應(yīng)用的場(chǎng)合,一般而言,推薦的搭配是lighttpd+fcgi 或者nginx+mongrel,而Apache因?yàn)樾阅懿罹啵槐煌扑]。
lighttpd+fcgi是大量使用腳本語(yǔ)言編寫(xiě)的網(wǎng)站的首選部署方案,Robbin Fan在同一篇文章中闡述了他選擇lighttp部署JavaEye的理由:
JavaEye為什么用lighttpd+fcgi呢?原因如下:
1) lighttpd發(fā)展了好幾年了,市場(chǎng)占有率也相當(dāng)高,是一個(gè)經(jīng)過(guò)實(shí)踐檢驗(yàn)的server,它的文檔也很全;
2) JavaEye的Ruby進(jìn)程和Web Server在一臺(tái)機(jī)器上面跑,通過(guò)unix socket使用fcgi協(xié)議通訊可以避免tcp的網(wǎng)絡(luò)開(kāi)銷(xiāo),其通訊速度比使用tcp socket使用http協(xié)議通訊要快一些。
Robbin選擇lighttpd的主要原因是性能好于Apache。并且Apache目前的fastcgi模塊有些bug,而對(duì)于像RoR這樣的項(xiàng)目fastcgi是一種很好的部署方式,所以Apache就因此失去了這塊份額。最近InfoQ報(bào)道過(guò)的RubyWorks提
供的RoR工作棧中選擇了Haproxy+mongrel的方式,這也是前面引用的Robbin所說(shuō)的另外一種部署方案。mongrel本身可以跑
Ruby進(jìn)程,同時(shí)也是一個(gè)http服務(wù)器,它可以兼顧動(dòng)態(tài)和靜態(tài)Web服務(wù),配合Haproxy做負(fù)載均衡就可以支持大并發(fā)量的Web應(yīng)用,所以它越來(lái)
越流行了。
可見(jiàn)輕量級(jí)Web服務(wù)器由于性能/特性上的一些優(yōu)勢(shì),開(kāi)始逐漸瓜分Apache、IIS所沒(méi)有照顧到的一些新興的市場(chǎng)分額。那么如何去評(píng)價(jià)一個(gè)Web服務(wù)器呢?Cameron給出了如下的
一些重要指標(biāo):
性能:對(duì)請(qǐng)求作出響應(yīng)的速度有多快?
可伸縮性:當(dāng)很多用戶(hù)同時(shí)訪問(wèn)它時(shí),服務(wù)器還能繼續(xù)可靠地運(yùn)行嗎?
安全性:服務(wù)器是否只執(zhí)行它應(yīng)該執(zhí)行的操作。它在認(rèn)證用戶(hù)和加密傳輸方面提供了怎樣的支持?它的使用是否使附近的應(yīng)用程序或主機(jī)變得更易受攻擊?
可靠性:服務(wù)器的失效模式和故障發(fā)生率如何?
標(biāo)準(zhǔn)遵從性:服務(wù)器遵從相關(guān)的 RFC 嗎?
靈活性:是否可以對(duì)服務(wù)器進(jìn)行調(diào)優(yōu),以支持較重的請(qǐng)求負(fù)載、需要計(jì)算的動(dòng)態(tài)頁(yè)面或者代價(jià)不菲的認(rèn)證等等?
平臺(tái)需求:該服務(wù)器可用于哪些平臺(tái)?它是否有特定的硬件需求?
易管理性:服務(wù)器是否易于設(shè)置和維護(hù)?它是否與日志記錄、審計(jì)、成本計(jì)算等組織標(biāo)準(zhǔn)兼容?
目前越來(lái)越多的輕型Web服務(wù)器開(kāi)始在上面的一個(gè)或著多個(gè)方面向Apache和IIS提出了挑戰(zhàn),因?yàn)楹茈y有一個(gè)Web服務(wù)器可以做到面面俱到。我們可以從Cameron提供的一份列表里面看到一些選用輕量級(jí)Web服務(wù)器的
成功案例:
YouTube依靠lighttpd快速交付歸檔的內(nèi)容,例如視頻;
cdServe運(yùn)行 “German Woodworking Machinery and Tools” CD;
LiteSpeed宣揚(yáng)它在
twitter、www.funnyoride.com、www.airliners.com、WordPress.com、
fanfiction.com、SlashGear、www.forumactif.com 和其他著名Web 站點(diǎn)上擔(dān)任的角色;
OpenSUSE、RubyOnRails、MarkaBoo和其他一些著名站點(diǎn)依賴(lài)于Mongrel;
demon.net、bluelight.com、mtv.com、The Drudge Report、garfield.com等站點(diǎn)則使用thttpd;
上面的例子中有一些使用RoR的網(wǎng)站的例子,Cameron指出不僅是網(wǎng)站可以使用常規(guī)以外的其他編程語(yǔ)言。“不常見(jiàn)”語(yǔ)言還可以被用來(lái)實(shí)現(xiàn)輕量
Web服務(wù)器,例如Erlang、Java、Lisp、Lua、Perl、Python和Tcl。用這些語(yǔ)言實(shí)現(xiàn)的輕量級(jí)Web服務(wù)器不一定只是在性能/
特性上超過(guò)Apache和IIS,它們可以提供例如容易嵌入、體積輕小這樣的特性來(lái)吸引開(kāi)發(fā)者的使用。Cameron給出了使用“不常見(jiàn)”語(yǔ)言編寫(xiě)輕量級(jí)
Web服務(wù)器的原因:
教學(xué):使用輕量級(jí)Web服務(wù)器來(lái)制定一個(gè)重要、但是并不太大的目標(biāo)。這是獲得使用某種語(yǔ)言的經(jīng)驗(yàn)的好方法。
雖然用C編寫(xiě)的輕量級(jí)Web服務(wù)器大小為10-50KB,更高級(jí)的語(yǔ)言有100KB到數(shù)MB的運(yùn)行時(shí),但整個(gè) Web 服務(wù)器的源文件可能只占幾千個(gè)字節(jié)。這種Web服務(wù)器占用的空間很小,因此比Apache更易于與技術(shù)伙伴共享。
更高級(jí)的語(yǔ)言可以使實(shí)驗(yàn)更吸引人 —— 例如,添加一個(gè)新的HTTP/1.1特性可能只需幾行源代碼。這些輕量級(jí)服務(wù)器是非常方便的實(shí)驗(yàn)材料。
將HTTP服務(wù)器添加到已有的、用高級(jí)語(yǔ)言編寫(xiě)的應(yīng)用程序中只需增加幾行源代碼。
如前所述,不同的輕量級(jí)Web服務(wù)器有著不同的優(yōu)點(diǎn),它們或多或少獨(dú)立于編程語(yǔ)言。所有輕量級(jí)Web服務(wù)器都比Apache更小、更易于配置。與
Apache相比,有些輕量級(jí) Web
服務(wù)器更快,有些則快得多。有些則強(qiáng)調(diào)安全性、重負(fù)載下的從容性、可擴(kuò)展性或者內(nèi)存占有量。在任何情況下,都可以以一種不適用于 Apache
的方式徹底地理解這些服務(wù)器。
這些理由從另外一個(gè)方面說(shuō)明了輕量級(jí)Web服務(wù)器的優(yōu)勢(shì),Cameron還提供了一長(zhǎng)串的輕量級(jí)Web服務(wù)器的列表和簡(jiǎn)介,感興趣的讀者可以認(rèn)真閱讀,從中尋找到您感興趣的實(shí)現(xiàn)。輕量級(jí)Web服務(wù)器不只是Apache、IIS的競(jìng)爭(zhēng)者,也是很好的合作者(例如我們經(jīng)常可以見(jiàn)到關(guān)于mongrel與Apache配合使用的文章),現(xiàn)在我們還可以看到很多服務(wù)器協(xié)作部署的例子,各取所長(zhǎng)應(yīng)該是最佳的選擇,所以我們更應(yīng)該從現(xiàn)在就開(kāi)始拓寬眼界,尋找我們所需要的。
最后,推薦對(duì)Web服務(wù)器感興趣的讀者可以使用Netcraft提供的Webserver Search的服務(wù)器查詢(xún)功能來(lái)探索你感興趣的網(wǎng)站的服務(wù)器,Webserver Search可以報(bào)告搜索的url對(duì)應(yīng)的服務(wù)器的操作系統(tǒng)和Web服務(wù)器類(lèi)型,是設(shè)計(jì)部署方案的一個(gè)很好參考。