]> granicus.if.org Git - apache/blob - docs/manual/caching.html.en
update xforms
[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 Apache'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 honour 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 Apache 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#mmapstatic">MMapStatic</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#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>
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     Apache 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       Apache 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 Apache 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 Apache 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 Apache 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 includes an
236         "Expires:" header, as per RFC2616 section 13.9.</li>
237
238         <li>If the response has a status of 200 (OK), the response must
239         also include at least one of the "Etag", "Last-Modified" or
240         the "Expires" headers, unless the 
241         <code class="directive"><a href="./mod/mod_cache.html#cacheignorenolastmod">CacheIgnoreNoLastMod</a></code> 
242         directive has been used to require otherwise.</li>
243
244         <li>If the response includes the "private" option in a "Cache-Control:"
245         header, it will not be stored unless the 
246         <code class="directive"><a href="./mod/mod_cache.html#cachestoreprivate">CacheStorePrivate</a></code> has been
247         used to require otherwise.</li>
248
249         <li>Likewise, if the response includes the "no-store" option in a 
250         "Cache-Control:" header, it will not be stored unless the 
251         <code class="directive"><a href="./mod/mod_cache.html#cachestorenostore">CacheStoreNoStore</a></code> has been
252         used.</li>
253
254         <li>A response will not be stored if it includes a "Vary:" header
255         containing the match-all "*".</li>
256       </ol>
257     
258
259     <h3>What Should Not be Cached?</h3>
260       
261     
262       <p>In short, any content which is highly time-sensitive, or which varies
263       depending on the particulars of the request that are not covered by
264       HTTP negotiation, should not be cached.</p>
265
266       <p>If you have dynamic content which changes depending on the IP address
267       of the requester, or changes every 5 minutes, it should almost certainly
268       not be cached.</p>
269
270       <p>If on the other hand, the content served differs depending on the
271       values of various HTTP headers, it is possible that it might be possible
272       to cache it intelligently through the use of a "Vary" header.</p>
273     
274
275     <h3>Variable/Negotiated Content</h3>
276       
277
278       <p>If a response with a "Vary" header is received by 
279       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> when requesting content by the backend it
280       will attempt to handle it intelligently. If possible, 
281       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will detect the headers attributed in the
282       "Vary" response in future requests and serve the correct cached 
283       response.</p>
284
285       <p>If for example, a response is received with a vary header such as;</p>
286
287       <div class="example"><p><code>
288 Vary: negotiate,accept-language,accept-charset
289       </code></p></div>
290
291       <p><code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> will only serve the cached content to
292       requesters with matching accept-language and accept-charset headers
293       matching those of the original request.</p>
294     
295  
296   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
297 <div class="section">
298 <h2><a name="security" id="security">Security Considerations</a></h2>
299     
300
301     <h3>Authorization and Access Control</h3>
302       
303
304       <p>Using <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> is very much like having a built
305       in reverse-proxy. Requests will be served by the caching module unless
306       it determines that the backend should be queried. When caching local
307       resources, this drastically changes the security model of Apache.</p>
308
309       <p>As traversing a filesystem hierarchy to examine potential
310       <code>.htaccess</code> files would be a very expensive operation,
311       partially defeating the point of caching (to speed up requests),
312       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> makes no decision about whether a cached
313       entity is authorised for serving. In other words; if
314       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> has cached some content, it will be served
315       from the cache as long as that content has not expired.</p>
316
317       <p>If, for example, your configuration permits access to a resource by IP
318       address you should ensure that this content is not cached. You can do this
319       by using the <code class="directive"><a href="./mod/mod_cache.html#cachedisable">CacheDisable</a></code>
320       directive, or <code class="module"><a href="./mod/mod_expires.html">mod_expires</a></code>. Left unchecked,
321       <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code> - very much like a reverse proxy - would cache
322       the content when served and then serve it to any client, on any IP
323       address.</p>        
324     
325
326     <h3>Local exploits</h3>
327       
328
329       <p>As requests to end-users can be served from the cache, the cache
330       itself can become a target for those wishing to deface or interfere with
331       content. It is important to bear in mind that the cache must at all
332       times be writable by the user which Apache is running as. This is in 
333       stark contrast to the usually recommended situation of maintaining
334       all content unwritable by the Apache user.</p>
335
336       <p>If the Apache user is compromised, for example through a flaw in
337       a CGI process, it is possible that the cache may be targeted. When
338       using <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code>, it is relatively easy to 
339       insert or modify a cached entity.</p>
340
341       <p>This presents a somewhat elevated risk in comparison to the other 
342       types of attack it is possible to make as the Apache user. If you are 
343       using <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> you should bear this in mind - 
344       ensure you upgrade Apache when security upgrades are announced and 
345       run CGI processes as a non-Apache user using <a href="suexec.html">suEXEC</a> if possible.</p>
346
347     
348
349     <h3>Cache Poisoning</h3>
350       
351
352       <p>When running Apache as a caching proxy server, there is also the
353       potential for so-called cache poisoning. Cache Poisoning is a broad 
354       term for attacks in which an attacker causes the proxy server to 
355       retrieve incorrect (and usually undesirable) content from the backend.
356       </p>
357
358       <p>For example if the DNS servers used by your system running Apache
359       are vulnerable to DNS cache poisoning, an attacker may be able to control
360       where Apache connects to when requesting content from the origin server.
361       Another example is so-called HTTP request-smuggling attacks.</p>
362
363       <p>This document is not the correct place for an in-depth discussion
364       of HTTP request smuggling (instead, try your favourite search engine)
365       however it is important to be aware that it is possible to make
366       a series of requests, and to exploit a vulnerability on an origin
367       webserver such that the attacker can entirely control the content
368       retrieved by the proxy.</p>
369     
370   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
371 <div class="section">
372 <h2><a name="filehandle" id="filehandle">File-Handle Caching</a></h2>
373     
374
375     <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>
376
377     <p>The act of opening a file can itself be a source of delay, particularly 
378     on network filesystems. By maintaining a cache of open file descriptors
379     for commonly served files, Apache can avoid this delay. Currently Apache
380     provides one implementation of File-Handle Caching.</p> 
381
382     <h3>CacheFile</h3>
383       
384
385       <p>The most basic form of caching present in Apache is the file-handle
386       caching provided by <code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code>. Rather than caching 
387       file-contents, this cache maintains a table of open file descriptors. Files 
388       to be cached in this manner are specified in the configuration file using
389       the <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> 
390       directive.</p>
391
392       <p>The 
393       <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> directive 
394       instructs Apache to open the file when Apache is started and to re-use 
395       this file-handle for all subsequent access to this file.</p>
396
397       <div class="example"><pre>CacheFile /usr/local/apache2/htdocs/index.html</pre></div>
398
399       <p>If you intend to cache a large number of files in this manner, you 
400       must ensure that your operating system's limit for the number of open 
401       files is set appropriately.</p>
402
403       <p>Although using <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code>
404       does not cause the file-contents to be cached per-se, it does mean
405       that if the file changes while Apache is running these changes will
406       not be picked up. The file will be consistently served as it was
407       when Apache was started.</p>
408
409       <p>If the file is removed while Apache is running, Apache will continue
410       to maintain an open file descriptor and serve the file as it was when
411       Apache was started. This usually also means that although the file
412       will have been deleted, and not show up on the filesystem, extra free
413       space will not be recovered until Apache is stopped and the file
414       descriptor closed.</p>
415     
416
417   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
418 <div class="section">
419 <h2><a name="inmemory" id="inmemory">In-Memory Caching</a></h2>
420     
421
422      <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#mmapstatic">MMapStatic</a></code></li></ul></td></tr></table>
423        
424     <p>Serving directly from system memory is universally the fastest method
425     of serving content. Reading files from a disk controller or, even worse,
426     from a remote network is orders of magnitude slower. Disk controllers
427     usually involve physical processes, and network access is limited by
428     your available bandwidth. Memory access on the other hand can take mere
429     nano-seconds.</p>
430
431     <p>System memory isn't cheap though, byte for byte it's by far the most
432     expensive type of storage and it's important to ensure that it is used
433     efficiently. By caching files in memory you decrease the amount of 
434     memory available on the system. As we'll see, in the case of operating
435     system caching, this is not so much of an issue, but when using
436     Apache's own in-memory caching it is important to make sure that you
437     do not allocate too much memory to a cache. Otherwise the system
438     will be forced to swap out memory, which will likely degrade 
439     performance.</p>
440
441     <h3>Operating System Caching</h3>
442       
443
444       <p>Almost all modern operating systems cache file-data in memory managed
445       directly by the kernel. This is a powerful feature, and for the most
446       part operating systems get it right. For example, on Linux, let's look at
447       the difference in the time it takes to read a file for the first time
448       and the second time;</p>
449
450       <div class="example"><pre>
451 colm@coroebus:~$ time cat testfile &gt; /dev/null
452 real    0m0.065s
453 user    0m0.000s
454 sys     0m0.001s
455 colm@coroebus:~$ time cat testfile &gt; /dev/null
456 real    0m0.003s
457 user    0m0.003s
458 sys     0m0.000s</pre></div>
459
460       <p>Even for this small file, there is a huge difference in the amount
461       of time it takes to read the file. This is because the kernel has cached
462       the file contents in memory.</p>
463
464       <p>By ensuring there is "spare" memory on your system, you can ensure 
465       that more and more file-contents will be stored in this cache. This 
466       can be a very efficient means of in-memory caching, and involves no 
467       extra configuration of Apache at all.</p>
468
469       <p>Additionally, because the operating system knows when files are 
470       deleted or modified, it can automatically remove file contents from the 
471       cache when neccessary. This is a big advantage over Apache's in-memory 
472       caching which has no way of knowing when a file has changed.</p>
473     
474
475     <p>Despite the performance and advantages of automatic operating system
476     caching there are some circumstances in which in-memory caching may be 
477     better performed by Apache.</p>
478
479     <h3>MMapStatic Caching</h3>
480       
481
482       <p><code class="module"><a href="./mod/mod_file_cache.html">mod_file_cache</a></code> provides the 
483       <code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code> directive, which
484       allows you to have Apache map a static file's contents into memory at
485       start time (using the mmap system call). Apache will use the in-memory 
486       contents for all subsequent accesses to this file.</p>
487
488       <div class="example"><pre>MMapStatic /usr/local/apache2/htdocs/index.html</pre></div>
489
490       <p>As with the
491       <code class="directive"><a href="./mod/mod_file_cache.html#cachefile">CacheFile</a></code> directive, any
492       changes in these files will not be picked up by Apache after it has
493       started.</p>
494
495       <p> The <code class="directive"><a href="./mod/mod_file_cache.html#mmapstatic">MMapStatic</a></code> 
496       directive does not keep track of how much memory it allocates, so
497       you must ensure not to over-use the directive. Each Apache child
498       process will replicate this memory, so it is critically important
499       to ensure that the files mapped are not so large as to cause the
500       system to swap memory.</p>
501     
502   </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
503 <div class="section">
504 <h2><a name="disk" id="disk">Disk-based Caching</a></h2>
505     
506
507      <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>
508        
509     <p><code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> provides a disk-based caching mechanism 
510     for <code class="module"><a href="./mod/mod_cache.html">mod_cache</a></code>. This cache is intelligent and content will
511     be served from the cache only as long as it is considered valid.</p>
512
513     <p>Typically the module will be configured as so;</p>
514
515     <div class="example"><pre>
516 CacheRoot   /var/cache/apache/
517 CacheEnable disk /
518 CacheDirLevels 2
519 CacheDirLength 1</pre></div>
520
521     <p>Importantly, as the cached files are locally stored, operating system
522     in-memory caching will typically be applied to their access also. So 
523     although the files are stored on disk, if they are frequently accessed 
524     it is likely the operating system will ensure that they are actually
525     served from memory.</p>
526
527     <h3>Understanding the Cache-Store</h3>
528       
529
530       <p>To store items in the cache, <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> creates
531       a 22 character hash of the URL being requested. This hash incorporates
532       the hostname, protocol, port, path and any CGI arguments to the URL,
533       to ensure that multiple URLs do not collide.</p>
534
535       <p>Each character may be any one of 64-different characters, which mean
536       that overall there are 64^22 possible hashes. For example, a URL might
537       be hashed to <code>xyTGxSMO2b68mBCykqkp1w</code>. This hash is used
538       as a prefix for the naming of the files specific to that URL within
539       the cache, however first it is split up into directories as per
540       the <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code> and
541       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code> 
542       directives.</p>
543
544       <p><code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code> 
545       specifies how many levels of subdirectory there should be, and
546       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
547       specifies how many characters should be in each directory. With
548       the example settings given above, the hash would be turned into
549       a filename prefix as 
550       <code>/var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w</code>.</p>
551
552       <p>The overall aim of this technique is to reduce the number of
553       subdirectories or files that may be in a particular directory,
554       as most file-systems slow down as this number increases. With
555       setting of "1" for 
556       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
557       there can at most be 64 subdirectories at any particular level. 
558       With a setting of 2 there can be 64 * 64 subdirectories, and so on.
559       Unless you have a good reason not to, using a setting of "1"
560       for <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlength">CacheDirLength</a></code>
561       is recommended.</p>
562
563       <p>Setting 
564       <code class="directive"><a href="./mod/mod_disk_cache.html#cachedirlevels">CacheDirLevels</a></code>
565       depends on how many files you anticipate to store in the cache.
566       With the setting of "2" used in the above example, a grand
567       total of 4096 subdirectories can ultimately be created. With
568       1 million files cached, this works out at roughly 245 cached 
569       URLs per directory.</p>
570
571       <p>Each URL uses at least two files in the cache-store. Typically
572       there is a ".header" file, which includes meta-information about 
573       the URL, such as when it is due to expire and a ".data" file
574       which is a verbatim copy of the content to be served.</p>
575
576       <p>In the case of a content negotiated via the "Vary" header, a
577       ".vary" directory will be created for the URL in question. This 
578       directory will have multiple ".data" files corresponding to the
579       differently negotiated content.</p>
580     
581
582     <h3>Maintaining the Disk Cache</h3>
583       
584     
585       <p>Although <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> will remove cached content
586       as it is expired, it does not maintain any information on the total
587       size of the cache or how little free space may be left.</p>
588
589       <p>Instead, provided with Apache is the <a href="programs/htcacheclean.html">htcacheclean</a> tool which, as the name
590       suggests, allows you to clean the cache periodically. Determining 
591       how frequently to run <a href="programs/htcacheclean.html">htcacheclean</a> and what target size to 
592       use for the cache is somewhat complex and trial and error may be needed to
593       select optimal values.</p>
594
595       <p><a href="programs/htcacheclean.html">htcacheclean</a> has two modes of 
596       operation. It can be run as persistent daemon, or periodically from 
597       cron. <a href="programs/htcacheclean.html">htcacheclean</a> can take up to an hour 
598       or more to process very large (tens of gigabytes) caches and if you are 
599       running it from cron it is recommended that you determine how long a typical 
600       run takes, to avoid running more than one instance at a time.</p>
601
602       <p class="figure">
603       <img src="images/caching_fig1.gif" alt="" width="600" height="406" /><br />
604       <a id="figure1" name="figure1"><dfn>Figure 1</dfn></a>: Typical
605       cache growth / clean sequence.</p>
606
607       <p>Because <code class="module"><a href="./mod/mod_disk_cache.html">mod_disk_cache</a></code> does not itself pay attention
608       to how much space is used you should ensure that 
609       <a href="programs/htcacheclean.html">htcacheclean</a> is configured to 
610       leave enough "grow room" following a clean.</p>
611     
612
613   </div></div>
614 <div class="bottomlang">
615 <p><span>Available Languages: </span><a href="./en/caching.html" title="English">&nbsp;en&nbsp;</a> |
616 <a href="./fr/caching.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
617 <a href="./tr/caching.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
618 </div><div id="footer">
619 <p class="apache">Copyright 2008 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>
620 <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>
621 </body></html>