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