本文已经发表于InfoQ中文站点(http://www.infoq.com/cn/news/2007/07/light-web-servers)
IBM developerWorks网站上最近发布了一则Cameron Laird的关于轻量级Web服务器的文章,
里面列举了很多的轻型的Web服务器实现和它们的特点,Cameron还从自己的经验出发总结了评价Web服务器的一些指标。这篇文章目的在于扩展我们在
Web应用部署时的思路,让我们重新思考Web应用的架构和部署方案。众多的轻量级Web服务器其实见证了动态脚本语言实现Web应用的火爆,给实现
Web应用提供了更多解决方案。
轻量Web服务器这个概念关注“轻巧性”,这意味着简单、易于安装、流线化、要求低和健壮。这种“轻巧”主要是相对于目前市场占有率占优的
Apache和IIS而言的,轻量Web服务器应该更小更简单,并且它们至少要有一些性能/特性超过这两个产品(这样它们才可能分得市场份额)。
Cameron这样对比了“轻量”相比“重量”的一些优势:
轻量级Web服务器可以适用于市场领头产品和其他“重量级”服务器无法胜任的情况。例如,整个服务器可以打包在一个文件中。这意
味着开发人员可以方便地携带生产环境所需的所有工具。即使在生产服务器上运行的是
Apache,也仍然可以在宾馆的房间里,借助只需数秒钟就可以安装完毕的轻量级Web服务器以尝试新想法。而且,由于轻量级Web服务器要求很低,因此
可以在那些无法负担IIS的主机上顺畅地运行。
我们关注一下目前的Web服务器占有率情况,Netcraft在它2007年7月的Web服务器调查中的服务器占有率数据如下:
开发者 |
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占有率最高,它是公认的稳定、性能优良、开发者活跃的开源软件产品。而Microsoft则受益于Windows平台内置的PWS
和IIS的优势及.NET平台的市场占优率,占有第二的位置。Sun则是由于历史问题,它的iPlanet、SunONE和一并计算的Netscape-
Communications产品还能跻身前4。后面的lighttpd则是轻量型Web容器的代表,已经超过了老牌的商业Web服务器Zeus
(ServerWatch给出了一个lighttpd市场占有率上升的分析),主要因为一些AJAX项目和Ruby on Rails(以下简称RoR)的流行对它的广泛部署起了推波助澜的作用。
轻量Web服务器除了lighttpd还有mongrel也经常被提及,主要因为它们是RoR项目的两种主要部署方案。JavaEye的创始人Robbin Fan曾经在它的blog中对比过RoR的这两种部署方案:
(RoR项目)用fcgi方式还是http方式,我个人觉得区别不大,关键还是看应用的场合,一般而言,推荐的搭配是lighttpd+fcgi 或者nginx+mongrel,而Apache因为性能差距,而不被推荐。
lighttpd+fcgi是大量使用脚本语言编写的网站的首选部署方案,Robbin Fan在同一篇文章中阐述了他选择lighttp部署JavaEye的理由:
JavaEye为什么用lighttpd+fcgi呢?原因如下:
1) lighttpd发展了好几年了,市场占有率也相当高,是一个经过实践检验的server,它的文档也很全;
2) JavaEye的Ruby进程和Web Server在一台机器上面跑,通过unix socket使用fcgi协议通讯可以避免tcp的网络开销,其通讯速度比使用tcp socket使用http协议通讯要快一些。
Robbin选择lighttpd的主要原因是性能好于Apache。并且Apache目前的fastcgi模块有些bug,而对于像RoR这样的项目fastcgi是一种很好的部署方式,所以Apache就因此失去了这块份额。最近InfoQ报道过的RubyWorks提
供的RoR工作栈中选择了Haproxy+mongrel的方式,这也是前面引用的Robbin所说的另外一种部署方案。mongrel本身可以跑
Ruby进程,同时也是一个http服务器,它可以兼顾动态和静态Web服务,配合Haproxy做负载均衡就可以支持大并发量的Web应用,所以它越来
越流行了。
可见轻量级Web服务器由于性能/特性上的一些优势,开始逐渐瓜分Apache、IIS所没有照顾到的一些新兴的市场分额。那么如何去评价一个Web服务器呢?Cameron给出了如下的
一些重要指标:
性能:对请求作出响应的速度有多快?
可伸缩性:当很多用户同时访问它时,服务器还能继续可靠地运行吗?
安全性:服务器是否只执行它应该执行的操作。它在认证用户和加密传输方面提供了怎样的支持?它的使用是否使附近的应用程序或主机变得更易受攻击?
可靠性:服务器的失效模式和故障发生率如何?
标准遵从性:服务器遵从相关的 RFC 吗?
灵活性:是否可以对服务器进行调优,以支持较重的请求负载、需要计算的动态页面或者代价不菲的认证等等?
平台需求:该服务器可用于哪些平台?它是否有特定的硬件需求?
易管理性:服务器是否易于设置和维护?它是否与日志记录、审计、成本计算等组织标准兼容?
目前越来越多的轻型Web服务器开始在上面的一个或着多个方面向Apache和IIS提出了挑战,因为很难有一个Web服务器可以做到面面俱到。我们可以从Cameron提供的一份列表里面看到一些选用轻量级Web服务器的
成功案例:
YouTube依靠lighttpd快速交付归档的内容,例如视频;
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的网站的例子,Cameron指出不仅是网站可以使用常规以外的其他编程语言。“不常见”语言还可以被用来实现轻量
Web服务器,例如Erlang、Java、Lisp、Lua、Perl、Python和Tcl。用这些语言实现的轻量级Web服务器不一定只是在性能/
特性上超过Apache和IIS,它们可以提供例如容易嵌入、体积轻小这样的特性来吸引开发者的使用。Cameron给出了使用“不常见”语言编写轻量级
Web服务器的原因:
教学:使用轻量级Web服务器来制定一个重要、但是并不太大的目标。这是获得使用某种语言的经验的好方法。
虽然用C编写的轻量级Web服务器大小为10-50KB,更高级的语言有100KB到数MB的运行时,但整个 Web 服务器的源文件可能只占几千个字节。这种Web服务器占用的空间很小,因此比Apache更易于与技术伙伴共享。
更高级的语言可以使实验更吸引人 —— 例如,添加一个新的HTTP/1.1特性可能只需几行源代码。这些轻量级服务器是非常方便的实验材料。
将HTTP服务器添加到已有的、用高级语言编写的应用程序中只需增加几行源代码。
如前所述,不同的轻量级Web服务器有着不同的优点,它们或多或少独立于编程语言。所有轻量级Web服务器都比Apache更小、更易于配置。与
Apache相比,有些轻量级 Web
服务器更快,有些则快得多。有些则强调安全性、重负载下的从容性、可扩展性或者内存占有量。在任何情况下,都可以以一种不适用于 Apache
的方式彻底地理解这些服务器。
这些理由从另外一个方面说明了轻量级Web服务器的优势,Cameron还提供了一长串的轻量级Web服务器的列表和简介,感兴趣的读者可以认真阅读,从中寻找到您感兴趣的实现。轻量级Web服务器不只是Apache、IIS的竞争者,也是很好的合作者(例如我们经常可以见到关于mongrel与Apache配合使用的文章),现在我们还可以看到很多服务器协作部署的例子,各取所长应该是最佳的选择,所以我们更应该从现在就开始拓宽眼界,寻找我们所需要的。
最后,推荐对Web服务器感兴趣的读者可以使用Netcraft提供的Webserver Search的服务器查询功能来探索你感兴趣的网站的服务器,Webserver Search可以报告搜索的url对应的服务器的操作系统和Web服务器类型,是设计部署方案的一个很好参考。