﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-szhswl-文章分类-反向代理</title><link>http://www.blogjava.net/szhswl/category/29118.html</link><description>宋针还的个人空间</description><language>zh-cn</language><lastBuildDate>Wed, 23 Jan 2008 12:21:47 GMT</lastBuildDate><pubDate>Wed, 23 Jan 2008 12:21:47 GMT</pubDate><ttl>60</ttl><item><title>Squid反向代理的缓存(加速)服务器配置笔记</title><link>http://www.blogjava.net/szhswl/articles/177352.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Wed, 23 Jan 2008 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/177352.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/177352.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/177352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/177352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/177352.html</trackback:ping><description><![CDATA[Squid的介绍：<br />
一款超强、开源的Proxy软件，除了做普通的代理服务器外，还可以做反向代理的WEB加速。如果你知道国内他的使用者有sina、sohu、netease...
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote>忙活了两天，总算把Squid的反向代理服务器设置好了，总结一下，方便后来者
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote>本文主要讨论的是squid反向代理模式用做web加速服务器的设置<br />
按照本文的说明，你最终可以实现一个squid对多个网站进行缓存加速的功能(这些网站可以在squid本机上www.skyhe.com，也可以在其它服务器上bbs/photo.skyhe.com)
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote><strong>首先</strong><br />
你需要下载一份最新的Squid软件，并根据参考文章安装配置<br />
Squid&nbsp;-&nbsp;NT版本下载：<br />
<a href="http://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm" target="_blank">http://www.acmeconsulting.it/pagine/opensource/squid/SquidNT.htm</a><br />
Squid的正向代理服务设置相当简单，相信你很快就能获得成就感：）
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote><strong>其次</strong><br />
为了测试域名转向，你最好在自己的内网服务器上面安装一个DNS&nbsp;Server<br />
(DNS&nbsp;Server的安装设置问题请参考相关书籍或文章)，并设置好区域(正向查找、反向查找)、主机(A纪录)<br />
<blockquote>
<table class="bk" cellspacing="0" cellpadding="5" width="360" bgcolor="#d1d1d1" border="0">
    <tbody>
        <tr>
            <td>www.skyhe.com&nbsp;&nbsp;192.168.10.252<br />
            bbs.skyhe.com&nbsp;&nbsp;192.168.10.56<br />
            photo.skyhe.com&nbsp;&nbsp;192.168.10.119</td>
        </tr>
    </tbody>
</table>
</blockquote><br />
以上252是主网站的服务器IP(和Squid同一台机器)，56、119分别是其它两个网站的内部IP。
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote>同时，你需要在本地的host文件加入内部的DNS解析，比如：<br />
<blockquote>
<table class="bk" cellspacing="0" cellpadding="5" width="360" bgcolor="#d1d1d1" border="0">
    <tbody>
        <tr>
            <td>192.168.10.252&nbsp;&nbsp;www.skyhe.com<br />
            192.168.10.252&nbsp;&nbsp;bbs.skyhe.com<br />
            192.168.10.252&nbsp;&nbsp;photo.skyhe.com</td>
        </tr>
    </tbody>
</table>
</blockquote><br />
192.168.10.252是你的squid服务器地址，本文测试环境下，整个反向代理访问的流程是：<br />
<font color="#2e8b57">用户请求bbs.skyhe.com&nbsp;-&nbsp;本机host解析为192.168.10.252&nbsp;-&nbsp;squid服务器<br />
&nbsp;-&nbsp;DNS服务器(解析到192.168.1.56)&nbsp;-&nbsp;web服务器(如果没有缓存该页)&nbsp;-&nbsp;squid服务器&nbsp;-&nbsp;用户</font>
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote><strong>然后</strong><br />
根据参考文章配置反向代理服务器，在配置的过程中要注意以下几点<br />
1、服务器port设置<br />
本机转别机和本机转本机(squid和web&nbsp;server在一台机器上)的设置不同<br />
前者squid和web可以都用80端口，后者squid用80，web服务器得换端口<br />
2、dst和dstdomain的区别<br />
前者是对ip定义别名，后者是对domain定义别名<br />
如果采用ip定义别名，httpd_accel_host不能采用&#8220;virtual&#8221;模式<br />
3、httpd_accel_with_proxy<br />
采用加速器模式，默认是关掉代理服务的，如果打开，将无法使用高速缓存加入web服务（加速器下，squid会将web内容放入内存，响应速度肯定比硬盘文件缓存快）<br />
我的配置文件如下：<br />
<blockquote>
<table class="bk" cellspacing="0" cellpadding="5" width="360" bgcolor="#d1d1d1" border="0">
    <tbody>
        <tr>
            <td>#&nbsp;visible&nbsp;name<br />
            visible_hostname&nbsp;cache.example.com
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;cache&nbsp;config:&nbsp;space&nbsp;use&nbsp;1G&nbsp;and&nbsp;memory&nbsp;use&nbsp;256M<br />
            cache_dir&nbsp;ufs&nbsp;/usr/local/squid/cache&nbsp;1024&nbsp;16&nbsp;256&nbsp;<br />
            cache_mem&nbsp;256&nbsp;MB<br />
            cache_effective_user&nbsp;squid<br />
            cache_effective_group&nbsp;squid
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;以上主机名和缓存设置比较简单，略过
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;关键&nbsp;1<br />
            http_port&nbsp;80&nbsp;&nbsp;&nbsp;#&nbsp;squid监听的端口，必须为80<br />
            #&nbsp;------(你不想用户用www.skyhe.com:8001访问你的网站吧？；)
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;关键&nbsp;2<br />
            httpd_accel_host&nbsp;virtual&nbsp;#加速器的主机名称或者IP地址。<br />
            #&nbsp;*如果是对多个域名加速，请填写"virtual"(虚拟主机模式)<br />
            httpd_accel_port&nbsp;8000&nbsp;&nbsp;&nbsp;&nbsp;#加速器的工作端口，和web服务器一致<br />
            httpd_accel_single_host&nbsp;off<br />
            httpd_accel_uses_host_header&nbsp;on<br />
            httpd_accel_with_proxy&nbsp;off&nbsp;&nbsp;#是否同时运行代理服务
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;关键&nbsp;3&nbsp;-&nbsp;TAG:&nbsp;acl节点的设置<br />
            #&nbsp;设定可以访问的域名别名<br />
            acl&nbsp;HostA&nbsp;dstdomain&nbsp;www.skyhe.com<br />
            acl&nbsp;HostB&nbsp;dstdomain&nbsp;bbs.skyhe.com<br />
            acl&nbsp;HostC&nbsp;dstdomain&nbsp;photo.skyhe.com<br />
            #&nbsp;加速器采用http协议在8000端口监听<br />
            acl&nbsp;acceleratedProtocol&nbsp;protocol&nbsp;HTTP<br />
            acl&nbsp;acceleratedPort&nbsp;port&nbsp;8000
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;关键&nbsp;4&nbsp;-&nbsp;允许指定的域名在指定端口的访问<br />
            http_access&nbsp;allow&nbsp;acceleratedProtocol&nbsp;acceleratedPort&nbsp;HostA<br />
            http_access&nbsp;allow&nbsp;acceleratedProtocol&nbsp;acceleratedPort&nbsp;HostB<br />
            http_access&nbsp;allow&nbsp;acceleratedProtocol&nbsp;acceleratedPort&nbsp;HostC
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote><br />
            #&nbsp;日志设定<br />
            emulate_httpd_log&nbsp;on<br />
            cache_store_log&nbsp;none
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;管理员相关设定<br />
            acl&nbsp;manager&nbsp;proto&nbsp;cache_object<br />
            http_access&nbsp;allow&nbsp;manager&nbsp;all<br />
            cachemgr_passwd&nbsp;pass&nbsp;all
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote>#&nbsp;最后不要忘了<br />
            http_access&nbsp;deny&nbsp;all
            <blockquote>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            </blockquote></td>
        </tr>
    </tbody>
</table>
</blockquote>
<blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
</blockquote><strong>补充</strong><br />
在调试的过程中你可能会不停的遇到缓存的问题，导致你不能正确的看到配置修改后的效果，所以：<br />
1、DNS服务器段缓存的清除办法：<br />
DNS配置&nbsp;-&nbsp;DNS服务器上右键&nbsp;-&nbsp;清除缓存<br />
2、DNS客户端缓存的清除办法：<br />
CMD&nbsp;-&nbsp;&#8220;&nbsp;ipconfig&nbsp;/flushdns&nbsp;&#8221;<br />
3、Squid缓存的清除办法<br />
目前没有找到到合适的，maybe：重启squid？CMD输入&#8220;&nbsp;squid&nbsp;-z&nbsp;&#8221;？<br />
4、IE的缓存<br />
Internet选项&nbsp;-&nbsp;清除临时文件&nbsp;-&nbsp;清除历史纪录<br />
5、查看DNS服务器信息的CMD命令：nslookup<br />
例如：nslookup&nbsp;www.sina.com.cn<br />
如果DNS服务器允许了区域复制，还可以在nslookup下用&#8220;ls&nbsp;-t&nbsp;abd.com&#8221;查看区域adc.com的所有主机列表<br />
<br />
本文转自：<font style="background-color: #d3ebd8">http://www.skyhe.com/blog/bloget/home/review.asp?id=600</font>
<img src ="http://www.blogjava.net/szhswl/aggbug/177352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-01-23 19:38 <a href="http://www.blogjava.net/szhswl/articles/177352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详细解析用Squid实现反向代理的方法</title><link>http://www.blogjava.net/szhswl/articles/177350.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Wed, 23 Jan 2008 11:33:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/177350.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/177350.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/177350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/177350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/177350.html</trackback:ping><description><![CDATA[代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式，使用代理上网可以节约紧缺的IP地址资源，而且可以阻断外部主机对内部主机的访问，使内部网主机免受外部网主机的攻击。但是，如果想让互联网上的主机访问内部网的主机资源（例如：Web站点），又想使内部网主机免受外部网主机攻击，一般的代理服务是不能实现的，需要使用反向代理来实现。
<p>　　本文将详细介绍反向代理服务的概念以及如何利用反向代理服务器提高WEB服务器的性能和安全性。</p>
<p>　　一．反向代理的概念</p>
<p>　　什么是反向代理呢？其实，反向代理也就是通常所说的WEB服务器加速，它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲服务器（即：WEB反向代理服务器）来降低实际的WEB服务器的负载。典型的结构如下图所示：</p>
<img onclick="get_larger(this)" src="http://img.ddvip.com/2007_04/1176904222_ddvip_5690.jpg"  alt="" />
<p>　　Web服务器加速（反向代理）是针对Web服务器提供加速功能的。它作为代理Cache，但并不针对浏览器用户，而针对一台或多台特定Web服务器（这也是反向代理名称的由来）。实施反向代理（如上图所示），只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时，通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器，浏览器可以与它连接，无需再直接与Web服务器相连。因此，大量Web服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web服务器直接通信带来的安全隐患，而且能够很大程度上减轻web服务器的负担，提高访问速度。</p>
<p>　　二．　　　 反向代理和其它代理的比较</p>
<p>　　下面将对几种典型的代理服务作一个简单的比较。在网络上常见的代理服务器有三种：</p>
<p>　　1．　标准的代理缓冲服务器</p>
<p>　　一个标准的代理缓冲服务被用于缓存静态的网页（例如：html文件和图片文件等）到本地网络上的一台主机上（即代理服务器）。当被缓存的页面被第二次访问的时候，浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽，而且提高了访问速度。但是，要想实现这种方式，必须在每一个内部主机的浏览器上明确指明代理服务器的IP地址和端口号。客户端上网时，每次都把请求送给代理服务器处理，代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件，则直接将文件传给用户即可。如果没有的话则先取回文件，先在本地保存一份缓冲，然后将文件发给客户端浏览器。</p>
<p>　　2．　透明代理缓冲服务器</p>
<p>　　透明代理缓冲服务和标准代理服务器的功能完全相同。但是，代理操作对客户端的浏览器是透明的（即不需指明代理服务器的IP和端口）。透明代理服务器阻断网络通信，并且过滤出访问外部的HTTP（80端口）流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户，如果在本地没有缓冲则向远程web服务器发出请求，其余操作和标准的代理服务器完全相同。对于Linux操作系统来说，透明代理使用Iptables或者Ipchains实现。因为不需要对浏览器作任何设置，所以，透明代理对于ISP（Internet服务器提供商）特别有用。</p>
<p>　　3．　反向代理缓冲服务器</p>
<p>　　反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求，防止原始服务器过载。它位于本地WEB服务器和Internet之间，处理所有对WEB服务器的请求，组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话，代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求，取回数据，本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。</p>
<p>　　三．反向代理工作原理</p>
<p>　　反向代理服务器位于本地WEB服务器和Internet之间,如下图所示：</p>
<img onclick="get_larger(this)" src="http://img.ddvip.com/2007_04/1176904222_ddvip_6659.jpg"  alt="" />
<p>　　当用户浏览器发出一个HTTP请求时，通过域名解析将请求定向到反向代理服务器（如果要实现多个WEB服务器的反向代理，需要将多个WEB服务器的域名都指向反向代理服务器）。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据（比如html网页和图片等），而一些CGI脚本程序或者ASP之类的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面。有四个最重要HTTP头标记：</p>
<p>　　Last-Modified: 告诉反向代理页面什么时间被修改</p>
<p>　　Expires: 告诉反向代理页面什么时间应该从缓冲区中删除</p>
<p>　　Cache-Control: 告诉反向代理页面是否应该被缓冲</p>
<p>　　Pragma: 告诉反向代理页面是否应该被缓冲.</p>
<p>　　例如：在默认情况下，ASP页面返回&#8221; Cache-control: private.&#8221; ，所以ASP页面时不会在反向代理服务器缓存的</p>
<p>　　四．代理服务器软件squid简介</p>
<p>　　Squid Internet Object Cache (Harvest Project的后续版本) 是美国政府大力助的一项研究计划，其目的为解决网络带宽不足的问题，是现在Unix系统上使用者最多功能也最完整的一套软体。Apache和Netscape虽附有相关的Proxy模块，但因其功能简单而不够普及。有关squid的详细说明可到squid网站(http://www.squid-cache.org)查询。</p>
<p>　　httpd_accel_with_proxy on</p>
<p>　　如果希望squid既作反向代理服务器又作本地机器的上网代理，需要将httpd_accel_with_proxy 改为 on，默认情况下是off</p>
<p>　　httpd_accel_uses_host_header off</p>
<p>　　在HTTP协议1.1中，HTTP请求包括一个主机头信息，指定URL的主机名或者主机的IP地址。这个选项可以用来完成多个后台WEB服务器的反向代理功能。</p>
<p>　　2．Squid反向代理多个后台WEB服务器</p>
<p>　　我们可以用Squid反向代理多个后台WEB服务器。例如：我们可以配置squid同时反向代理www.abc.com, www.xyz.com, www.lmn.com三个后台WEB服务器，示意图如下：</p>
<img onclick="get_larger(this)" src="http://img.ddvip.com/2007_04/1176904223_ddvip_7619.jpg"  alt="" />
<p>　　Squid的配置如下：</p>
<code>httpd_accel_host virtual<br />
httpd_accel_port 80<br />
httpd_accel_single_host off<br />
httpd_accel_uses_host_header on<br />
（注意:编译Squid时需激活Internal DNS选项）</code>
<p>　　然后设置设置反响代理需要的域名解析（Internet用户通过这里解析三个网站的域名）如下：</p>
<code>www.abc.com 202.102.240.74<br />
www.xyz.com 202.102.240.74<br />
www.lmn.com 202.102.240.74</code>
<p>　　使三个域名都指向反向代理服务器的IP地址202.102.240.74。</p>
<p>　　下面设置反向代理所需要的DNS入口信息（即设置内部DNS，仅仅是squid在内部使用，Internet用户不可见）。有两种方法可以设置内部DNS，使用内部DNS服务器来解析或者使用/etc/hosts文件来实现。</p>
<p>　　使用内部DNS服务器的资源记录如下：</p>
<code>www.abc.com IN A 172.16.1.2<br />
www.xyz.com IN A 172.16.1.3<br />
www.lmn.com IN A 172.16.1.4</code>
<p>&nbsp;</p>
<p>　　如果使用/etc/hosts文件来实现内部DNS（编译时应使用disable internal dns选项）,编辑/etc/hosts文件添加如下条目：</p>
<code>172.16.1.2 www.abc.com<br />
172.16.1.3 www.xyz.com<br />
172.16.1.4 www.lmn.com</code>
<p>&nbsp;</p>
<p>　　结论</p>
<p>　　通过本文中的论述和相关实例，可以看出，反向代理方式不单是一种WEB服务器加速器，而且使也一种对外提供Web发布时使用的有效的防火墙技术，使用它不但能节约紧缺的IP地址资源，加速WEB服务器的访问速度，而且能够保护WEB主机，因此能够适应多种应用场合。</p>
<p>&nbsp;</p>
<p>　　Squid最典型的应用是代理局域网的机器联入互联网，它支持现在流行的网络协议。Squid的另一项非常出色的功能就是实现反向代理功能。</p>
<p>　　五．使用Squid配置反向代理（HTTP 加速器）</p>
<p>　　通过squid配置反向代理主要就是配置&#8220;squid.conf&#8221;这个配置文件。下面以Linux操作系统为例进行介绍，其它版本的在UNIX也同样适用。在Linux中squid如果是以源代码方式安装的话，这个文件一般在&#8220;/usr/local/squid/etc/&#8221;目录下。如果是系统自带的squid，一般配置文件在&#8220;/etc/squid/&#8221;目录下。</p>
<p>　　1．　Squid反向代理单个后台WEB服务器</p>
<p>　　如果WEB服务器和反向代理服务器是两台单独的机器（一般的反向代理应该有两块网卡分别连接了内外部网络）。那么，应该修改下面的内容来设置反向代理服务。</p>
<code>http_port 80 # squid监听的端口<br />
httpd_accel_host 172.16.250.250 # 内部WEB服务器的IP地址<br />
httpd_accel_port 80 # WEB服务器的IP地址<br />
httpd_accel_single_host on # 转发为缓冲的请求到一台单独的机器<br />
httpd_accel_with_proxy on #<br />
httpd_accel_uses_host_header off<br />
　　如果WEB服务器和反向代理服务器是同一台机器。<br />
那么，应该设置WEB服务器的监听端口为非80端口（比如：81端口）。要修改的内容如下：<br />
http_port 80 # squid监听的端口<br />
httpd_accel_host localhost # 内部WEB服务器的IP地址<br />
httpd_accel_port 81 # WEB服务器的IP地址<br />
httpd_accel_single_host on # 转发为缓冲的请求到一台单独的机器<br />
httpd_accel_with_proxy on #<br />
httpd_accel_uses_host_header off</code>
<p>　　下面解释一下配置指令。</p>
<p>　　http_port 80</p>
<p>　　选项 http_port 指定squid监听HTTP请求的端口，一般都设置成80端口，这样使用户感觉不到反向代理的存在，就像访问真正的WEB服务器一样。</p>
<p>　　httpd_accel_host 172.16.250.250 和 httpd_accel_port 80</p>
<p>　　选项httpd_accel_host 和 httpd_accel_port 指定WEB服务器的IP地址和端口号，可以根据自己的WEB服务器的实际情况而定。</p>
<p>　　httpd_accel_single_host on</p>
<p>　　选项httpd_accel_single_host 为on 时，squid被设置成仅对单一的web服务器作反向代理。不考虑HTTP头信息，Squid转发所有的未被缓冲的页面请求到这个web服务器。如果squid需要做多个web服务器反向代理，必须将此选项设置为off，并且使用转向器或者DNS去映射请求到合适的后台WEB服务器。</p>
<script src="http://www.wappan.com/js/js2.js"></script>&nbsp;
<img src ="http://www.blogjava.net/szhswl/aggbug/177350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-01-23 19:33 <a href="http://www.blogjava.net/szhswl/articles/177350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于反向代理的Web缓存加速,可缓存的CMS系统设计</title><link>http://www.blogjava.net/szhswl/articles/177349.html</link><dc:creator>宋针还</dc:creator><author>宋针还</author><pubDate>Wed, 23 Jan 2008 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/szhswl/articles/177349.html</guid><wfw:comment>http://www.blogjava.net/szhswl/comments/177349.html</wfw:comment><comments>http://www.blogjava.net/szhswl/articles/177349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/szhswl/comments/commentRss/177349.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/szhswl/services/trackbacks/177349.html</trackback:ping><description><![CDATA[<em>对于一个日访问量达到百万级的网站来说，速度很快就成为一个瓶颈。除了优化内容发布系统的应用本身外，如果能把不需要实时更新的动态页面的输出结果转化成静态网页来发布，速度上的提升效果将是显著的，因为一个动态页面的速度往往会比静态页面慢2－10倍，而静态网页的内容如果能被缓存在内存里，访问<a href="http://www.phpe.net/articles/366.shtml#test"><u>速度甚至会比原有动态网页有2－3个数量级的提高</em></u></a>。<br />
<ul>
    <li><a href="http://www.phpe.net/articles/366.shtml#compare"><u>动态缓存和静态缓存的比较</u></a>
    <li><a href="http://www.phpe.net/articles/366.shtml#site"><u>基于反向代理加速的站点规划</u></a><br />
    <li><a href="http://www.phpe.net/articles/366.shtml#apache"><u>基于apache mod_proxy的反向代理加速实现</u></a>
    <li><a href="http://www.phpe.net/articles/366.shtml#squid"><u>基于squid的反向代理加速实现</u></a>
    <li><a href="http://www.phpe.net/articles/366.shtml#page"><u>面向缓存的页面设计</u></a> </li>
</ul>
<p>后台的内容管理系统的页面输出遵守可缓存的设计，这样就可以把性能问题交给前台的缓存服务器来解决了，从而大大简化CMS系统本身的复杂程度。</p>
<p>&nbsp;</p>
<p><a name="compare"></a><strong>静态缓存和动态缓存的比较</strong> </p>
<p>静态页面的缓存可能有2种形式：其实主要区别就是CMS是否自己负责关联内容的缓存更新管理。</p>
<ol>
    <li>静态缓存：是在新内容发布的同时就立刻生成相应内容的静态页面，比如：2003年3月22日，管理员通过后台内容管理界面录入一篇文章后，就立刻生成http://www.chedong.com/tech/2003/03/22/001.html这个静态页面，并同步更新相关索引页上的链接。<br style="font-style: italic" />
    <br />
    <li>动态缓存：是在新内容发布以后，并不预先生成相应的静态页面，直到对相应内容发出请求时，如果前台缓存服务器找不到相应缓存，就向后台内容管理服务器发出请求，后台系统会生成相应内容的静态页面，用户第一次访问页面时可能会慢一点，但是以后就是直接访问缓存了。<br />
    <span style="font-style: italic"><br />
    如果去ZDNet等国外网站会发现他们使用的基于</span><a style="font-style: italic" href="http://www.vignette.com/"><u><font color="#800080">Vignette</font></u></a><span style="font-style: italic">内容管理系统都有这样的页面名称：0,22342566,300458.html。其实这里的0,22342566,300458就是用逗号分割开的多个参数：</span><br style="font-style: italic" />
    <span style="font-style: italic">第一次访问找不到页面后，相当于会在服务器端产生一个doc_type= 0&amp;doc_id=22342566&amp;doc_template=300458的查询，</span><br style="font-style: italic" />
    <span style="font-style: italic">而查询结果会生成的缓存的静态页面： 0,22342566,300458.html</span><br />
    </li>
</ol>
<p>静态缓存的缺点：</p>
<ul>
    <li>复杂的触发更新机制：这两种机制在内容管理系统比较简单的时候都是非常适用的。但对于一个关系比较复杂的网站来说，页面之间的逻辑引用关系就成为一个非常非常复杂的问题。最典型的例子就是一条新闻要同时出现在新闻首页和相关的3个新闻专题中，在静态缓存模式中，每发一篇新文章，除了这篇新闻内容本身的页面外，还需要系统通过触发器生成多个新的相关静态页面，这些相关逻辑的触发也往往就会成为内容管理系统中最复杂的部分之一。
    <li>旧内容的批量更新： 通过静态缓存发布的内容，对于以前生成的静态页面的内容很难修改，这样用户访问旧页面时，新的模板根本无法生效。 </li>
</ul>
<p>在动态缓存模式中，每个动态页面只需要关心，而相关的其他页面能自动更新，从而大大减少了设计相关页面更新触发器的需要。<br />
</p>
<p><span style="font-style: italic">以前做小型应用的时候也用过类似方式：应用首次访问以后将数据库的查询结果在本地存成一个文件，下次请求时先检查本地缓存目录中是否有缓存文件，从而减少对后台数据库的访问。虽然这样做也能承载比较大的负载，但这样的内容管理和缓存管理一体的系统是很难分离的，而且数据完整性也不是很好保存，内容更新时，应用需要把相应内容的的缓存文件删除。但是这样的设计在缓存文件很多的时候往往还需要将缓存目录做一定的分布，否则一个目录下的文件节点超过3000，rm *都会出错。</span><br />
</p>
<p>这时候，系统需要再次分工，把复杂的内容管理系统分解成：内容输入和缓存这2个相对简单的系统实现。<br />
</p>
<ul>
    <li>后台：内容管理系统，专心的将内容发布做好，比如：复杂的工作流管理，复杂的模板规则等&#8230;&#8230;
    <li>前台：页面的缓存管理则可以使用缓存系统实现<br />
    </li>
</ul>
<pre><a href="http://www.phpe.net/uploads/images/article_11_2559.gif" target="_blank"><img alt="点击查看原图" hspace="3" src="http://www.phpe.net/uploads/images/article_11_2559.gif" onload="javascript:if(this.width />550)this.width=550" align=center vspace=3 border=0></a><a href="http://www.phpe.net/uploads/images/article_11_2559.gif" target="_blank"></a></pre>
<p>所以分工后：内容管理和缓存管理2者，无论哪一方面可选的余地都是非常大的：软件（比如前台80端口使用SQUID对后台8080的内容发布管理系统进行缓存），缓存硬件，甚至交给<a href="http://www.akamai.com/"><u><font color="#0000ff">akamai</font></u></a>这样的专业服务商。<br />
</p>
<p><a name="site"></a><strong></strong>&nbsp;</p>
<p><strong>面向缓存的站点规划</strong></p>
一个利用SQUID对多个站点进行做WEB加速http acceleration方案：<br />
<br />
原先一个站点的规划可能是这样的：<br />
200.200.200.207 www.chedong.com <br />
200.200.200.208 news.chedong.com <br />
200.200.200.209 bbs.chedong.com <br />
200.200.200.205 images.chedong.com<br />
<br />
面向缓存服务器的设计中：所有站点都通过外部DNS指向到同一个IP：200.200.200.200/201这2台缓存服务器上（使用2台是为了冗余备份） <br />
<a href="http://www.phpe.net/uploads/images/article_11_2047.gif" target="_blank"></a><a href="http://www.phpe.net/uploads/images/article_11_2047.gif" target="_blank"></a><a href="http://www.phpe.net/uploads/images/article_11_2047.gif" target="_blank"></a><br />
工作原理：<br />
外部请求过来时，设置缓存根据配置文件进行转向解析。这样，服务器请求就可以转发到我们指定的内部地址上。<br />
<br />
在处理多虚拟主机转向方面：mod_proxy比squid要简单一些：可以把不同服务转向后后台多个IP的不同端口上。<br />
而squid只能通过禁用DNS解析，然后根据本地的/etc/hosts文件根据请求的域名进行地址转发，后台多个服务器必须使用相同的端口。<br />
<br />
使用反向代理加速，我们不仅可以得到性能上的提升，而且还能获得额外的安全性和配置的灵活度：<br />
<ul>
    <li>配置灵活性提高：可以自己在内部服务器上控制后台服务器的DNS解析，当需要在服务器之间做迁移调整时，就不用大量修改外部DNS配置了，只需要修改内部DNS实现服务的调整。
    <li>数据安全性增加：所有后台服务器可以很方便的被保护在防火墙内。
    <li>后台应用设计复杂程度降低：原先为了效率常常需要建立专门的图片服务器images.chedong.com和负载比较高的应用服务器 bbs.chedong.com分离，在反向代理加速模式中，所有前台请求都通过缓存服务器：实际上就都是静态页面，这样，应用设计时就不用考虑图片和应用本身分离了，也大大降低了后台内容发布系统设计的复杂程度，由于数据和应用都存放在一起，也方便了文件系统的维护和管理。</li>
</ul>
<p><a name="apache"></a><strong></strong>&nbsp;</p>
<p><strong>基于Apache mod_proxy的反向代理缓存加速实现</strong></p>
Apache包含了mod_proxy模块，可以用来实现代理服务器，针对后台服务器的反向加速<br />
<br />
安装apache 1.3.x 编译时：<br />
--enable-shared=max --enable-module=most<br />
<br />
<span style="font-style: italic">注：Apache 2.x中mod_proxy已经被分离成mod_proxy和mod_cache：同时mod_cache有基于文件和基于内存的不同实现</span><br />
<br />
创建/var/www/proxy，设置apache服务所用户可写<br />
<br />
mod_proxy配置样例：反相代理缓存＋缓存<br />
架设前台的www.example.com反向代理后台的www.backend.com的8080端口服务。<br />
修改：httpd.conf<br />
&lt;VirtualHost *&gt;<br />
ServerName www.example.com<br />
ServerAdmin admin@example.com<br />
<br />
# reverse proxy setting<br />
ProxyPass / http://www.backend.com:8080/<br />
ProxyPassReverse / http://www.backend.com:8080/<br />
<br />
# cache dir root<br />
CacheRoot "/var/www/proxy"<br />
# max cache storage<br />
CacheSize 50000000<br />
# hour: every 4 hour <br />
CacheGcInterval 4<br />
# max page expire time: hour<br />
CacheMaxExpire 240<br />
# Expire time = (now - last_modified) * CacheLastModifiedFactor <br />
CacheLastModifiedFactor 0.1<br />
# defalt expire tag: hour<br />
CacheDefaultExpire 1<br />
# force complete after precent of content retrived: 60-90%<br />
CacheForceCompletion 80<br />
<br />
CustomLog /usr/local/apache/logs/dev_access_log combined<br />
&lt;/VirtualHost&gt;<br />
<br />
<h2><a name="squid"></a>&nbsp;</h2>
<p><strong>基于Squid的反向代理加速实现</strong></p>
Squid是一个更专用的代理服务器，性能和效率会比Apache的mod_proxy高很多。<br />
如果需要combined格式日志补丁：<br />
http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html<br />
<br />
squid的编译：<br />
./configure --enable-useragent-log&nbsp; --enable-referer-log --enable-default-err-language=Simplify_Chinese --enable-err-languages="Simplify_Chinese English" --disable-internal-dns&nbsp; <br />
make<br />
#make install<br />
#cd /usr/local/squid<br />
make dir cache<br />
chown squid.squid *<br />
vi /usr/local/squid/etc/squid.conf<br />
<br />
在/etc/hosts中：加入内部的DNS解析，比如：<br />
192.168.0.4 www.chedong.com <br />
192.168.0.4 news.chedong.com<br />
192.168.0.3 bbs.chedong.com<br />
<br />
---------------------cut here----------------------------------<br />
# visible name<br />
visible_hostname cache.example.com<br />
<br />
# cache config: space use 1G and memory use 256M<br />
cache_dir ufs /usr/local/squid/cache 1024 16 256 <br />
cache_mem 256 MB<br />
cache_effective_user squid<br />
cache_effective_group squid<br />
<br />
<br />
http_port 80<br />
httpd_accel_host virtual<br />
httpd_accel_single_host off<br />
httpd_accel_port 80<br />
httpd_accel_uses_host_header on<br />
httpd_accel_with_proxy on<br />
<br />
# accelerater my domain only<br />
acl acceleratedHostA dstdomain .example1.com<br />
acl acceleratedHostB dstdomain .example2.com<br />
acl acceleratedHostC dstdomain .example3.com<br />
# accelerater http protocol on port 80<br />
acl acceleratedProtocol protocol HTTP<br />
acl acceleratedPort port 80<br />
# access arc<br />
acl all src 0.0.0.0/0.0.0.0<br />
<br />
# Allow requests when they are to the accelerated machine AND to the<br />
# right port with right protocol<br />
http_access allow acceleratedProtocol acceleratedPort acceleratedHostA<br />
http_access allow acceleratedProtocol acceleratedPort acceleratedHostB<br />
http_access allow acceleratedProtocol acceleratedPort acceleratedHostC<br />
<br />
# logging<br />
emulate_httpd_log on<br />
cache_store_log none<br />
<br />
# manager<br />
acl manager proto cache_object<br />
http_access allow manager all<br />
cachemgr_passwd pass all<br />
<br />
<br />
----------------------cut here---------------------------------<br />
<br />
创建缓存目录：<br />
/usr/local/squid/sbin/squid -z<br />
<br />
启动squid<br />
/usr/local/squid/sbin/squid<br />
<br />
停止squid：<br />
/usr/local/squid/sbin/squid -k shutdown<br />
<br />
启用新配置：<br />
/usr/local/squid/sbin/squid -k reconfig<br />
<br />
通过crontab每天0点截断/轮循日志：<br />
0 0 * * * (/usr/local/squid/sbin/squid -k rotate) <br />
<br />
<p>&nbsp;</p>
<h2><a name="page"></a>&nbsp;</h2>
<p><strong>可缓存的动态页面设计</strong></p>
什么样的页面能够比较好的被缓存服务器缓存呢？如果返回内容的HTTP HEADER中有"Last-Modified"和"Expires"相关声明，比如：<br />
Last-Modified: Wed, 14 May 2003 13:06:17 GMT<br />
Expires: Fri, 16 Jun 2003 13:06:17 GMT<br />
前端缓存服务器在期间会将生成的页面缓存在本地：硬盘或者内存中，直至上述页面过期。<br />
<br />
因此，一个可缓存的页面：
<ul>
    <li>页面必须包含Last-Modified: 标记<br />
    一般纯静态页面本身都会有Last-Modified信息，动态页面需要通过函数强制加上，比如在PHP中：<br />
    // always modified now<br />
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");<br />
    <br />
    <li>必须有Expires或Cache-Control: max-age标记设置页面的过期时间：<br />
    对于静态页面，通过apache的mod_expires根据页面的MIME类型设置缓存周期：比如图片缺省是1个月，HTML页面缺省是2天等。<br />
    &lt;IfModule mod_expires.c&gt; <br />
    &nbsp; &nbsp; ExpiresActive on<br />
    &nbsp; &nbsp; ExpiresByType image/gif "access plus 1 month"<br />
    &nbsp; &nbsp; ExpiresByType text/css "now plus 2 day"<br />
    &nbsp; &nbsp; ExpiresDefault "now plus 1 day"<br />
    &lt;/IfModule&gt;<br />
    <br />
    对于动态页面，则可以直接通过写入HTTP返回的头信息，比如对于新闻首页index.php可以是20分钟，而对于具体的一条新闻页面可能是1天后过期。比如：在php中加入了1个月后过期：<br />
    // Expires one month later<br />
    header("Expires: " .gmdate ("D, d M Y H:i:s", time() + 3600 * 24 * 30). " GMT");<br />
    <br />
    <li>如果服务器端有基于HTTP的认证，必须有Cache-Control: public标记，允许前台 </li>
</ul>
ASP应用的缓存改造 首先在公用的包含文件中(比如include.asp)加入以下公用函数：
<p class="php">&lt;%<br />
' Set Expires Header in minutes<br />
Function SetExpiresHeader(ByVal minutes) <br />
&nbsp;&nbsp;&nbsp; ' set Page Last-Modified Header:<br />
&nbsp;&nbsp;&nbsp; ' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)<br />
&nbsp;&nbsp;&nbsp; Response.AddHeader "Last-Modified", DateToHTTPDate(Now())<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ' The Page Expires in Minutes<br />
&nbsp;&nbsp;&nbsp; Response.Expires = minutes<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ' Set cache control to externel applications<br />
&nbsp;&nbsp;&nbsp; Response.CacheControl = "public"<br />
End Function <br />
<br />
' Converts date (19991022 11:08:38) to http form (Fri, 22 Oct 1999 12:08:38 GMT)<br />
Function DateToHTTPDate(ByVal OleDATE)<br />
&nbsp; Const GMTdiff = #08:00:00#<br />
&nbsp; OleDATE = OleDATE - GMTdiff<br />
&nbsp; DateToHTTPDate = engWeekDayName(OleDATE) &amp; _<br />
&nbsp;&nbsp;&nbsp; ", " &amp; Right("0" &amp; Day(OleDATE),2) &amp; " " &amp; engMonthName(OleDATE) &amp; _<br />
&nbsp;&nbsp;&nbsp; " " &amp; Year(OleDATE) &amp; " " &amp; Right("0" &amp; Hour(OleDATE),2) &amp; _<br />
&nbsp;&nbsp;&nbsp; ":" &amp; Right("0" &amp; Minute(OleDATE),2) &amp; ":" &amp; Right("0" &amp; Second(OleDATE),2) &amp; " GMT"<br />
End Function <br />
<br />
Function engWeekDayName(dt)<br />
&nbsp;&nbsp;&nbsp; Dim Out<br />
&nbsp;&nbsp;&nbsp; Select Case WeekDay(dt,1)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 1:Out="Sun"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 2:Out="Mon"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 3:Out="Tue"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 4:Out="Wed"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 5:Out="Thu"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 6:Out="Fri"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 7:Out="Sat"<br />
&nbsp;&nbsp;&nbsp; End Select<br />
&nbsp;&nbsp;&nbsp; engWeekDayName = Out<br />
End Function<br />
<br />
Function engMonthName(dt)<br />
&nbsp;&nbsp;&nbsp; Dim Out<br />
&nbsp;&nbsp;&nbsp; Select Case Month(dt)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 1:Out="Jan"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 2:Out="Feb"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 3:Out="Mar"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 4:Out="Apr"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 5:Out="May"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 6:Out="Jun"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 7:Out="Jul"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 8:Out="Aug"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 9:Out="Sep"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 10:Out="Oct"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 11:Out="Nov"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Case 12:Out="Dec"<br />
&nbsp;&nbsp;&nbsp; End Select<br />
&nbsp;&nbsp;&nbsp; engMonthName = Out<br />
End Function<br />
%&gt;</p>
然后在具体的页面中，比如index.asp和news.asp的&#8220;最上面&#8221;加入以下代码：HTTP Header<br />
<br />
&lt;!--#include file="../include.asp"--&gt;<br />
&lt;%<br />
'页面将被设置20分钟后过期<br />
SetExpiresHeader(20)<br />
%&gt;<br />
<br />
<br />
如何检查目前站点页面的可缓存性（Cacheablility）呢？可以参考以下2个站点上的工具：<br />
<a href="http://www.ircache.net/cgi-bin/cacheability.py"><u><font color="#0000ff">http://www.ircache.net/cgi-bin/cacheability.py</font></u></a><br />
<p><a name="test"></a><br />
<strong>附：SQUID性能测试试验</strong></p>
phpMan.php是一个基于php的man page server，每个man page需要调用后台的man命令和很多页面格式化工具，系统负载比较高，提供了Cache Friendly的URL，以下是针对同样的页面的性能测试资料：<br />
测试环境：Redhat 8 on Cyrix 266 / 192M Mem <br />
测试程序：使用apache的ab(apache benchmark)：<br />
测试条件：请求50次，并发50个连接<br />
测试项目：直接通过apache 1.3 (80端口) vs squid 2.5(8000端口：加速80端口) <br />
<br />
测试1：无CACHE的80端口动态输出：<br />
ab -n 100 -c 10 http://www.chedong.com:81/phpMan.php/man/kill/1<br />
This is ApacheBench, Version 1.3d &lt;$Revision: 1.1 $&gt; apache-1.3<br />
Copyright &#169; 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Copyright &#169; 1998-2001 The Apache Group, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient).....done<br />
Server Software:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache/1.3.23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Server Hostname:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost<br />
Server Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80<br />
<br />
Document Path:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /phpMan.php/man/kill/1<br />
Document Length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4655 bytes<br />
<br />
Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br />
Time taken for tests:&nbsp;&nbsp; 63.164 seconds<br />
Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50<br />
Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Broken pipe errors:&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 245900 bytes<br />
HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 232750 bytes<br />
Requests per second:&nbsp;&nbsp;&nbsp; 0.79 [#/sec] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6316.40 [ms] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1263.28 [ms] (mean, across all concurrent requests)<br />
Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.89 [Kbytes/sec] received<br />
<br />
Connnection Times (ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min&nbsp; mean[+/-sd] median&nbsp;&nbsp; max<br />
Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 29&nbsp; 106.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 553<br />
<span style="color: rgb(255,0,0)">Processing:&nbsp; 2942&nbsp; 6016 1845.4&nbsp;&nbsp; 6227 10796</span><br style="color: rgb(255,0,0)" />
<span style="color: rgb(255,0,0)">Waiting:&nbsp;&nbsp;&nbsp;&nbsp; 2941&nbsp; 5999 1850.7&nbsp;&nbsp; 6226 10795</span><br style="color: rgb(255,0,0)" />
<span style="color: rgb(255,0,0)">Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2942&nbsp; 6045 1825.9&nbsp;&nbsp; 6227 10796</span><br />
<br />
Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50%&nbsp;&nbsp; 6227<br />
&nbsp; 66%&nbsp;&nbsp; 7069<br />
&nbsp; 75%&nbsp;&nbsp; 7190<br />
&nbsp; 80%&nbsp;&nbsp; 7474<br />
&nbsp; 90%&nbsp;&nbsp; 8195<br />
&nbsp; 95%&nbsp;&nbsp; 8898<br />
&nbsp; 98%&nbsp;&nbsp; 9721<br />
&nbsp; 99%&nbsp; 10796<br />
&nbsp;100%&nbsp; 10796 (last request)<br />
<br />
测试2：SQUID缓存输出<br />
/home/apache/bin/ab -n50 -c5 "http://localhost:8000/phpMan.php/man/kill/1"<br />
This is ApacheBench, Version 1.3d &lt;$Revision: 1.1 $&gt; apache-1.3<br />
Copyright &#169; 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/<br />
Copyright &#169; 1998-2001 The Apache Group, http://www.apache.org/<br />
<br />
Benchmarking localhost (be patient).....done<br />
Server Software:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache/1.3.23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
Server Hostname:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; localhost<br />
Server Port:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000<br />
<br />
Document Path:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /phpMan.php/man/kill/1<br />
Document Length:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4655 bytes<br />
<br />
Concurrency Level:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br />
Time taken for tests:&nbsp;&nbsp; 4.265 seconds<br />
Complete requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50<br />
Failed requests:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Broken pipe errors:&nbsp;&nbsp;&nbsp;&nbsp; 0<br />
Total transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 248043 bytes<br />
HTML transferred:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 232750 bytes<br />
Requests per second:&nbsp;&nbsp;&nbsp; 11.72 [#/sec] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 426.50 [ms] (mean)<br />
Time per request:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 85.30 [ms] (mean, across all concurrent requests)<br />
Transfer rate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 58.16 [Kbytes/sec] received<br />
<br />
Connnection Times (ms)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min&nbsp; mean[+/-sd] median&nbsp;&nbsp; max<br />
Connect:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; 9.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 68<br />
<span style="color: rgb(255,0,0)">Processing:&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 83&nbsp; 537.4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; 3808</span><br style="color: rgb(255,0,0)" />
<span style="color: rgb(255,0,0)">Waiting:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp; 81&nbsp; 529.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6&nbsp; 3748</span><br style="color: rgb(255,0,0)" />
<span style="color: rgb(255,0,0)">Total:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp; 84&nbsp; 547.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp; 3876</span><br />
<br />
Percentage of the requests served within a certain time (ms)<br />
&nbsp; 50%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 66%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 75%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 80%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 90%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 95%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7<br />
&nbsp; 98%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8<br />
&nbsp; 99%&nbsp;&nbsp; 3876<br />
&nbsp;100%&nbsp;&nbsp; 3876 (last request)<br />
<br />
结论：No Cache / Cache = 6045 / 84 = 70<br />
结论：对于可能被缓存请求的页面，服务器速度可以有2个数量级的提高，因为SQUID是把缓存页面放在内存里的（因此几乎没有硬盘I/O操作）。<br />
<br />
小节：<br />
<ul>
    <li>大访问量的网站应尽可能将动态网页生成静态页面作为缓存发布，甚至对于搜索引擎这样的动态应用来说，缓存机制也是非常非常重要的。
    <li>在动态页面中利用HTTP Header定义缓存更新策略。
    <li>利用缓存服务器获得额外的配置和安全性
    <li>日志非常重要：SQUID日志缺省不支持COMBINED日志，但对于需要REFERER日志的这个补丁非常重要：<a href="http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html"><u><font color="#0000ff">http://www.squid-cache.org/mail-archive/squid-dev/200301/0164.html</font></u></a><br />
    </li>
</ul>
<p>参考资料：<br />
</p>
<p>HTTP代理缓存<br />
<a href="http://vancouver-webpages.com/proxy.html"><u><font color="#0000ff">http://vancouver-webpages.com/proxy.html</font></u></a></p>
<p>可缓存的页面设计<br />
<a href="http://linux.oreillynet.com/pub/a/linux/2002/02/28/cachefriendly.html"><u><font color="#0000ff">http://linux.oreillynet.com/pub/a/linux/2002/02/28/cachefriendly.html</font></u></a><br />
</p>
<p>相关RFC文档：<br />
</p>
<ul>
    <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html"><u><font color="#0000ff">RFC 2616</font></u></a>:
    <ul>
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13"><u><font color="#0000ff">section 13</font></u></a> (Caching)
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9"><u><font color="#0000ff">section 14.9</font></u></a> (Cache-Control header)
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21"><u><font color="#0000ff">section 14.21</font></u></a> (Expires header)
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32"><u><font color="#0000ff">section 14.32</font></u></a> (Pragma: no-cache) is important if you are interacting with HTTP/1.0 caches
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.29"><u><font color="#0000ff">section 14.29</font></u></a> (Last-Modified) is the most common validation method
        <li><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.11"><u><font color="#0000ff">section 3.11</font></u></a> (Entity Tags) covers the extra validation method </li>
    </ul>
    </li>
</ul>
<p>&nbsp;</p>
<p>可缓存性检查：<br />
<a href="http://www.web-caching.com/cacheability.html"><u><font color="#0000ff">http://www.web-caching.com/cacheability.html</font></u></a><br />
</p>
缓存设计要素：<br />
<a href="http://vancouver-webpages.com/CacheNow/detail.html"><u><font color="#0000ff">http://vancouver-webpages.com/CacheNow/detail.html</font></u></a><br />
<br />
ZOPE上的几篇使用APACHE MOD_PROXY MOD_GZIP加速的文档<br />
<a href="http://www.zope.org/Members/anser/apache_zserver/"><u><font color="#0000ff">http://www.zope.org/Members/anser/apache_zserver/</font></u></a><br />
<a href="http://www.zope.org/Members/softsign/ZServer_and_Apache_mod_gzip"><u><font color="#0000ff">http://www.zope.org/Members/softsign/ZServer_and_Apache_mod_gzip</font></u></a><br />
<a href="http://www.zope.org/Members/rbeer/caching"><u><font color="#0000ff">http://www.zope.org/Members/rbeer/caching</font></u></a><br />
<br />
<br />
本文转自：<font style="background-color: #d3ebd8">http://www.phpe.net/articles/366.shtml</font>
<img src ="http://www.blogjava.net/szhswl/aggbug/177349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/szhswl/" target="_blank">宋针还</a> 2008-01-23 19:26 <a href="http://www.blogjava.net/szhswl/articles/177349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>