<?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>OurApache &#187; cache</title>
	<atom:link href="http://ourapache.com/archives/tag/cache/feed" rel="self" type="application/rss+xml" />
	<link>http://ourapache.com</link>
	<description>我们致力于一个Apache知识的分享网站</description>
	<lastBuildDate>Tue, 13 Apr 2010 05:18:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>基于资源的HTTP Cache的实现介绍</title>
		<link>http://ourapache.com/archives/303</link>
		<comments>http://ourapache.com/archives/303#comments</comments>
		<pubDate>Sat, 05 Sep 2009 16:02:58 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[HTTP相关知识]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[Etag]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=303</guid>
		<description><![CDATA[我们都知道浏览器会缓存访问过网站的网页，浏览器通过URL地址访问一个网页，显示网页内容的同时会在电脑上面缓存网页内容。如果网页没有更新的话，浏览器再次访问这个URL地址的时候，就不会再次下载网页，而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新，浏览器才会再次下载网页。 ]]></description>
			<content:encoded><![CDATA[<p>我们都知道浏览器会缓存访问过网站的网页，浏览器通过URL地址访问一个网页，显示网页内容的同时会在电脑上面缓存网页内容。如果网页没有更新的话，浏览器再次访问这个URL地址的时候，就不会再次下载网页，而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新，浏览器才会再次下载网页。</p>
<p><strong>一、什么是HTTP <a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">Cache</a></strong></p>
<p>对于浏览器的这种网页缓存机制大家已经耳熟能详了，举个例子来说，JavaEye的新闻订阅地址：http://www.javaeye.com/rss/news ， 当浏览器或者订阅程序访问这个URL地址的时候，JavaEye的服务器在response的header里面会发送给浏览器如下状态标识：</p>
<blockquote><p><a href="http://ourapache.com/archives/tag/etag" class="st_tag internal_tag" rel="tag" title="标签 Etag 下的日志">Etag</a> “427fe7b6442f2096dff4f92339305444&#8243;<br />
Last-Modified Fri, 04 Sep 2009 05:55:43 GMT</p>
<p>Etag “427fe7b6442f2096dff4f92339305444&#8243;<br />
Last-Modified Fri, 04 Sep 2009 05:55:43 GMT</p></blockquote>
<p>这就是告诉浏览器，新闻订阅这个网络资源的最后修改时间和Etag。于是浏览器把这两个状态信息连同网页内容在本地进行缓存，当浏览器再次访问JavaEye新闻订阅地址的时候，浏览器会发送如下两个状态标识给JavaEye服务器：</p>
<blockquote><p>If-None-Match “427fe7b6442f2096dff4f92339305444&#8243;<br />
If-Modified-Since Fri, 04 Sep 2009 05:55:43 GMT</p>
<p>If-None-Match “427fe7b6442f2096dff4f92339305444&#8243;<br />
If-Modified-Since Fri, 04 Sep 2009 05:55:43 GMT</p></blockquote>
<p>就是告诉服务器，我本地缓存的网页最后修改时间和Etag是什么，请问你服务器的资源有没有在我上次访问之后有更新啊？于是JavaEye服务器会核对一下，如果该用户上次访问之后没有更新过新闻，那么根本就不必生成这个RSS了，直接告诉浏览器：“没什么新东西，你还是看自己缓存的网页吧”，于是服务器就发送一个304 Not Modified的消息，其他什么都不用干了。</p>
<p>这就是HTTP层的Cache，使用这种基于资源的缓存机制，不但大大节省服务器程序资源，而且还减少了网页下载次数，节约了很多网络带宽。</p>
<p><strong>二、HTTP Cache究竟有什么作用？</strong></p>
<p>我们通常的动态网站编程，服务器端程序根本就不去处理浏览器发送过来的If-None-Match和If-Modified-Since状态标识，只要有请求就生成网页发送给浏览器。对于一般情况来说，用户不会总是没完没了刷新一个页面，所以大家并不认为这种基于资源的缓存有什么太大的作用，但实际情况并非如此：</p>
<p>1、像Google这种比较智能的网络爬虫可以有效识别资源的状态信息，如果使用这种缓存机制，可以大大减少爬虫的爬取次数。</p>
<p>比方说Google每天爬JavaEye网站大概15万次左右，但实际上JavaEye每天有更新的内容不会超过1万个网页。因为很多内容更新比较快，因此Google就会反复不停的爬取，这样本身就造成了很多资源的浪费。如果我们使用HTTP Cache，那么只有当网页内容发生改变的时候，才会真正进行爬取，其他时候我们直接告诉Google的爬虫304 Not Modified就可以了。这样不但降低了服务器本身的负载和爬虫造成的网络带宽消耗，实际上也大大提高了Google爬虫的工作效率，岂不是皆大欢喜？</p>
<p>2、很多内容更新不频繁的网页，尽管用户不会频繁的刷新，但是从一个比较长的时间段来看使用HTTP Cache，仍然可以起到很大的缓存作用。</p>
<p>比方说一些历史讨论帖子，已经过去了几个月了，这些帖子内容很少更新。用户可能通过搜索，收藏链接，文章关联等方式时不时访问到这个页面。那么只要用户访问过一次以后，后续所有访问服务器直接发送304 Not Modified就可以了，不用真正生成页面。</p>
<p>3、对于历史帖子使用HTTP Cache可以避免爬虫反复的爬取。</p>
<p>比方说JavaEye的论坛帖子列表页面，分页到20页后面的帖子已经很少有人直接访问了，但是从服务器日志去看，每天仍然有大量爬虫反复爬取这些分页到很后面的页面。这些页面由于用户很少去点击，所以基本上没有被应用程序的memcached缓存住，每次访问都会造成很高的资源消耗，爬虫隔一段时间就爬一次，对服务器是很大的负担。如果使用了HTTP Cache，那么只要爬虫爬过一次以后，以后无论爬虫爬多少次，都可以直接返回304 Not Modified了，极大的节省了服务器的负载。</p>
<p><strong>三、如何在应用程序里面使用HTTP Cache</strong></p>
<p>如果我们要在自己的程序里面实现HTTP Cache，是件非常简单的事情，特别是对Rails来说只需要添加一点点代码，以上面的JavaEye新闻订阅来说，只要添加一行代码：</p>
<blockquote><p>def news<br />
fresh_when(:last_modified =&gt; News.last.created_at, :etag =&gt; News.last)<br />
end</p>
<p>def news<br />
fresh_when(:last_modified =&gt; News.last.created_at, :etag =&gt; News.last)<br />
end</p></blockquote>
<p>用最新新闻文章作为Etag，该文章最后修改时间作为资源的最后修改时间，这样就OK了。如果浏览器发送过来的标识和服务器标识一致，说明内容没有更新，直接发送304 Not Modified；如果不一致，说明内容更新，浏览器本地的缓存太古老了，那么就需要服务器真正生成页面了。</p>
<p>以上只是一个最简单的例子，如果我们需要根据状态做一些更多的工作也是很容易的。比方说JavaEye博客的RSS订阅地址： http://robbin.javaeye.com/rss</p>
<blockquote><p>@blogs = @blog_owner.last_blogs<br />
@hash = @blogs.collect{|b| {b.id =&gt; b.post.modified_at.to_i + b.posts_count}}.hash<br />
if stale?(:last_modified =&gt; (@blog_owner.last_blog.post.modified_at || @blog_owner.last_blog.post.created_at), :etag =&gt; @hash)<br />
render :template =&gt; “rss/blog”<br />
end</p>
<p>@blogs = @blog_owner.last_blogs<br />
@hash = @blogs.collect{|b| {b.id =&gt; b.post.modified_at.to_i + b.posts_count}}.hash<br />
if stale?(:last_modified =&gt; (@blog_owner.last_blog.post.modified_at || @blog_owner.last_blog.post.created_at), :etag =&gt; @hash)<br />
render :template =&gt; “rss/blog”<br />
end</p></blockquote>
<p>这个实现稍微复杂一些。我们需要判断博客订阅所有的输出文章是否有更新，所以我们用博客文章内容最后修改时间和博客的评论数量做一个hash，然后用这个hash值作为资源的Etag，那么只要这些博客文章当中任何文章内容被修改，或者有新评论，都会改变Etag值，从而通知浏览器内容有更新了。</p>
<p>除了RSS订阅之外，JavaEye网站还有很多地方适合使用HTTP Cache，比方说JavaEye论坛的版面列表页面，一些经常喜欢泡论坛的用户，可能时不时会上来刷新一下版面， 看看有没有新的帖子，那么我们就不必每次用户请求的时候都去执行程序，生成页面给他。我们判断一下如果没有新帖子的话，直接告诉他304 Not Modified就可以了，在没有使用HTTP Cache之前的版面Action代码：</p>
<blockquote><p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions =&gt; &#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end</p>
<p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions =&gt; &#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end</p></blockquote>
<p>添加HTTP Cache以后，代码如下：</p>
<blockquote><p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
if logged_in? || stale?(:last_modified =&gt; @topics[0].last_post.created_at, :etag =&gt; @topics.collect{|t| {t.id =&gt; t.posts_count}}.hash)<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions&#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end<br />
end</p>
<p>def board<br />
@topics = @forum.topics.paginate&#8230;<br />
if logged_in? || stale?(:last_modified =&gt; @topics[0].last_post.created_at, :etag =&gt; @topics.collect{|t| {t.id =&gt; t.posts_count}}.hash)<br />
@announcements = (params[:page] || 1).to_i == 1 ? Topic.find :all, :conditions&#8230;<br />
render :action =&gt; &#8216;show&#8217;<br />
end<br />
end</p></blockquote>
<p>对于登录用户，不使用HTTP Cache，这是因为登录用户需要实时接收站内短信通知和订阅通知，因此我们只能对匿名用户使用HTTP Cache，然后我们使用当前所有帖子id和回帖数构造hash作Etag，这样只要当前分页列表页面有任何帖子发生改变或者有了新回帖，就更新页面，否则就不必重新生成页面。</p>
<p>Rails的Controller提供了fresh_when和stale?方法帮助我们实现HTTP Cahe功能，代码写起来已经非常简单了。但是直接在action里面添加Cache代码还是有点难看，所以我们可以用一个第三方插件：easy http cache来进一步简化工作，这样我们仅仅需要添加一个声明就可以了，如下例：</p>
<blockquote><p>class ListsController &lt; ApplicationController<br />
http_cache :show, :last_modified =&gt; :list, :etag =&gt; :current_user<br />
enddef show<br />
# expensive stuff<br />
endprotected<br />
def list<br />
@list ||= List.find(params[:id])<br />
enddef current_user<br />
@current_user ||= User.find(params[:user_id])<br />
end</p>
<p>class ListsController &lt; ApplicationController<br />
http_cache :show, :last_modified =&gt; :list, :etag =&gt; :current_user<br />
enddef show<br />
# expensive stuff<br />
endprotected<br />
def list<br />
@list ||= List.find(params[:id])<br />
enddef current_user<br />
@current_user ||= User.find(params[:user_id])<br />
end</p></blockquote>
<p>Easy Http Cache插件更多用法可以参考：http://github.com/josevalim/easy_http_cache/tree/master</p>
<p>在给JavaEye网站所有的RSS订阅输出添加了HTTP Cache以后，通过一天的观察发现，超过一半的RSS订阅请求已经被缓存了，直接返回304 Not Modified，所以效果非常明显，由于JavaEye网站每天RSS订阅的动态请求就超过了10万次，因此添加HTTP Cache可以减轻不少服务器的负担和带宽消耗。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年08月12号 -- <a href="http://ourapache.com/archives/268" title="Etag和Expires">Etag和Expires</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/178" title="Apache缓存系统">Apache缓存系统</a></li><li>2009年02月25号 -- <a href="http://ourapache.com/archives/165" title="Apache 设置web 缓存">Apache 设置web 缓存</a></li></ul>
	标签：<a href="http://ourapache.com/archives/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://ourapache.com/archives/tag/etag" title="Etag" rel="tag">Etag</a>, <a href="http://ourapache.com/archives/category/http" title="HTTP相关知识" rel="tag">HTTP相关知识</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/303/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache缓存系统</title>
		<link>http://ourapache.com/archives/178</link>
		<comments>http://ourapache.com/archives/178#comments</comments>
		<pubDate>Wed, 25 Feb 2009 10:25:04 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=178</guid>
		<description><![CDATA[Apache 从2.0开始就已经可以使用缓存模块了，不过在2.0的时候还是实验性的，到了2.2已经完全可以放心的使用。Apache 的缓存实现主要依靠 mod_cache、mod_disk_cache、mod_file_cache 及 mod_mem_cache。只需在配置编译的时候加上参数：–enable-cache、 –enable-disk-cache、–enable-file-cache、 –enable-mem-cache 即可。]]></description>
			<content:encoded><![CDATA[<p>Apache 从2.0开始就已经可以使用缓存模块了，不过在2.0的时候还是实验性的，到了2.2已经完全可以放心的使用。Apache 的缓存实现主要依靠 mod_<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>、mod_disk_<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>、mod_file_<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> 及 mod_mem_<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>。只需在配置编译的时候加上参数：–enable-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>、 –enable-disk-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>、–enable-file-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>、 –enable-mem-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> 即可。</p>
<p>关于 Apache 的编译安装本文就不再说了，可以参考以前的文章。这里主要介绍一下如何配置使用 Apache 的缓存功能。<br />
具体来说，Apache 的缓存方式有两种，一种是基于硬盘文件的缓存，由 mod_disk_cache 实现，另一种是使用内存缓存，由 mod_mem_cache 实现，不过它们都是依赖 mod_cache 模块的，mod_cache 模块提供了一些缓存配置的指令供它们使用，而 mod_file_cache 模块是搭配 mod_mem_cache 模块使用的，下面分别进行介绍。</p>
<p>1、基于硬盘文件的缓存<br />
基于硬盘文件存储的缓存由 mod_disk_cache 模块实现，先看个简单的配置例子：</p>
<blockquote><p>CacheDefaultExpire 86400<br />
CacheEnable disk /<br />
CacheRoot /tmp/apacheCache<br />
CacheDirLevels 5<br />
CacheDirLength 5<br />
CacheMaxFileSize 1048576<br />
CacheMinFileSize 10</p></blockquote>
<p>把上面的配置加到 Apache 的 httpd.conf 文件中，如果缓存相关的模块都已经编译进了 Apache 的核心，则无需加载模块，直接就能使用上面的指令。指令的详细说明如下：</p>
<p>CacheDefaultExpire： 设定缓存过期的时间（秒），默认是1小时，只有当缓存的文档没有设置过期时间或最后修改时间时这个指令才会生效<br />
CacheEnable：启用缓存，第1个参数是缓存类弄，这里当然是 disk了，第2个参数是缓存路径，指的是 url 路径，这里是缓存所有的东西，直接写上“/”即可，如“/docs”则只缓存 /docs 下的所有文件<br />
CacheRoot：缓存文件所在的目录，运行 Apache 的用户（如daemon 或 nobody）要能对其进行读写，如果不清楚的话可以直接设置成 777，请手动建立该目录并设置好访问权限<br />
CacheDirLevels：缓存目录的深度，默认是3，这里设置为5<br />
CacheDirLength：缓存目录名的字符长度，默认是4，这里设置为5<br />
CacheMaxFileSize 和 CacheMaxFileSize：缓存文件的最大值和最小值（byte），当超过这个范围时将不再缓存，这里设置为 1M 和 10bytes</p>
<p>基于硬盘文件存储的文件基本上就这些内容，设置好后重启 Apache 应该就能使用了。一切正常的话，可以在缓存目录下看到 Apache 自动建立的一些目录和缓存的数据文件。</p>
<p>2、基于内存的缓存<br />
基于内存的缓存主要由 mod_mem_cache 模块实现，还是看个简单的配置吧，这样比较直观:-)</p>
<blockquote><p>CacheEnable mem /<br />
MCacheMaxObjectCount 20000<br />
MCacheMaxObjectSize 1048576<br />
MCacheMaxStreamingBuffer 65536<br />
MCacheMinObjectSize 10<br />
MCacheRemovalAlgorithm GDSF<br />
MCacheSize 131072</p></blockquote>
<p>简单说一下上面一些指令的意思：</p>
<p>CacheEnable：启用缓存，使用基于内存的方式存储<br />
MCacheMaxObjectCount：在内存中最多能存储缓存对象的个数，默认是1009，这里设置为20000<br />
MCacheMaxObjectSize：单个缓存对象最大为 1M，默认是10000bytes<br />
MCacheMaxStreamingBuffer：在缓冲区最多能够放置多少的将要被缓存对象的尺寸，这里设置为 65536，该值通常小于100000或 MCacheMaxObjectSize 设置的值<br />
MCacheMinObjectSize：单个缓存对象最小为10bytes，默认为1bytes<br />
MCacheRemovalAlgorithm：清除缓存所使用的算法，默认是 GDSF，还有一个是LRU，可以查一下 Apache 的官方文档，上面有些介绍<br />
MCacheSize：缓存数据最多能使用的内存，单位是 kb，默认是100kb，这里设置为128M<br />
保存重启 Apache 基于内存的缓存系统应该就能生效了，根据需要可以使基于内存的存储或硬盘文件的存储方式一起使用，只要指明不同的URL路径即可。</p>
<p>3、注意事项<br />
使用缓存需要注意如下事项：</p>
<p>要使用缓存，必须使用指令 CacheEnable 启用它，目前可用的缓存类型为 disk 或 mem，禁止缓存可以使用 CacheDisable，如 CacheDisable /private<br />
待缓存的 URL 返回的状态值必须为： 200、203、300、301 或 410<br />
URL 的请求方式必须是 GET 方式<br />
发送请求时，头部中包含 “Authorization: ”的字符串时，返回的内容将不会被缓存<br />
URL 包含查询字符串，如问号?后的那些东西，除非返回的内容包含“Expires:”，否则不会被缓存<br />
如果返回的状态值是 200，则返回的头部信息必须包含以下的一种才会被缓存：<a href="http://ourapache.com/archives/tag/etag" class="st_tag internal_tag" rel="tag" title="标签 Etag 下的日志">Etag</a>、Last-Modified、Expires，除非设置了指令 CacheIgnoreNoLastMod On<br />
如果返回内容的头部信息“Cache-Control:”中包含“private”，除非设置了指令 CacheStorePrivate On，否则不会被缓存<br />
如果返回内容的头部信息“Cache-Control:”中包含“no-sotre”，除非设置了指令 CacheStoreNoStore On，否则不会被缓存<br />
如果返回内容的头部信息“Vary:”中包含了“*”，不会被缓存</p>
<p>4、其它一些指令的介绍<br />
如果你的网站有几个文件的访问非常频繁而又不经常变动，则可以在 Apache 启动的时候就把它们的内容缓存到内存中（当然要启用内存缓存系统），使用的是 mod_file_cache 模块，具体如下：<br />
有多个文件可以用空格格开</p>
<blockquote><p>MMapFile /var/www/html/index.html /var/www/html/articles/index.html</p></blockquote>
<p>上面是缓存文件的内容到内存中，除此之外，还可以只缓存文件的打开句柄到内存中，当有请求进来的时候，Apache 直接从内存中获取文件的句柄，返回内容，和 MMapFile 指令很像，具体如下：</p>
<blockquote><p>CacheFile /var/www/html/index.html /var/www/html/articles/index.html</p></blockquote>
<p>上面两个指令所缓存的文件如果有修改的话，必须重启 Apache 或使用 graceful 之类的方式强制使 Apache 更新缓存数据，否则当用户访问的时候获取的不是最新的数据。</p>
<p>有时候需要根据某些特殊的头部信息来决定是否进行缓存，则可以使用如下指令：<br />
当头部信息中包含 Set-Cookie 时则跳过不进行缓存操作</p>
<blockquote><p>CacheIgnoreHeaders Set-Cookie</p></blockquote>
<p>有时候需要缓存的时候跳过 URL 中的查询字符串？使用如下指令：</p>
<blockquote><p>CacheIgnoreQueryString On</p></blockquote>
<p>Apache 的缓存系统不仅可以缓存服务器本身的文件，也可以缓存通过代理得到的内容，对了，Apache 可以像 Squid 一样做代理，而且做的还不错，下篇文章就介绍一下 Apache 的代理功能吧。善用 Apache 的缓存功能，可以让你的网站速度提升不少。做为一个网站来说，虽然可用的各种缓存方案很多，但在 Web 服务器层做缓存的效率还是很值得一试的。</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年02月25号 -- <a href="http://ourapache.com/archives/165" title="Apache 设置web 缓存">Apache 设置web 缓存</a></li><li>2009年09月6号 -- <a href="http://ourapache.com/archives/303" title="基于资源的HTTP Cache的实现介绍">基于资源的HTTP Cache的实现介绍</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/209" title="面向站长和网站管理员的Web缓存加速指南">面向站长和网站管理员的Web缓存加速指南</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/187" title="header中的Cache-control参数说明">header中的Cache-control参数说明</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/89" title="Apache PHP利用HTTP缓存协议原理解析及应用">Apache PHP利用HTTP缓存协议原理解析及应用</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://ourapache.com/archives/tag/%e7%bc%93%e5%ad%98" title="缓存" rel="tag">缓存</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/178/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache 设置web 缓存</title>
		<link>http://ourapache.com/archives/165</link>
		<comments>http://ourapache.com/archives/165#comments</comments>
		<pubDate>Wed, 25 Feb 2009 10:09:23 +0000</pubDate>
		<dc:creator>OurApache</dc:creator>
				<category><![CDATA[Apache初级应用]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.ourapache.com/?p=165</guid>
		<description><![CDATA[默认情况下，apache安装完以后，是不允许被cache的。如果外接了cache或squid服务器要求进行web加速的话，就需要在htttpd.conf里进行设置，当然前提是在安装apache的时候要激活mod_cache的模块。 ]]></description>
			<content:encoded><![CDATA[<p>默认情况下，apache安装完以后，是不允许被cache的。如果外接了cache或squid服务器要求进行web加速的话，就需要在htttpd.conf里进行设置，当然前提是在安装apache的时候要激活mod_cache的模块。</p>
<p>以下简单介绍一下安装与配置的步骤：</p>
<p>1. apache版本：httpd-2.0.49.tar.gz</p>
<p>2. 安装httpd-2.0.49.tar.gz:<br />
# tar –zxvf httpd-2.0.49.tar.gz<br />
# cd httpd-2.0.49<br />
#./configure &#8211;enable-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> &#8211;enable-disk-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> &#8211;enable-mem-<a href="http://ourapache.com/archives/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a><br />
#mke<br />
#make install</p>
<p>3. 检验是否安装了cache模块<br />
/usr/local/apache2/bin/apachectl –l<br />
如果有mod_cache.c<br />
   mod_disk_cache.c<br />
   mod_mem_cache.c<br />
这3个模块，说明该apache可以支持cache了</p>
<p>4．更改httpd.conf的设置<br />
vi /usr/local/apache2/conf/httpd.conf<br />
在末尾添加上：<br />
&lt;IfModule mod_cache.c&gt;</p>
<p>CacheForceCompletion 100<br />
   CacheDefaultExpire 3600<br />
   CacheMaxExpire 86400<br />
   CacheLastModifiedFactor 0.1<br />
&lt;/IfModule&gt;</p>
<p>5.设置虚拟目录<br />
然后保存退出。启动apache</p>
<p>6．参数的解释：<br />
mod_cache：<br />
CacheEnable: 启动 mod_cache，其后接两个参数。第一个参数指定快取的种类，应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一；第二个参数指定使用快取的 URI 路径，如果对整个网站 (或虚拟主机) 进行快取，简单指定为根目录(/) 即可。<br />
CacheForceCompletion: 这个值指定当 HTTP request 被取消时，内容的产生动作要完成的百分比；预设是 60(%)。<br />
CacheDefaultExpire: 指定快取的预设过期秒数；预设值是一小时 (3600)。<br />
CacheMaxExpire: 指定快取最大的过期秒数；预设值是一天 (86400)。<br />
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。<br />
计算方式是：<br />
expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor<br />
而<br />
expire date = 目前时间 + expire period<br />
不过无论如何，过期时间不能超过 CacheMaxExpire 的设定值。</p>
<p>现在。如果用squid对该服务器进行反向代理的话，就可以通过cache 实现web的加速了</p>
<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li>2009年02月25号 -- <a href="http://ourapache.com/archives/178" title="Apache缓存系统">Apache缓存系统</a></li><li>2009年09月6号 -- <a href="http://ourapache.com/archives/303" title="基于资源的HTTP Cache的实现介绍">基于资源的HTTP Cache的实现介绍</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/209" title="面向站长和网站管理员的Web缓存加速指南">面向站长和网站管理员的Web缓存加速指南</a></li><li>2009年02月27号 -- <a href="http://ourapache.com/archives/187" title="header中的Cache-control参数说明">header中的Cache-control参数说明</a></li><li>2009年02月7号 -- <a href="http://ourapache.com/archives/89" title="Apache PHP利用HTTP缓存协议原理解析及应用">Apache PHP利用HTTP缓存协议原理解析及应用</a></li></ul>
	标签：<a href="http://ourapache.com/archives/category/primary" title="Apache初级应用" rel="tag">Apache初级应用</a>, <a href="http://ourapache.com/archives/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://ourapache.com/archives/tag/%e7%bc%93%e5%ad%98" title="缓存" rel="tag">缓存</a><br />
]]></content:encoded>
			<wfw:commentRss>http://ourapache.com/archives/165/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

