首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web Service >

[百度分享]Lighttpd跟nginx的对比

2013-01-05 
[百度分享]Lighttpd和nginx的对比背景lighttpd和nginx是近年来两个流行的高性能web server。nginx在近几年

[百度分享]Lighttpd和nginx的对比
背景
lighttpd和nginx是近年来两个流行的高性能web server。nginx在近几年冒起很快,根据netcraft对2010年2月所有网站域名的web server市场份额调查显示,nginx占据第4位,已明显超越了lighttpd,如下图示: 

百度有一些服务使用lighttpd,我们希望对 nginx开展调研,并和lighttpd进行对比。 
概述 
Nginx和lighttpd基本上是同质的,都是采用基于epoll/kqueue/select的全异步事件模型,可以轻松地维持大量的连接,不惧怕慢连接攻击。两者都提供了丰富的HTTP服务功能,例如压缩、url rewrite、虚拟主机、SSL、proxy等等。 
Nginx大量模仿了apache的设计风格,比如模块的定义、装配、以及配置数据的解析和组织方式等等。Lighttpd则是自己设计的一套。 和lighttpd相比,Nginx做事更加精细,它提供的一些比较特别。 
Nginx的代码入手更困难一些(主观看法)。举个例子,Nginx内部的HTTP状态迁移是比较隐性的,它通过一系列的handler赋值来实现,如果要完整地追踪一次HTTP请求的处理过程,比较费劲。这个就说明,一旦出了问题,追查比较困难。而lighttpd的代码中有一个显式的HTTP状态迁移,一目了然,相比之下比较好看一些。 
扩展模块开发方面,nginx的module模仿了apache的设计和实现方式,和lighttpd是完全不同的。主观感觉上nginx模块开发的入门门槛更高一些,因为必须弄清楚nginx的内部运行机制才好确认你写的代码到底有没有问题和隐患。 
和lighttpd一样,nginx同样存在着开发文档很少的问题。最好的文档还是源码本身。 
功能 
Nginx完全不支持动态库so,所以它的模块都必须静态编译,且不能动态加载。要加载哪些模块,模块按照怎样的顺序执行,都是在编译期由 configure指定的,如果要调整,也只能重新编译一遍,无法通过改配置来实现。在这方面,Lighttpd做得比nginx好。Lighttpd支 持动态so,并且可以在配置文件中调整各模块的先后顺序,在某些应用场景下,调整模块的先后顺序是很有用的。 
条件配置语法的灵活性,lighttpd比nginx要好一些。Lighttpd可以很方便地配置成这样: 
$HTTP[“url”] =~ “…” {
   Proxy-core.backends = (“10.1.1.1:8080”, “10.1.1.2:8080”, …)
   Proxy-core.balancer = “round-robin”
   Proxy-core.protocol = “http”
   ……
}

$HTTP[“host”] =~ “…” {
   Access.deny-all = “enable”
}

$HTTP[“useragent”] =~ “…” {
   url.redirect = (“” => “http://example.com/”)
   url.redirect-code = 302
}

$HTTP[“url”] =~ “…” {
  $HTTP[“querystring”] =~ “…” {
$HTTP[“referer”] =~ “…” {
   …  
    }
  }
}
在nginx中,如果模块本身没提供条件支持的话,需要依赖rewrite模块做一次内部跳转,把变化反映到url上,再通过location使其生效。 
在一些具体的功能点上,nginx和lighttpd各有特点:
有一些比较细节的地方,nginx考虑得比lighttpd周全,比如nginx可以配置HTTP头部的长度、HTTP请求的读写超时 等,lighttpd的官方版本是不支持的,百度对此进行了改良。再例如nginx可以配置listen队列长度、nginx进程起来后 挂在哪个CPU核上运行,lighttpd现在还不支持。 
Nginx的proxy功能比lighttpd强大,主要是proxy cache,另外还有一些细节上的处理。比如nginx支持4xx/5xx错误自动重试下一个后端。但是Lighttpd的proxy现在还支持scgi 和ajp两种后端转发协议,nginx不支持。 
Nginx有一些比较有特色的功能module,例如: 
1)secure_link,可以用来防盗链,目前在CDN上有应用。这个功能很不错,可以考虑在lighttpd上开发相应的模块。 
2)geoip,用户给配置一个ip地理信息数据文件,nginx可以以此为根据,判断客户端ip来自哪个国家和城市。 

性能 
根据简单性能对比,Nginx的性能比lighttpd略好。原因可能有以下几方面: 
1. Lighttpd启动了几个辅助线程,有加锁竞争行为,这样会使性能有所降低(线程个数是可配的,这里还有优化的余地);nginx完全不涉及线程,不加锁。 
2. Lighttpd有动态so,nginx全静态编译,动态库执行效率比静态慢大约5%~10%左右。 
3. Nginx在细节优化上可能做得更好一些。例如nginx的epoll是ET(边缘触发)的,而lighttpd的epoll是LT(水平触发)的。 
nginx的性能要好一些,不过对大多数应用来说,lighttpd的性能指标已够用了,一个系统主要的瓶颈往往是在后端。由于lighttpd具有动态模块的加载能力,适合非常需要灵活配置的场合。 
总体而言,nginx和lighttpd都是非常好的web server选择。
[解决办法]
不错,很好的东西,定了
[解决办法]
板凳 不错 ···············
[解决办法]
顶起      !!!   
[解决办法]
很实用
[解决办法]
顶。。[百度分享]Lighttpd跟nginx的对比


[解决办法]
要想性能好,还得跑在linux下..
[解决办法]
虽然我现在用不着这些Web Server,不过我觉得这个内容还是挺不错的
[解决办法]
[百度分享]Lighttpd跟nginx的对比
[解决办法]
两个都用了用,还没像LZ这样深入到编程的角度,只是从使用的角度上,觉得
1. 从配置上Nginx的语法貌似要简单些(个人感觉)。
2. Nginx的proxy_cache更方便些,不像lighttpd还要自己打patch。不过proxy_cache有个严重的bug,导致有一定几率(很小)使不该被缓存的页面被缓存。但是可以通过配置手段回避。
3. lighttpd做反向代理的时候不支持对动态页面的gzip,也不知道现在改了没有,当时说要在1.5里面加进去的。
最终因为第三条我只能选择nginx了,因为没有gzip的话会造成很大一笔流量费用。
[解决办法]
个人觉得这种实用性的技术贴值得顶起。。。
[解决办法]
来曾分的!
[解决办法]
学习。。。
[解决办法]
来曾分的!
[解决办法]
楼主打字速度很快啊 转眼间3篇大作完成
[解决办法]
一直都想用来着,不过还在学servlet中,飘过学习
[解决办法]
长知识了
[解决办法]
学习学习
[解决办法]
不错
学习了。
[解决办法]
还是apache好使
[解决办法]
顶一个 接分:)
[解决办法]
不错,很好的东西,定了 
 

热点排行