]> granicus.if.org Git - apache/blob - docs/manual/caching.html.en
Remove over-zealous and invalid use of <indent></indent> in the Caching
[apache] / docs / manual / caching.html.en
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>Caching Guide - Apache HTTP Server</title>
9 <link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
12 <link href="./images/favicon.ico" rel="shortcut icon" /></head>
13 <body id="manual-page"><div id="page-header">
14 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p>
15 <p class="apache">Apache HTTP Server Version 2.1</p>
16 <img alt="" src="./images/feather.gif" /></div>
17 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
18 <div id="path">
19 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs-project/">Documentation</a> &gt; <a href="./">Version 2.1</a></div><div id="page-content"><div id="preamble"><h1>Caching Guide</h1>
20 <div class="toplang">
21 <p><span>Available Languages: </span><a href="./en/caching.html" title="English">&nbsp;en&nbsp;</a></p>
22 </div>
23
24     <p>This document supplements the <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>,
25     <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>,
26     <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> and <a href="programs/htcacheclean.html">htcacheclean</a> reference documentation.
27     It describes how to use Apache's caching features to accelerate web and 
28     proxy serving, while avoiding common problems and misconfigurations.</p>
29   </div>
30 <div id="quickview"><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#introduction">Introduction</a></li>
31 <li><img alt="" src="./images/down.gif" /> <a href="#overview">Caching Overview</a></li>
32 <li><img alt="" src="./images/down.gif" /> <a href="#security">Security Considerations</a></li>
33 <li><img alt="" src="./images/down.gif" /> <a href="#filehandle">File-Handle Caching</a></li>
34 <li><img alt="" src="./images/down.gif" /> <a href="#inmemory">In-Memory Caching</a></li>
35 <li><img alt="" src="./images/down.gif" /> <a href="#disk">Disk-based Caching</a></li>
36 </ul></div>
37 <div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
38 <div class="section">
39 <h2><a name="introduction" id="introduction">Introduction</a></h2>
40     
41
42     <p>As of Apache HTTP server version 2.2 <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> and 
43     <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> are no longer marked experimental and are 
44     considered suitable for production use. These caching architectures provide
45     a powerful means to accelerate HTTP handling, both as a webserver and as a 
46     proxy.</p>
47
48     <p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> and its provider modules 
49     <code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code> and <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> 
50     provide intelligent, HTTP-aware caching. The content itself is stored
51     in the cache, and mod_cache aims to honour all of the various HTTP
52     headers and options that control the cachability of content. It can
53     handle both local and proxied content. <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>
54     is aimed at both simple and complex caching configurations, where
55     you are dealing with proxied content, dynamic local content or 
56     have a need to speed up access to local files which change with 
57     time.</p>
58
59     <p><code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> on the other hand presents a more
60     basic, but sometimes useful, form of caching. Rather than maintain
61     the complexity of actively ensuring the cachability of URLs,
62     <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> offers file-handle and memory-mapping 
63     tricks to keep a cache of files as they were when Apache was last 
64     started. As such <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> is aimed at improving 
65     the access time to local static files which do not change very
66     often.</p>
67
68     <p>As <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> presents a relatively simple
69     caching implementation, apart from the specific sections on <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> and <code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code>, the explanations
70     in this guide cover the <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> caching 
71     architecture.</p>
72
73     <p>To get the most from this document, you should be familiar with 
74     the basics of HTTP, and have read the Users' Guides to 
75     <a href="urlmapping.html">Mapping URLs to the Filesystem</a> and 
76     <a href="content-negotiation.html">Content negotiation</a>.</p>
77
78   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
79 <div class="section">
80 <h2><a name="overview" id="overview">Caching Overview</a></h2>
81
82     
83     
84     <table class="related"><tr><th>Related Modules</th><th>Related Directives</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>
85
86     <p>There are two main stages in <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> which can
87     occur in the lifetime of a request. First, <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>
88     is a URL mapping module, which means that if a URL has been cached,
89     and the cached version of that URL has not expired, the request will 
90     be served directly by <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>.</p>
91
92     <p>This means that any other stages with might ordinarily happen in the 
93     process of serving a request, for example being handled by 
94     <code class="module"><a href="./mod/mod_proxy.html">mod_proxy</a></code>, or <code class="module"><a href="./mod/mod_rewrite.html">mod_rewrite</a></code> won't happen. 
95     But then this is the point of caching content in the first place.</p>
96
97     <p>If the URL is not found within the cache, <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>
98     will add a <a href="filter.html">filter</a> to the request handling. After
99     Apache has located the content by the usual means, the filter will be run
100     as the content is served. If the content is determined to be cacheable, 
101     the content will be saved to the cache for future serving.</p>
102
103     <p>If the URL is found within the cache, but also found to have expired,
104     the filter is added anyway, but <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will create
105     a conditional request to the backend, to determine if the cached version
106     is still current. If the cached version is still current, its
107     meta-information will be updated and the request will be served from the
108     cache. If the cached version is no longer current, the cached version
109     will be deleted and the filter will save the updated content to the cache
110     as it is served.</p>
111
112     <h3>Improving Cache Hits</h3>
113       
114
115       <p>When caching locally generated content, ensuring that  
116       <code class="directive"><a href="./mod/core.html#usecanonicalname">UseCanonicalName</a></code> is set to 
117       <code>On</code> can dramatically improve the ratio of cache hits. This
118       is because the hostname of the virtual-host serving the content forms
119       a part of the cache key. With the setting set to <code>On</code>
120       virtual-hosts with multiple server names or aliases will not produce
121       differently cached entities, and instead content will be cached as
122       per the canonical hostname.</p>
123
124       <p>Because caching is performed within the URL to filename translation 
125       phase, cached documents will only be served in response to URL requests.
126       Ordinarily this is of little consequence, but there is one circumstance
127       in which it matters: If you are using <a href="howto/ssi.html">Server 
128       Side Includes</a>;</p>
129
130       <div class="example"><pre>
131 &lt;!-- The following include can be cached --&gt;
132 &lt;!--#include virtual="/footer.html" --&gt; 
133
134 &lt;!-- The following include can not be cached --&gt;
135 &lt;!--#include file="/path/to/footer.html" --&gt;</pre></div>
136
137       <p>If you are using Server Side Includes, and want the benefit of speedy
138       serves from the cache, you should use <code>virtual</code> include
139       types.</p>
140     
141     
142     <h3>Expiry Periods</h3>
143       
144     
145       <p>The default expiry period for cached entities is one hour, however 
146       this can be easily over-ridden by using the <code class="directive"><a href="./mod/mod_cache.html#cachedefaultexpire">CacheDefaultExpire</a></code> directive. This
147       default is only used when the original source of the content does not
148       specify an expire time or time of last modification.</p>
149
150       <p>If a response does not include an <code>Expires</code> header but does
151       include a <code>Last-Modified</code> header, <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>
152       can infer an expiry period based on the use of the <code class="directive"><a href="./mod/mod_cache.html#cachelastmodifiedfactor">CacheLastModifiedFactor</a></code> directive.</p>
153
154       <p>For local content, <code class="module"><a href="./mod/mod_expires.html">mod_expires</a></code> may be used to
155       fine-tune the expiry period.</p>
156
157       <p>The maximum expiry period may also be controlled by using the
158       <code class="directive"><a href="./mod/mod_cache.html#cachemaxexpire">CacheMaxExpire</a></code>.</p>
159
160     
161
162     <h3>A Brief Guide to Conditional Requests</h3>
163       
164
165       <p>When content expires from the cache and is re-requested from the 
166       backend or content provider, rather than pass on the original request,
167       Aoache will use a conditional request instead.</p>
168
169       <p>HTTP offers a number of headers which allow a client, or cache
170       to discern between different versions of the same content. For
171       example if a resource was served with an "Etag:" header, it is
172       possible to make a conditional request with an "If-Match:" 
173       header. If a resource was served with a "Last-Modified:" header
174       it is possible to make a conditional request with an 
175       "If-Modified-Since:" header, and so on.</p>
176
177       <p>When such a conditional request is made, the response differs
178       depending on whether the content matches the conditions. If a request is 
179       made with an "If-Modified-Since:" header, and the content has not been 
180       modified since the time indicated in the request then a terse "304 Not 
181       Modified" response is issued.</p>
182
183       <p>If the content has changed, then it is served as if the request were
184       not conditional to begin with.</p>
185
186       <p>The benefits of conditional requests in relation to caching are 
187       twofold. Firstly, when making such a request to the backend, if the 
188       content from the backend matches the content in the store, this can be
189       determined easily and without the overhead of transferring the entire
190       resource.</p>
191
192       <p>Secondly, conditional requests are usually less strenuous on the
193       backend. For static files, typically all that is involved is a call
194       to <code>stat()</code> or similar system call, to see if the file has
195       changed in size or modification time. As such, even if Apache is
196       caching local content, even expired content may still be served faster
197       from the cache if it has not changed. As long as reading from the cache
198       store is faster than reading from the backend (e.g. an in-memory cache 
199       compared to reading from disk).</p> 
200     
201
202     <h3>What Can be Cached?</h3>
203       
204
205       <p>As mentioned already, the two styles of caching in Apache work 
206       differently, <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> caching maintains file 
207       contents as they were when Apache was started. When a request is 
208       made for a file that is cached by this module, it is intercepted 
209       and the cached file is served.</p>
210
211       <p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> caching on the other hand is more
212       complex. When serving a request, if it has not been cached
213       previously, the caching module will determine if the content
214       is cacheable. The conditions for determining cachability of 
215       a response are;</p>
216
217       <ol>
218         <li>Caching must be enabled for this URL. See the <code class="directive"><a href="./mod/mod_cache.html#cacheenable">CacheEnable</a></code> and <code class="directive"><a href="./mod/mod_cache.html#cachedisable">CacheDisable</a></code> directives.</li>
219
220         <li>The response must have a HTTP status code of 200, 203, 300, 301 or 
221         410.</li>
222
223         <li>The request must be a HTTP GET request.</li>
224
225         <li>If the request contains an "Authorization:" header, the response
226         will not be cached.</li>
227
228         <li>If the response contains an "Authorization:" header, it must
229         also contain an "s-maxage", "must-revalidate" or "public" option
230         in the "Cache-Control:" header.</li>
231
232         <li>If the URL included a query string (e.g. from a HTML form GET
233         method) it will not be cached unless the response includes an
234         "Expires:" header, as per RFC2616 section 13.9.</li>
235
236         <li>If the response has a status of 200 (OK), the response must
237         also include at least one of the "Etag", "Last-Modified" or
238         the "Expires" headers, unless the 
239         <code class="directive"><a href="./mod/mod_cache.html#cacheignorenolastmod">CacheIgnoreNoLastMod</a></code> 
240         directive has been used to require otherwise.</li>
241
242         <li>If the response includes the "private" option in a "Cache-Control:"
243         header, it will not be stored unless the 
244         <code class="directive"><a href="./mod/mod_cache.html#cachestoreprivate">CacheStorePrivate</a></code> has been
245         used to require otherwise.</li>
246
247         <li>Likewise, if the response includes the "no-store" option in a 
248         "Cache-Control:" header, it will not be stored unless the 
249         <code class="directive"><a href="./mod/mod_cache.html#cachestorenostore">CacheStoreNoStore</a></code> has been
250         used.</li>
251
252         <li>A response will not be stored if it includes a "Vary:" header
253         containing the match-all "*".</li>
254       </ol>
255     
256
257     <h3>What Should Not be Cached?</h3>
258       
259     
260       <p>In short, any content which is highly time-sensitive, or which varies
261       depending on the particulars of the request that are not covered by
262       HTTP negotiation, should not be cached.</p>
263
264       <p>If you have dynamic content which changes depending on the IP address
265       of the requester, or changes every 5 minutes, it should almost certainly
266       not be cached.</p>
267
268       <p>If on the other hand, the content served differs depending on the
269       values of various HTTP headers, it is possible that it might be possible
270       to cache it intelligently through the use of a "Vary" header.</p>
271     
272
273     <h3>Variable/Negotiated Content</h3>
274       
275
276       <p>If a response with a "Vary" header is received by 
277       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> when requesting content by the backend it
278       will attempt to handle it intelligently. If possible, 
279       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will detect the headers attributed in the
280       "Vary" response in future requests and serve the correct cached 
281       response.</p>
282
283       <p>If for example, a response is received with a vary header such as;</p>
284
285       <div class="example"><p><code>
286 Vary: negotiate,accept-language,accept-charset
287       </code></p></div>
288
289       <p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will only serve the cached content to
290       requesters with matching accept-language and accept-charset headers
291       matching those of the original request.</p>
292     
293  
294   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
295 <div class="section">
296 <h2><a name="security" id="security">Security Considerations</a></h2>
297     
298
299     <h3>Local exploits</h3>
300       
301
302       <p>As requests to end-users can be served from the cache, the cache
303       itself can become a target for those wishing to deface or interfere with
304       content. It is important to bear in mind that the cache must at all
305       times be writable by the user which Apache is running as. This is in 
306       stark contrast to the usually recommended situation of maintaining
307       all content unwritable by the Apache user.</p>
308
309       <p>If the Apache user is compromised, for example through a flaw in
310       a CGI process, it is possible that the cache may be targeted. When
311       using <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code>, it is relatively easy to 
312       insert or modify a cached entity.</p>
313
314       <p>This presents a somewhat elevated risk in comparison to the other 
315       types of attack it is possible to make as the Apache user. If you are 
316       using <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> you should bear this in mind - 
317       ensure you upgrade Apache when security upgrades are announced and 
318       run CGI processes as a non-Apache user using <a href="suexec.html">suEXEC</a> if possible.</p>
319
320     
321
322     <h3>Cache Poisoning</h3>
323       
324
325       <p>When running Apache as a caching proxy server, there is also the
326       potential for so-called cache poisoning. Cache Poisoning is a broad 
327       term for attacks in which an attacker causes the proxy server to 
328       retrieve incorrect (and usually undesirable) content from the backend.
329       </p>
330
331       <p>For example if the DNS servers used by your system running Apache
332       are vulnerable to DNS cache poisoning, an attacker may be able to control
333       where Apache connects to when requesting content from the origin server.
334       Another example is so-called HTTP request-smuggling attacks.</p>
335
336       <p>This document is not the correct place for an in-depth discussion
337       of HTTP request smuggling (instead, try your favourite search engine)
338       however it is important to be aware that it is possible to make
339       a series of requests, and to exploit a vulnerability on an origin
340       webserver such that the attacker can entirely control the content
341       retrieved by the proxy.</p>
342     
343   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
344 <div class="section">
345 <h2><a name="filehandle" id="filehandle">File-Handle Caching</a></h2>
346     
347
348     <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code></li><li><code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code></li></ul></td><td><ul><li><code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code></li><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></ul></td></tr></table>
349
350     <p>The act of opening a file can itself be a source of delay, particularly 
351     on network filesystems. By maintaining a cache of open file descriptors
352     for commonly served files, Apache can avoid this delay. Currently Apache
353     provides two different implementations of File-Handle Caching.</p> 
354
355     <h3>CacheFile</h3>
356       
357
358       <p>The most basic form of caching present in Apache is the file-handle
359       caching provided by <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>. Rather than caching 
360       file-contents, this cache maintains a table of open file descriptors. Files 
361       to be cached in this manner are specified in the configuration file using
362       the <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> 
363       directive.</p>
364
365       <p>The 
366       <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> directive 
367       instructs Apache to open the file when Apache is started and to re-use 
368       this file-handle for all subsequent access to this file.</p>
369
370       <div class="example"><pre>CacheFile /usr/local/apache2/htdocs/index.html</pre></div>
371
372       <p>If you intend to cache a large number of files in this manner, you 
373       must ensure that your operating system's limit for the number of open 
374       files is set appropriately.</p>
375
376       <p>Although using <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code>
377       does not cause the file-contents to be cached per-se, it does mean
378       that if the file changes while Apache is running these changes will
379       not be picked up. The file will be consistently served as it was
380       when Apache was started.</p>
381
382       <p>If the file is removed while Apache is running, Apache will continue
383       to maintain an open file descriptor and serve the file as it was when
384       Apache was started. This usually also means that although the file
385       will have been deleted, and not show up on the filesystem, extra free
386       space will not be recovered until Apache is stopped and the file
387       descriptor closed.</p>
388     
389
390     <h3>CacheEnable fd</h3>
391       
392
393       <p><code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code> also provides its own file-handle 
394       caching scheme, which can be enabled via the 
395       <code class="directive"><a href="./mod/mod_cache.html#cacheenable">CacheEnable</a></code> directive.</p>
396
397       <div class="example"><pre>CacheEnable fd /</pre></div>
398
399       <p>As with all of <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> this type of file-handle
400       caching is intelligent, and handles will not be maintained beyond
401       the expiry time of the cached content.</p>
402     
403   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
404 <div class="section">
405 <h2><a name="inmemory" id="inmemory">In-Memory Caching</a></h2>
406     
407
408      <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><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_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></ul></td></tr></table>
409        
410     <p>Serving directly from system memory is universally the fastest method
411     of serving content. Reading files from a disk controller or, even worse,
412     from a remote network is orders of magnitude slower. Disk controllers
413     usually involve physical processes, and network access is limited by
414     your available bandwidth. Memory access on the other hand can take mere
415     nano-seconds.</p>
416
417     <p>System memory isn't cheap though, byte for byte it's by far the most
418     expensive type of storage and it's important to ensure that it is used
419     efficiently. By caching files in memory you decrease the amount of 
420     memory available on the system. As we'll see, in the case of operating
421     system caching, this is not so much of an issue, but when using
422     Apache's own in-memory caching it is important to make sure that you
423     do not allocate too much memory to a cache. Otherwise the system
424     will be forced to swap out memory, which will likely degrade 
425     performance.</p>
426
427     <h3>Operating System Caching</h3>
428       
429
430       <p>Almost all modern operating systems cache file-data in memory managed
431       directly by the kernel. This is a powerful feature, and for the most
432       part operating systems get it right. For example, on Linux, let's look at
433       the difference in the time it takes to read a file for the first time
434       and the second time;</p>
435
436       <div class="example"><pre>
437 colm@coroebus:~$ time cat testfile &gt; /dev/null
438 real    0m0.065s
439 user    0m0.000s
440 sys     0m0.001s
441 colm@coroebus:~$ time cat testfile &gt; /dev/null
442 real    0m0.003s
443 user    0m0.003s
444 sys     0m0.000s</pre></div>
445
446       <p>Even for this small file, there is a huge difference in the amount
447       of time it takes to read the file. This is because the kernel has cached
448       the file contents in memory.</p>
449
450       <p>By ensuring there is "spare" memory on your system, you can ensure 
451       that more and more file-contents will be stored in this cache. This 
452       can be a very efficient means of in-memory caching, and involves no 
453       extra configuration of Apache at all.</p>
454
455       <p>Additionally, because the operating system knows when files are 
456       deleted or modified, it can automatically remove file contents from the 
457       cache when neccessary. This is a big advantage over Apache's in-memory 
458       caching which has no way of knowing when a file has changed.</p>
459     
460
461     <p>Despite the performance and advantages of automatic operating system
462     caching there are some circumstances in which in-memory caching may be 
463     better performed by Apache.</p>
464
465     <p>Firstly, an operating system can only cache files it knows about. If 
466     you are running Apache as a proxy server, the files you are caching are
467     not locally stored but remotely served. If you still want the unbeatable
468     speed of in-memory caching, Apache's own memory caching is needed.</p>
469
470     <h3>MMapStatic Caching</h3>
471       
472
473       <p><code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> provides the 
474       <code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code> directive, which
475       allows you to have Apache map a static file's contents into memory at
476       start time (using the mmap system call). Apache will use the in-memory 
477       contents for all subsequent accesses to this file.</p>
478
479       <div class="example"><pre>MMapStatic /usr/local/apache2/htdocs/index.html</pre></div>
480
481       <p>As with the
482       <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> directive, any
483       changes in these files will not be picked up by Apache after it has
484       started.</p>
485
486       <p> The <code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code> 
487       directive does not keep track of how much memory it allocates, so
488       you must ensure not to over-use the directive. Each Apache child
489       process will replicate this memory, so it is critically important
490       to ensure that the files mapped are not so large as to cause the
491       system to swap memory.</p>
492     
493
494     <h3>mod_mem_cache Caching</h3>
495       
496
497       <p><code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code> provides a HTTP-aware intelligent
498       in-memory cache. It also uses heap memory directly, which means that
499       even if <var>MMap</var> is not supported on your system, 
500       <code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code> may still be able to perform caching.</p>
501
502       <p>Caching of this type is enabled via;</p>
503
504       <div class="example"><pre>
505 # Enable memory caching
506 CacheEnable mem /
507
508 # Limit the size of the cache to 1 Megabyte
509 MCacheSize 1024</pre></div>
510     
511   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
512 <div class="section">
513 <h2><a name="disk" id="disk">Disk-based Caching</a></h2>
514     
515
516      <table class="related"><tr><th>Related Modules</th><th>Related Directives</th></tr><tr><td><ul><li><code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_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></ul></td></tr></table>
517        
518     <p><code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> provides a disk-based caching mechanism 
519     for <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>. As with <code class="module"><a href="./mod/mod_mem_cache.html">mod_mem_cache</a></code>
520     this cache is intelligent and content will be served from the cache only
521     as long as it is considered valid.</p>
522
523     <p>Typically the module will be configured as so;</p>
524
525     <div class="example"><pre>
526 CacheRoot   /var/cache/apache/
527 CacheEnable disk /
528 CacheDirLevels 2
529 CacheDirLength 1</pre></div>
530
531     <p>Importantly, as the cached files are locally stored, operating system
532     in-memory caching will typically be applied to their access also. So 
533     although the files are stored on disk, if they are frequently accessed 
534     it is likely the operating system will ensure that they are actually
535     served from memory.</p>
536
537     <h3>Understanding the Cache-Store</h3>
538       
539
540       <p>To store items in the cache, <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> creates
541       a 22 character hash of the url being requested. Thie hash incorporates
542       the hostname, protocol, port, path and any CGI arguments to the URL,
543       to ensure that multiple URLs do not collide.</p>
544
545       <p>Each character may be any one of 64-different characters, which mean
546       that overall there are 22^64 possible hashes. For example, a URL might
547       be hashed to <code>xyTGxSMO2b68mBCykqkp1w</code>. This hash is used
548       as a prefix for the naming of the files specific to that url within
549       the cache, however first it is split up into directories as per
550       the <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code> and
551       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code> 
552       directives.</p>
553
554       <p><code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code> 
555       specifies how many levels of subdirectory there should be, and
556       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
557       specifies how many characters should be in each directory. With
558       the example settings given above, the hash would be turned into
559       a filename prefix as 
560       <code>/var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w</code>.</p>
561
562       <p>The overall aim of this technique is to reduce the number of
563       subdirectories or files that may be in a particular directory,
564       as most file-systems slow down as this number increases. With
565       setting of "1" for 
566       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
567       there can at most be 64 subdirectories at any particular level. 
568       With a setting of 2 there can be 64 * 64 subdirectories, and so on.
569       Unless you have a good reason not to, using a setting of "1"
570       for <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
571       is recommended.</p>
572
573       <p>Setting 
574       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code>
575       depends on how many files you anticipate to store in the cache.
576       With the setting of "2" used in the above example, a grand
577       total of 4096 subdirectories can ultimately be created. With
578       1 million files cached, this works out at roughly 245 cached 
579       urls per directory.</p>
580
581       <p>Each url uses at least two files in the cache-store. Typically
582       there is a ".header" file, which includes meta-information about 
583       the url, such as when it is due to expire and a ".data" file
584       which is a verbatim copy of the content to be served.</p>
585
586       <p>In the case of a content negotiated via the "Vary" header, a
587       ".vary" directory will be created for the url in question. This 
588       directory will have multiple ".data" files corresponding to the
589       differently negotiated content.</p>
590     
591
592     <h3>Maintaining the Disk Cache</h3>
593       
594     
595       <p>Although <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> will remove cached content
596       as it is expired, it does not maintain any information on the total
597       size of the cache or how little free space may be left.</p>
598
599       <p>Instead, provided with Apache is the <a href="programs/htcacheclean.html">htcacheclean</a> tool which, as the name
600       suggests, allows you to clean the cache periodically. Determining 
601       how frequently to run <a href="programs/htcacheclean.html">htcacheclean</a> and what target size to 
602       use for the cache is somewhat complex and trial and error may be needed to
603       select optimal values.</p>
604
605       <p><a href="programs/htcacheclean.html">htcacheclean</a> has two modes of 
606       operation. It can be run as persistent daemon, or periodically from 
607       cron. <a href="programs/htcacheclean.html">htcacheclean</a> can take up to an hour 
608       or more to process very large (tens of gigabytes) caches and if you are 
609       running it from cron it is recommended that you determine how long a typical 
610       run takes, to avoid running more than one instance at a time.</p>
611
612       <p class="figure">
613       <img src="images/caching_fig1.gif" alt="" width="600" height="406" /><br />
614       <a id="figure1" name="figure1"><dfn>Figure 1</dfn></a>: Typical
615       cache growth / clean sequence.</p>
616
617       <p>Because <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> does not itself pay attention
618       to how much space is used you should ensure that 
619       <a href="programs/htcacheclean.html">htcacheclean</a> is configured to 
620       leave enough "grow room" following a clean.</p>
621     
622
623   </div></div>
624 <div class="bottomlang">
625 <p><span>Available Languages: </span><a href="./en/caching.html" title="English">&nbsp;en&nbsp;</a></p>
626 </div><div id="footer">
627 <p class="apache">Copyright 1995-2005 The Apache Software Foundation or its licensors, as applicable.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
628 <p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="./faq/">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p></div>
629 </body></html>