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