本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7593678
建立时间:2006年5月29日




[网站架构]Lighttpd+Squid+Apache搭建高效率Web服务器
软件技术

lhwork 发表于 2007/1/21 15:04:00

架构原理 Apache通常是开源界的首选Web服务器,因为它的强大和可靠,已经具有了品牌效应,可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重,配置文件得让人望而生畏,高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却 是后起之秀,其静态文件的响应能力远高于Apache,据说是Apache的2-3倍。Lighttpd的高性能和易用性,足以打动我们,在它能够胜任的 领域,尽量用它。Lighttpd对PHP的支持也很好,还可以通过Fastcgi方式支持其他的语言,比如Python。 毕竟Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些应用无法胜任。比如Lighttpd还不支持缓存,而现在的绝大部分站点都是用 程序生成动态内容,没有缓存的话即使程序的效率再高也很难满足大访问量的需求,而且让程序不停的去做同一件事情也实在没有意义。首先,Web程序是需要做 缓存处理的,即把反复使用的数据做缓存。即使这样也还不够,单单是启动Web处理程序的代价就不少,缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项,它本是做代理的,支持高效的缓存,可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容,而Web应用程序只需要适当地设置页面实效时间即可。 即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等等,将Squid放在Apache或者Lighttp前端后, 反而会使性能下降,毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下,浪费内存和硬盘空间。因此 可以考虑将Lighttpd再放在Squid的前面,构成 Lighttpd+Squid+Apache的一条处理链,Lighttpd在最前面,专门用来处理静态内容的请求,把动态内容请求通过proxy模块转 发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处 理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求将大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处 理分散到多台计算机上进行,由Lighttpd在前面统一把关。 在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM 等,并且每一级都可以使用多台机器来均衡负载,伸缩性很好。 实例讲解 下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法。daviesliu.net域下有几个用 mod_python实现的blog站点,几个php的站点,一个mod_python的小程序,以后可能还会架设几个PHP和Django的站点。而服务器非常弱,CPU为Celeron 500,内存为PC 100 384M,因此比较关注Web服务器的效率。这几个站点都是采用虚拟主机方式,开在同一台机器的同一个端口上。 Lighttpd服务于80端口,Squid运行在3128端口,Apache运行在81端口。 Lighttpd的配置 多个域名采用/var/www/domain/subdomain 的目录结构,用evhost模块配置document-root如下:evhost.path-pattern        =  var.basedir + "/%0/%3/"  FtpSearch中有Perl脚本,需要启用CGI支持,它是用来做ftp站内搜索的,缓存的意义不大,直接由lighttpd的mod_cgi处理: $HTTP["url"] =~ "^/cgi-bin/" { # only allow cgi's in this directory     dir-listing.activate = "disable"    # disable directory listings     cgi.assign = ( ".pl"   =>  "/usr/bin/perl", ".cgi"  =>  "/usr/bin/perl" ) } bbs使用的是phpBB,访问量不大,可以放在lighttpd(fastcgi)或者apache(mod_php)下,暂时使用 lighttpd,设置所有.php的页面请求有fastcgi处理:fastcgi.server = ( ".php" =>  ( (  "host"  => "127.0.0.1", "port"=> 1026,  "bin-path"  =>  "/usr/bin/php-cgi"  )  ) ) blog.daviesliu.net 和 blog.rainbud.net 是用mod_python编写的blogxp程序,所有静态内容都有扩展名,而动态内容没有扩展名。blogxp是用python程序生成XML格式的数 据再交由mod_xslt转换成HTML页面,只能放在Apache下运行。该站点采用典型Lighttpd+Squid+Apache方式处理: $HTTP["host"] =~ "^blog" {      $HTTP["url"] !~ "\." {               proxy.server = ( "" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 ) ) )  #3128端口为     } } share中有静态页面,也有用mod_python处理的请求,在/cgi/下:$HTTP["host"] =~ "^share" {     proxy.server = (         "/cgi" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 )  )       ) } Squid的配置 只允许本地访问:http_port   3128 http_access allow localhost http_access deny all 启用反向代理: httpd_accel_host 127.0.0.1  httpd_accel_port 81                   #apache的端口  httpd_accel_single_host on  httpd_accel_with_proxy on          #启用缓存  httpd_accel_uses_host_header on #启用虚拟主机支持 此方向代理支持该主机上的所有域名。 Apache的配置 配置/etc/conf.d/apache2,让其加载mod_python、mod_xslt、mod_php模块:APACHE2_OPTS="-D PYTHON -D XSLT -D PHP5" 所有网站的根目录:<Directory "/var/www">    AllowOverride All     #允许.htaccess覆盖     Order allow,deny     Allow from all </Directory> 基于域名的虚拟主机:<VirtualHost *:81> ServerName blog.daviesliu.net DocumentRoot /var/www/daviesliu.net/blog </VirtualHost> 这里明显没有lighttpd的evhost配置方便。 blog.daviesliu.net下的.htaccess设置(便于开发,不用重启Apache):SetHandler mod_python PythonHandler blogxp.publisher PythonDebug On PythonAutoReload On <FilesMatch "\.">     SetHandler None        #静态文件直接由Apache处理 </FilesMatch> <IfModule mod_xslt.c>     AddType text/xsl .xsl  #防止对xsl文件进行转化     AddOutputFilterByType mod_xslt text/xml     XSLTCache off     XSLTProcess on </IfModule> Header set Pragma "cache" Header set Cache-Control "cache" 在blogxp.publisher里面,还需要设置返回的文档类型和过期时间:    req.content_type = "text/xml"     req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 ) 经过这样的配置,所有站点都可以通过80、3128、81三个端口进行正常访问,80端口用作对外的访问,以减少负荷。81端口可以用作开发时的调试,没有缓存的困扰。 性能测试 由于时间和精力有限,下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均),评价指标为每秒钟的请求数。 测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例:ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js 静态内容:prototype.js (27kB) Con Lighttpd(:80) Squid(:3128) Apache(:81) 1 380 210 240 10 410 215 240 100 380 160 230 可见在静态内容上,Lighttpd表现强劲,而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些。 动态页面:/rss (31kB) Con Lighttpd(:80) Squid(:3128) Apache(:81) 1 103 210 6.17 10 110 200 6.04 100 100 100 6.24 在动态内容上,Squid的作用非常明显,而Lighttpd受限于Squid的效率,并且还要低一大截。如果是有多台Squid来做均衡的话,Lighttpd的功效才能发挥出来。 在单机且静态内容很少的情况下,可以不用Lighttpd而将Squid置于最前面。


阅读全文(2800) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.363 second(s), page refreshed 144761217 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号