📄 caching.html
字号:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="keywords" content="Apache, 中文, 手册, 中文版, 中文手册, 中文版手册, 参考手册, 中文参考手册, 金步国" />
<meta name="description" content="Apache 2.2 中文版参考手册" />
<meta name="author" content="金步国" />
<link href="./style/css/manual-zip.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
<link href="./style/css/manual-zip-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
<title>缓冲指南 - Apache 2.2 中文版参考手册</title>
</head>
<body id="manual-page">
<div id="page-header"><p class="menu"><a href="./mod/index.html">模块索引</a> | <a href="./mod/directives.html">指令索引</a> | <a href="./faq/index.html">常见问题</a> | <a href="./glossary.html">词汇表</a> | <a href="./sitemap.html">站点导航</a></p><p class="apache">Apache HTTP Server 版本2.2</p><img alt="" src="./images/feather.gif" /></div>
<div class="up"><a href="./index.html"><img title="<-" alt="<-" src="./images/left.gif" /></a></div>
<div id="path"><a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs/">文档</a> > <a href="./index.html">版本2.2</a></div>
<div id="translation-info"> <a href="./translator_announcement.html#thanks">致谢</a> | <a href="./translator_announcement.html#announcement">译者声明</a> | 本篇译者:<a href="mailto:csfrank@citiz.net">金步国</a> | 本篇译稿最后更新:2006年1月1日 | <a href="./translator_announcement.html#last_new">获取最新版本</a></div>
<div id="page-content"><div id="preamble"><h1>缓冲指南</h1>
<p>这篇文档是对<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>、<code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code>、<code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code>、<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>和<a href="programs/htcacheclean.html">htcacheclean</a>参考文档内容的增补。它描述了如何利用Apache的缓冲特性来加速web和代理(proxy)服务,同时避免一些常见的问题和配置错误。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="introduction" id="introduction">简介</a></h2>
<p>从Apache2.2起,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>和<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>将不再是试验模块,它们已经足够稳定,可以用于实际生产中了。这些缓冲体系提供了一个强有力的途径来加速原始web服务器(origin webserver)和代理服务器(proxy)的HTTP处理速度。</p>
<p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>以及它的支持模块<code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code>和<code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code>提供了智能的HTTP缓冲。内容(content)本身被存储在缓冲区中,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>的目的在于管理控制内容缓冲能力的各种HTTP头和选项。它可以同时处理本地的内容和代理的内容。<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>被设计为同时针对简单的和复杂的缓冲配置,以用于处理代理的内容、动态的本地内容、必须加速访问的随时间而改变本地文件。</p>
<p>另一方面,<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>实现了一个更基本的、但是在某些情况下更有效的缓冲形式,它避免了主动确保URL缓冲能力所需的维护复杂性,<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>通过提供文件句柄(file-handle)和内存映射(memory-mapping)的技巧来维持一个自Apache最后一次启动以来的文件缓冲区。同样地,<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>的目标是改善不常修改的本地静态文件的访问时间。</p>
<p>由于<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>提供了一个相对简单的缓冲实现,除了<code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code>和<code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code>文档的特定段落之外,这篇指南的说明覆盖了<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>的缓存体系结构。</p>
<p>为了更好的理解这篇文档,你应当熟悉HTTP的基础知识,并且已经阅读过<a href="urlmapping.html">从URL到文件系统的映射</a>和<a href="content-negotiation.html">内容协商</a>这两篇用户指南。</p>
</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
<div class="section">
<h2><a name="overview" id="overview">缓冲概述</a></h2>
<table border="1" cellpadding="0" cellspacing="0" bordercolor="#AAAAAA" class="related">
<tr><th>相关模块</th><th>相关指令</th></tr>
<tr><td><ul><li><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code></li><li><code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code></li><li><code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code></li><li><code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_cache.html#cacheenable">CacheEnable</a></code></li><li><code class="directive"><a href="./mod/mod_cache.html#cachedisable">CacheDisable</a></code></li><li><code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code></li><li><code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code></li><li><code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code></li><li><code class="directive"><a href="./mod/core.html#usecanonicalname">UseCanonicalName</a></code></li><li><code class="directive"><a href="./mod/mod_negotiation.html#cachenegotiateddocs">CacheNegotiatedDocs</a></code></li></ul></td></tr>
</table>
<p>在一个请求的生存期中,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>内可能会发生两个主要阶段。首先,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>将是一个URL映射模块,也就是说,如果一个URL已经被缓存并且这个缓存尚未失效,该请求将由<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>直接处理。</p>
<p>这也意味着在处理一个请求时通常还要发生的其他阶段:比如由<code class="module"><a href="./mod/mod_proxy.html">mod_proxy</a></code>或<code class="module"><a href="./mod/mod_rewrite.html">mod_rewrite</a></code>处理的阶段,将不会发生。不过,这正是将内容缓存起来的关键所在。[虽然某些阶段被省略了,但这正是启用缓冲特性的初衷:减少处理步骤以提高速度。]</p>
<p>如果这个URL不在缓存中,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>将会在请求的处理过程中添加一个<a href="filter.html">过滤器</a>。在Apache使用通常的方法定位内容之后,该过滤器将会在内容被用于服务以后运行。如果该内容被确定为可以缓存,那么它将被保存在缓冲区中以便为将来的请求提供服务。</p>
<p>如果该URL存在于缓存中并且已经失效的话,该过滤器同样会被添加,但是<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>将会同时向后端(backend)提交一个条件请求以确定缓存的版本是否是当前的最新版本。如果是最新版本,那么它的元信息(meta-information)将会被更新并且使用这个缓存的版本来服务于该请求。如果不是最新版本,那么过滤器将使用刚才为请求提供服务的最新内容更新缓存。</p>
<h3>提高缓存命中率</h3>
<p>在缓存本地生成的内容的时候,将<code class="directive"><a href="./mod/core.html#usecanonicalname">UseCanonicalName</a></code>指令设置为 <code>On</code> 可以显著提高缓存的命中率。这是由于为缓冲区提供内容的虚拟主机的主机名是缓冲键(cache key)的组成部分。当该指令设置为 <code>On</code> 时,具有多个服务器名或别名的虚拟主机将不会产生不同的缓存实体,而是按照各自的规范主机名(canonical hostname)来存储。</p>
<p>由于缓存发生在将URL映射到文件系统的阶段,缓存的文档将只被用来响应对URL的请求。通常情况下这没什么重大意义,但是当你使用<a href="howto/ssi.html">服务端包含(Server Side Includes)</a>时,这一点将显得特别重要:</p>
<div class="example"><pre>
<!-- 下面的包含可以被缓存 -->
<!--#include virtual="/footer.html" -->
<!-- 下面的包含不可以被缓存 -->
<!--#include file="/path/to/footer.html" --></pre></div>
<p>如果你使用服务端包含(SSI),并且希望从缓冲中获得快速服务好处,你应当使用<code>virtual</code>类型的包含。</p>
<h3>失效周期(Expiry Periods)</h3>
<p>缓存实体的默认失效周期是一个小时(3600秒),当然这个可以轻易的通过<code class="directive"><a href="./mod/mod_cache.html#cachedefaultexpire">CacheDefaultExpire</a></code>指令来修改。这个默认值仅仅用在产生内容的原始资源没有明确指定失效时间或最后修改时间的情况下。</p>
<p>如果一个应答没有包含<code>Expires</code>头但却包含<code>Last-Modified</code>头时,<code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>可以根据<code class="directive"><a href="./mod/mod_cache.html#cachelastmodifiedfactor">CacheLastModifiedFactor</a></code>指令推断出失效周期。</p>
<p>对于本地内容,<code class="module"><a href="./mod/mod_expires.html">mod_expires</a></code>可以用来调整失效周期。</p>
<p>失效周期的最大值还可以通过<code class="directive"><a href="./mod/mod_cache.html#cachemaxexpire">CacheMaxExpire</a></code>指令来控制。</p>
<h3>关于条件请求(Conditional Request)的简短说明</h3>
<p>当缓存的内容失效并且被从后端(backend)或内容提供者(content provider)那里重新请求的时候,Apache并不直接传递原始的请求,而是使用一个条件请求(conditional request)。</p>
<p>HTTP协议使用的一些头(header)允许客户端或缓冲区鉴别同一个内容的不同版本。例如,如果一个资源应答了"Etag:"头,那么就可以生成一个包含"If-Match:"头的条件请求;如果一个资源应答了"Last-Modified:"头,那么就可以生成一个包含"If-Modified-Since:"头的条件请求;等等。</p>
<p>对于这样的条件请求,应答的不同取决于内容是否匹配这些条件。如果一个请求包含一个"If-Modified-Since:"头,而请求的内容在指定的时间之后并未发生改变,那么一个简洁的"304 Not Modified"应答就可以了。</p>
<p>如果请求的内容已经变化,那么将按照原来没有条件请求的普通方式来应答。</p>
<p>和缓存相关的条件请求的好处有两个方面。首先,当向后端提交这样的条件请求时,如果从后端获得的内容与存储的内容相匹配(这很容易确定),就可以避免由于传递全部资源所带来的开销。</p>
<p>其次,条件请求通常只让后端花费较小的开销。对于静态文件,通常所有的开销就是一个<code>stat()</code>或类似的系统调用以确定改文件的大小是否变化以及最后修改时间。这样,如果被请求的内容尚未变化,甚至在Apache缓存的本地内容已经失效的情况下,仍然可以从缓冲区中快速取得以服务于请求——只要从缓冲区读取比从后端读取更快(例如从内存缓冲区读取就比从硬盘上读取更快)。</p>
<h3>什么可以被缓存?</h3>
<p>如前所述,Apache中的缓冲存在两种不同工作方式。<code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>的缓冲区负责维护Apache启动时的文件内容。当一个存在于该模块缓冲区中的文件被请求时,该请求将被拦截并用缓冲区中的内容为其提供服务。</p>
<p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>的缓冲区相对而言较为复杂。当服务于一个请求时,如果它先前并未被缓存,则缓冲模块将会判断该内容是否可以被缓存。判断应答的缓冲能力(cachability)基于以下条件:</p>
<ol>
<li>必须为该URL启用了缓冲。请参考<code class="directive"><a href="./mod/mod_cache.html#cacheenable">CacheEnable</a></code>和<code class="directive"><a href="./mod/mod_cache.html#cachedisable">CacheDisable</a></code>指令。</li>
<li>应答必须具有如下HTTP状态码:200, 203, 300, 301, 410 。</li>
<li>该请求必须是一个HTTP GET请求。</li>
<li>如果请求包含"Authorization:"头,则应答不被缓存。</li>
<li>如果应答包含"Authorization:"头,它必须同时也在"Cache-Control:"头中包含"s-maxage"、"must-revalidate"或"public"选项。</li>
<li>如果该URL包含一个请求字符串(比如来自于一个使用GET方法的HTML表格),除非应答包含"Expires:"头,否则将不被缓存。这是基于RFC2616的13.9小节的规范。</li>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -