﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>P.Linux Laboratory &#187; LightHttp</title>
	<atom:link href="http://www.penglixun.com/tag/lighthttp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.penglixun.com</link>
	<description>MySQL DBA &#38; Linux SA</description>
	<lastBuildDate>Sun, 22 Jan 2012 16:34:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Lighttpd+Squid+Apache搭建高效率Web服务器</title>
		<link>http://www.penglixun.com/tech/system/build_webserver_use_lighttpd_spuid_apache.html</link>
		<comments>http://www.penglixun.com/tech/system/build_webserver_use_lighttpd_spuid_apache.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 05:01:07 +0000</pubDate>
		<dc:creator>P.Linux</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[LightHttp]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.penglixun.com/PLX/Blog/?p=280</guid>
		<description><![CDATA[本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/system/build_webserver_use_lighttpd_spuid_apache.html 架构原理 Apache通常... ]]></description>
			<content:encoded><![CDATA[<p><span style="color: #888888;">本文内容遵从<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" target="_blank">CC版权协议</a>, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明</br>网址: http://www.penglixun.com/tech/system/build_webserver_use_lighttpd_spuid_apache.html </p>
<p></span><br />
<h2>架构原理</h2>
<p><a href="http://www.apache.org/">Apache</a>通常是开源界的首选Web服务器，因为它的强大和可靠，已经具有了品牌效应，可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重，配置文件得让人望而生畏，高并发情况下效率不太高。而轻量级的Web服务器<a href="http://lighttpd.net/">Lighttpd</a>却是后起之秀，其静态文件的响应能力远高于Apache，据说是Apache的2-3倍。Lighttpd的高性能和易用性，足以打动我们，在它能够胜任的领域，尽量用它。Lighttpd对<acronym title="Pre-Hypertext Processing">PHP</acronym>的支持也很好，还可以通过Fastcgi方式支持其他的语言，比如Python。</p>
<p><span id="more-280"></span>毕竟Lighttpd是轻量级的服务器，功能上不能跟Apache比，某些应用无法胜任。比如Lighttpd还不支持缓存，而现在的绝大部分站点都是用程序生成动态内容，没有缓存的话即使程序的效率再高也很难满足大访问量的需求，而且让程序不停的去做同一件事情也实在没有意义。首先，Web程序是需要做缓存处理的，即把反复使用的数据做缓存。即使这样也还不够，单单是启动Web处理程序的代价就不少，缓存最后生成的静态页面是必不可少的。而做这个是 <a href="http://www.squid-cache.org/">Squid</a>的强项，它本是做代理的，支持高效的缓存，可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容，而Web应用程序只需要适当地设置页面实效时间即可。</p>
<p>即使是大部分内容动态生成的网站，仍免不了会有一些静态元素，比如图片、<acronym title="JavaScript">JS</acronym>脚本、<acronym title="Cascading Style Sheets">CSS</acronym>等等，将Squid放在Apache或者Lighttp前端后，反而会使性能下降，毕竟处理<acronym title="HyperText Transfer Protocol">HTTP</acronym>请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下，浪费内存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面，构成 Lighttpd+Squid+Apache的一条处理链，Lighttpd在最前面，专门用来处理静态内容的请求，把动态内容请求通过proxy模块转发给Squid，如果Squid中有该请求的内容且没有过期，则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过滤，Apache需要处理的请求将大大减少，减少了Web应用程序的压力。同时这样的构架，便于把不同的处理分散到多台计算机上进行，由Lighttpd在前面统一把关。</p>
<p>在这种架构下，每一级都是可以进行单独优化的，比如Lighttpd可以采用异步IO方式，Squid可以启用内存来缓存，Apache可以启用MPM 等，并且每一级都可以使用多台机器来均衡负载，伸缩性很好。</p>
<h2>实例讲解</h2>
<p>下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法。daviesliu.net域下有几个用 <a href="http://www.modpython.org/">mod_python</a>实现的<a href="http://blog.daviesliu.net/">blog站点</a>，几个php的站点，一个<a href="http://share.daviesliu.net/">mod_python的小程序</a>，以后可能还会架设几个<acronym title="Pre-Hypertext Processing">PHP</acronym>和<a href="http://www.djangoproject.com/">Django</a>的站点。而服务器非常弱，CPU为Celeron 500，内存为PC 100 384M，因此比较关注Web服务器的效率。这几个站点都是采用虚拟主机方式，开在同一台机器的同一个端口上。</p>
<p>Lighttpd服务于80端口，Squid运行在3128端口，Apache运行在81端口。</p>
<h3>Lighttpd的配置</h3>
<p>多个域名采用/var/www/domain/subdomain 的目录结构，用evhost模块配置document-root如下：</p>
<blockquote><p>evhost.path-pattern        =  var.basedir + “/%0/%3/” </p></blockquote>
<p>FtpSearch中有<acronym title="Practical Extraction and Report Language">Perl</acronym>脚本，需要启用<acronym title="Common Gateway Interface">CGI</acronym>支持，它是用来做ftp站内搜索的，缓存的意义不大，直接由lighttpd的mod_cgi处理：</p>
<blockquote><p>$<acronym title="HyperText Transfer Protocol">HTTP</acronym>["url"] =~ “^/cgi-bin/” { # only allow cgi&#8217;s in this directory<br />
    dir-listing.activate = “disable”    # disable directory listings<br />
    cgi.assign = ( “.pl”   =&gt;  “/usr/bin/perl”, “.cgi”  =&gt;  “/usr/bin/perl” )<br />
}</p></blockquote>
<p>bbs使用的是phpBB，访问量不大，可以放在lighttpd(fastcgi)或者apache(mod_php)下，暂时使用 lighttpd，设置所有.php的页面请求有fastcgi处理：</p>
<blockquote><p>fastcgi.server = ( “.php” =&gt;  ( (  “host”  =&gt; “127.0.0.1&#8243;, “port”=&gt; 1026,  “bin-path”  =&gt;  “/usr/bin/php-cgi”  )  ) )</p></blockquote>
<p>blog.daviesliu.net 和 blog.rainbud.net 是用mod_python编写的blogxp程序，所有静态内容都有扩展名，而动态内容没有扩展名。blogxp是用python程序生成<acronym title="eXtensible Markup Language">XML</acronym>格式的数据再交由mod_xslt转换成<acronym title="HyperText Markup Language">HTML</acronym>页面，只能放在Apache下运行。该站点采用典型Lighttpd+Squid+Apache方式处理：</p>
<blockquote><p>$<acronym title="HyperText Transfer Protocol">HTTP</acronym>["host"] =~ “^blog” { <br />
    $<acronym title="HyperText Transfer Protocol">HTTP</acronym>["url"] !~ “\.” {      <br />
        proxy.server = ( “” =&gt; ( “localhost” =&gt; ( “host”=&gt; “127.0.0.1&#8243;, “port”=&gt; 3128 ) ) )  #3128端口为<br />
    }<br />
}</p></blockquote>
<p>share中有静态页面，也有用mod_python处理的请求，在/cgi/下：</p>
<blockquote><p>$<acronym title="HyperText Transfer Protocol">HTTP</acronym>["host"] =~ “^share” {<br />
    proxy.server = (<br />
        “/cgi” =&gt; ( “localhost” =&gt; ( “host”=&gt; “127.0.0.1&#8243;, “port”=&gt; 3128 )  )  <br />
    )<br />
}</p></blockquote>
<h3>Squid的配置</h3>
<p>只允许本地访问：</p>
<blockquote><p>http_port   3128<br />
http_access allow localhost<br />
http_access deny all</p></blockquote>
<p>启用反向代理：</p>
<blockquote><p> httpd_accel_host 127.0.0.1<br />
 httpd_accel_port 81                   #apache的端口<br />
 httpd_accel_single_host on<br />
 httpd_accel_with_proxy on          #启用缓存<br />
 httpd_accel_uses_host_header on #启用虚拟主机支持</p></blockquote>
<p>此方向代理支持该主机上的所有域名。</p>
<h3>Apache的配置</h3>
<p>配置/etc/conf.d/apache2，让其加载mod_python、mod_xslt、mod_php模块：</p>
<blockquote><p>APACHE2_OPTS=”-D PYTHON -D <acronym title="eXtensible Stylesheet Language Transformations">XSLT</acronym> -D PHP5&#8243;</p></blockquote>
<p>所有网站的根目录：</p>
<blockquote><p>&lt;Directory “/var/www”&gt;<br />
   AllowOverride All     #允许.htaccess覆盖<br />
    Order allow,deny<br />
    Allow from all<br />
&lt;/Directory&gt;</p></blockquote>
<p>基于域名的虚拟主机：</p>
<blockquote><p>&lt;VirtualHost *:81&gt;<br />
ServerName blog.daviesliu.net<br />
DocumentRoot /var/www/daviesliu.net/blog<br />
&lt;/VirtualHost&gt;</p></blockquote>
<p>这里明显没有lighttpd的evhost配置方便。</p>
<p>blog.daviesliu.net下的.htaccess设置(便于开发，不用重启Apache):</p>
<blockquote><p>SetHandler mod_python<br />
PythonHandler blogxp.publisher<br />
PythonDebug On<br />
PythonAutoReload On</p>
<p>&lt;FilesMatch “\.”&gt;<br />
    SetHandler None        #静态文件直接由Apache处理<br />
&lt;/FilesMatch&gt;</p>
<p>&lt;IfModule mod_xslt.c&gt;<br />
    AddType text/xsl .xsl  #防止对xsl文件进行转化<br />
    AddOutputFilterByType mod_xslt text/xml<br />
    XSLTCache off<br />
    XSLTProcess on<br />
&lt;/IfModule&gt;<br />
Header set Pragma “cache”<br />
Header set Cache-Control “cache”</p></blockquote>
<p>在blogxp.publisher里面，还需要设置返回的文档类型和过期时间：</p>
<blockquote><p>    req.content_type = “text/xml”<br />
    req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 )</p></blockquote>
<p>经过这样的配置，所有站点都可以通过80、3128、81三个端口进行正常访问，80端口用作对外的访问，以减少负荷。81端口可以用作开发时的调试，没有缓存的困扰。</p>
<h2>性能测试</h2>
<p>由于时间和精力有限，下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均)，评价指标为每秒钟的请求数。<br />
测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例：</p>
<blockquote><p>ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js</p></blockquote>
<p>静态内容：prototype.js (27kB)</p>
<div>
<table border="1" cellspacing="3" cellpadding="3">
<tbody>
<tr>
<td width="25%">Con</td>
<td width="25%">Lighttpd(:80)</td>
<td width="25%">Squid(:3128)</td>
<td width="25%">Apache(:81)</td>
</tr>
<tr>
<td width="25%">1</td>
<td width="25%">380</td>
<td width="25%">210</td>
<td width="25%">240</td>
</tr>
<tr>
<td width="25%">10</td>
<td width="25%">410</td>
<td width="25%">215</td>
<td width="25%">240</td>
</tr>
<tr>
<td width="25%">100</td>
<td width="25%">380</td>
<td width="25%" align="center" valign="middle">160</td>
<td width="25%" align="center" valign="middle">230</td>
</tr>
</tbody>
</table>
<p>可见在静态内容上，Lighttpd表现强劲，而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些。</p>
<p>动态页面：/rss (31kB)</p></div>
<div>
<table border="1" cellspacing="3" cellpadding="5">
<tbody>
<tr>
<td width="25%">Con</td>
<td width="25%">Lighttpd(:80)</td>
<td width="25%">Squid(:3128)</td>
<td width="25%">Apache(:81)</td>
</tr>
<tr>
<td width="25%">1</td>
<td width="25%">103</td>
<td width="25%">210</td>
<td width="25%">6.17</td>
</tr>
<tr>
<td width="25%">10</td>
<td width="25%">110</td>
<td width="25%">200</td>
<td width="25%">6.04</td>
</tr>
<tr>
<td>100</td>
<td width="25%">100</td>
<td width="25%">100</td>
<td width="25%">6.24</td>
</tr>
</tbody>
</table>
</div>
<p>在动态内容上，Squid的作用非常明显，而Lighttpd受限于Squid的效率，并且还要低一大截。如果是有多台Squid来做均衡的话，Lighttpd的功效才能发挥出来。<br />
在单机且静态内容很少的情况下，可以不用Lighttpd而将Squid置于最前面。</p><h2  class="related_post_title">类似的文章</h2><ul class="related_post"><li>2009年07月15日 -- <a href="http://www.penglixun.com/tech/system/nginx_php_fastcgi_better_apache.html" title="Nginx 0.7.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器">Nginx 0.7.x + PHP 5.2.10（FastCGI）搭建胜过Apache十倍的Web服务器</a> (0)</li><li>2009年11月17日 -- <a href="http://www.penglixun.com/tech/system/configure_all_function_cacti.html" title="配置全功能Cacti">配置全功能Cacti</a> (0)</li><li>2009年05月24日 -- <a href="http://www.penglixun.com/tech/system/load_average_concept.html" title="load average概念理解">load average概念理解</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.penglixun.com/tech/system/build_webserver_use_lighttpd_spuid_apache.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

