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