From dc85b57d4f8c59ea8dc241d7acdec22a9d3773a3 Mon Sep 17 00:00:00 2001 From: Colm MacCarthaigh Date: Tue, 23 Aug 2005 20:19:42 +0000 Subject: [PATCH] A first take at a User-Guide for caching. Covers mod_cache and mod_file_cache, and tries to place the caching modules in context. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@239459 13f79535-47bb-0310-9956-ffa450edef68 --- docs/manual/caching.xml | 728 ++++++++++++++++++++++++++++ docs/manual/images/caching_fig1.gif | Bin 0 -> 16515 bytes docs/manual/images/caching_fig1.png | Bin 0 -> 14262 bytes docs/manual/index.xml | 1 + 4 files changed, 729 insertions(+) create mode 100644 docs/manual/caching.xml create mode 100644 docs/manual/images/caching_fig1.gif create mode 100644 docs/manual/images/caching_fig1.png diff --git a/docs/manual/caching.xml b/docs/manual/caching.xml new file mode 100644 index 00000000000..9115cdcd509 --- /dev/null +++ b/docs/manual/caching.xml @@ -0,0 +1,728 @@ + + + + + + + + + + Caching Guide + + +

This document supplements the mod_cache, + mod_disk_cache, mod_mem_cache, + mod_file_cache and htcacheclean reference documentation. + It describes how to use Apache's caching features to accelerate web and + proxy serving, while avoiding common problems and misconfigurations.

+
+ +
+ Introduction + +

As of Apache HTTP server version 2.2 mod_cache and + mod_file_cache are no longer marked experimental and are + considered suitable for production use. These caching architectures provide + a powerful means to accelerate HTTP handling, both as a webserver and as a + proxy.

+ +

mod_cache and its provider modules + mod_mem_cache and mod_disk_cache + provide intelligent, HTTP-aware caching. The content itself is stored + in the cache, and mod_cache aims to honour all of the various HTTP + headers and options that control the cachability of content. It can + handle both local and proxied content. mod_cache + is aimed at both simple and complex caching configurations, where + you are dealing with proxied content, dynamic local content or + have a need to speed up access to local files which change with + time.

+ +

mod_file_cache on the other hand presents a more + basic, but sometimes useful, form of caching. Rather than maintain + the complexity of actively ensuring the cachability of URLs, + mod_file_cache offers file-handle and memory-mapping + tricks to keep a cache of files as they were when Apache was last + started. As such mod_file_cache is aimed at improving + the access time to local static files which do not change very + often.

+ +

As mod_file_cache presents a relatively simple + caching implementation, apart from the specific sections on CacheFile and MMapStatic, the explanations + in this guide cover the mod_cache caching + architecture.

+ +

To get the most from this document, you should be familiar with + the basics of HTTP, and have read the Users' Guides to + Mapping URLs to the Filesystem and + Content negotiation.

+ +
+ +
+ + Caching Overview + + + + mod_cache + mod_mem_cache + mod_disk_cache + mod_file_cache + + + CacheEnable + CacheDisable + MMapStatic + CacheFile + CacheFile + UseCanonicalName + CacheNegotiatedDocs + + + +

There are two main stages in mod_cache which can + occur in the lifetime of a request. First, mod_cache + is a URL mapping module, which means that if a URL has been cached, + and the cached version of that URL has not expired, the request will + be served directly by mod_cache.

+ +

This means that any other stages with might ordinarily happen in the + process of serving a request, for example being handled by + mod_proxy, or mod_rewrite won't happen. + But then this is the point of caching content in the first place.

+ +

If the URL is not found within the cache, mod_cache + will add a filter to the request handling. After + Apache has located the content by the usual means, the filter will be run + as the content is served. If the content is determined to be cacheable, + the content will be saved to the cache for future serving.

+ +

If the URL is found within the cache, but also found to have expired, + the filter is added anyway, but mod_cache will create + a conditional request to the backend, to determine if the cached version + is still current. If the cached version is still current, its + meta-information will be updated and the request will be served from the + cache. If the cached version is no longer current, the cached version + will be deleted and the filter will save the updated content to the cache + as it is served.

+ +
+ Improving Cache Hits + + + +

When caching locally generated content, ensuring that + UseCanonicalName is set to + On can dramatically improve the ratio of cache hits. This + is because the hostname of the virtual-host serving the content forms + a part of the cache key. With the setting set to On + virtual-hosts with multiple server names or aliases will not produce + differently cached entities, and instead content will be cached as + per the canonical hostname.

+ +

Because caching is performed within the URL to filename translation + phase, cached documents will only be served in response to URL requests. + Ordinarily this is of little consequence, but there is one circumstance + in which it matters: If you are using Server + Side Includes;

+ + +
+<!-- The following include can be cached -->
+<!--#include virtual="/footer.html" --> 
+
+<!-- The following include can not be cached -->
+<!--#include file="/path/to/footer.html" -->
+
+ +

If you are using Server Side Includes, and want the benefit of speedy + serves from the cache, you should use virtual include + types.

+
+
+ +
+ Expiry Periods + + +

The default expiry period for cached entities is one hour, however + this can be easily over-ridden by using the CacheDefaultExpire directive. This + default is only used when the original source of the content does not + specify an expire time or time of last modification.

+ +

If a response does not include an Expires header but does + include a Last-Modified header, mod_cache + can infer an expiry period based on the use of the CacheLastModifiedFactor directive.

+ +

For local content, mod_expires may be used to + fine-tune the expiry period.

+ +

The maximum expiry period may also be controlled by using the + CacheMaxExpire.

+
+ +
+ +
+ A Brief Guide to Conditional Requests + + +

When content expires from the cache and is re-requested from the + backend or content provider, rather than pass on the original request, + Aoache will use a conditional request instead.

+ +

HTTP offers a number of headers which allow a client, or cache + to discern between different versions of the same content. For + example if a resource was served with an "Etag:" header, it is + possible to make a conditional request with an "If-Match:" + header. If a resource was served with a "Last-Modified:" header + it is possible to make a conditional request with an + "If-Modified-Since:" header, and so on.

+ +

When such a conditional request is made, the response differs + depending on whether the content matches the conditions. If a request is + made with an "If-Modified-Since:" header, and the content has not been + modified since the time indicated in the request then a terse "304 Not + Modified" response is issued.

+ +

If the content has changed, then it is served as if the request were + not conditional to begin with.

+ +

The benefits of conditional requests in relation to caching are + twofold. Firstly, when making such a request to the backend, if the + content from the backend matches the content in the store, this can be + determined easily and without the overhead of transferring the entire + resource.

+ +

Secondly, conditional requests are usually less strenuous on the + backend. For static files, typically all that is involved is a call + to stat() or similar system call, to see if the file has + changed in size or modification time. As such, even if Apache is + caching local content, even expired content may still be served faster + from the cache if it has not changed. As long as reading from the cache + store is faster than reading from the backend (e.g. an in-memory cache + compared to reading from disk).

+
+
+ +
+ What Can be Cached? + + +

As mentioned already, the two styles of caching in Apache work + differently, mod_file_cache caching maintains file + contents as they were when Apache was started. When a request is + made for a file that is cached by this module, it is intercepted + and the cached file is served.

+ +

mod_cache caching on the other hand is more + complex. When serving a request, if it has not been cached + previously, the caching module will determine if the content + is cacheable. The conditions for determining cachability of + a response are;

+ +
    +
  1. Caching must be enabled for this URL. See the CacheEnable and CacheDisable directives.
  2. + +
  3. The response must have a HTTP status code of 200, 203, 300, 301 or + 410.
  4. + +
  5. The request must be a HTTP GET request.
  6. + +
  7. If the request contains an "Authorization:" header, the response + will not be cached.
  8. + +
  9. If the response contains an "Authorization:" header, it must + also contain an "s-maxage", "must-revalidate" or "public" option + in the "Cache-Control:" header.
  10. + +
  11. If the URL included a query string (e.g. from a HTML form GET + method) it will not be cached unless the response includes an + "Expires:" header, as per RFC2616 section 13.9.
  12. + +
  13. If the response has a status of 200 (OK), the response must + also include at least one of the "Etag", "Last-Modified" or + the "Expires" headers, unless the + CacheIgnoreNoLastMod + directive has been used to require otherwise.
  14. + +
  15. If the response includes the "private" option in a "Cache-Control:" + header, it will not be stored unless the + CacheStorePrivate has been + used to require otherwise.
  16. + +
  17. Likewise, if the response includes the "no-store" option in a + "Cache-Control:" header, it will not be stored unless the + CacheStoreNoStore has been + used.
  18. + +
  19. A response will not be stored if it includes a "Vary:" header + containing the match-all "*".
  20. +
+ +
+
+ +
+ What Should Not be Cached? + + + +

In short, any content which is highly time-sensitive, or which varies + depending on the particulars of the request that are not covered by + HTTP negotiation, should not be cached.

+ +

If you have dynamic content which changes depending on the IP address + of the requester, or changes every 5 minutes, it should almost certainly + not be cached.

+ +

If on the other hand, the content served differs depending on the + values of various HTTP headers, it is possible that it might be possible + to cache it intelligently through the use of a "Vary" header.

+
+
+ +
+ Variable/Negotiated Content + + +

If a response with a "Vary" header is received by + mod_cache when requesting content by the backend it + will attempt to handle it intelligently. If possible, + mod_cache will detect the headers attributed in the + "Vary" response in future requests and serve the correct cached + response.

+ +

If for example, a response is received with a vary header such as;

+ + +Vary: negotiate,accept-language,accept-charset + + +

mod_cache will only serve the cached content to + requesters with matching accept-language and accept-charset headers + matching those of the original request.

+
+
+ +
+ +
+ Security Considerations + +
+ Local exploits + + +

As requests to end-users can be served from the cache, the cache + itself can become a target for those wishing to deface or interfere with + content. It is important to bear in mind that the cache must at all + times be writable by the user which Apache is running as. This is in + stark contrast to the usually recommended situation of maintaining + all content unwritable by the Apache user.

+ +

If the Apache user is compromised, for example through a flaw in + a CGI process, it is possible that the cache may be targeted. When + using mod_disk_cache, it is relatively easy to + insert or modify a cached entity.

+ +

This presents a somewhat elevated risk in comparison to the other + types of attack it is possible to make as the Apache user. If you are + using mod_disk_cache you should bear this in mind - + ensure you upgrade Apache when security upgrades are announced and + run CGI processes as a non-Apache user using suEXEC if possible.

+
+ +
+ +
+ Cache Poisoning + + + +

When running Apache as a caching proxy server, there is also the + potential for so-called cache poisoning. Cache Poisoning is a broad + term for attacks in which an attacker causes the proxy server to + retrieve incorrect (and usually undesirable) content from the backend. +

+ +

For example if the DNS servers used by your system running Apache + are vulnerable to DNS cache poisoning, an attacker may be able to control + where Apache connects to when requesting content from the origin server. + Another example is so-called HTTP request-smuggling attacks.

+ +

This document is not the correct place for an in-depth discussion + of HTTP request smuggling (instead, try your favourite search engine) + however it is important to be aware that it is possible to make + a series of requests, and to exploit a vulnerability on an origin + webserver such that the attacker can entirely control the content + retrieved by the proxy.

+
+
+
+ +
+ File-Handle Caching + + + + mod_file_cache + mod_mem_cache + + + CacheFile + CacheEnable + CacheDisable + + + +

The act of opening a file can itself be a source of delay, particularly + on network filesystems. By maintaining a cache of open file descriptors + for commonly served files, Apache can avoid this delay. Currently Apache + provides two different implementations of File-Handle Caching.

+ +
+ CacheFile + + +

The most basic form of caching present in Apache is the file-handle + caching provided by mod_file_cache. Rather than caching + file-contents, this cache maintains a table of open file descriptors. Files + to be cached in this manner are specified in the configuration file using + the CacheFile + directive.

+ +

The + CacheFile directive + instructs Apache to open the file when Apache is started and to re-use + this file-handle for all subsequent access to this file.

+ + +
CacheFile /usr/local/apache2/htdocs/index.html
+
+ +

If you intend to cache a large number of files in this manner, you + must ensure that your operating system's limit for the number of open + files is set appropriately.

+ +

Although using CacheFile + does not cause the file-contents to be cached per-se, it does mean + that if the file changes while Apache is running these changes will + not be picked up. The file will be consistently served as it was + when Apache was started.

+ +

If the file is removed while Apache is running, Apache will continue + to maintain an open file descriptor and serve the file as it was when + Apache was started. This usually also means that although the file + will have been deleted, and not show up on the filesystem, extra free + space will not be recovered until Apache is stopped and the file + descriptor closed.

+
+
+ +
+ CacheEnable fd + + +

mod_mem_cache also provides its own file-handle + caching scheme, which can be enabled via the + CacheEnable directive.

+ + +
CacheEnable fd /
+
+ +

As with all of mod_cache this type of file-handle + caching is intelligent, and handles will not be maintained beyond + the expiry time of the cached content.

+ +
+
+
+ +
+ In-Memory Caching + + + + mod_mem_cache + mod_file_cache + + + CacheEnable + CacheDisable + MMapStatic + + + +

Serving directly from system memory is universally the fastest method + of serving content. Reading files from a disk controller or, even worse, + from a remote network is orders of magnitude slower. Disk controllers + usually involve physical processes, and network access is limited by + your available bandwidth. Memory access on the other hand can take mere + nano-seconds.

+ +

System memory isn't cheap though, byte for byte it's by far the most + expensive type of storage and it's important to ensure that it is used + efficiently. By caching files in memory you decrease the amount of + memory available on the system. As we'll see, in the case of operating + system caching, this is not so much of an issue, but when using + Apache's own in-memory caching it is important to make sure that you + do not allocate too much memory to a cache. Otherwise the system + will be forced to swap out memory, which will likely degrade + performance.

+ +
+ Operating System Caching + + +

Almost all modern operating systems cache file-data in memory managed + directly by the kernel. This is a powerful feature, and for the most + part operating systems get it right. For example, on Linux, let's look at + the difference in the time it takes to read a file for the first time + and the second time;

+ +
+colm@coroebus:~$ time cat testfile > /dev/null
+real    0m0.065s
+user    0m0.000s
+sys     0m0.001s
+colm@coroebus:~$ time cat testfile > /dev/null
+real    0m0.003s
+user    0m0.003s
+sys     0m0.000s
+
+ +

Even for this small file, there is a huge difference in the amount + of time it takes to read the file. This is because the kernel has cached + the file contents in memory.

+ +

By ensuring there is "spare" memory on your system, you can ensure + that more and more file-contents will be stored in this cache. This + can be a very efficient means of in-memory caching, and involves no + extra configuration of Apache at all.

+ +

Additionally, because the operating system knows when files are + deleted or modified, it can automatically remove file contents from the + cache when neccessary. This is a big advantage over Apache's in-memory + caching which has no way of knowing when a file has changed.

+
+
+ +

Despite the performance and advantages of automatic operating system + caching there are some circumstances in which in-memory caching may be + better performed by Apache.

+ +

Firstly, an operating system can only cache files it knows about. If + you are running Apache as a proxy server, the files you are caching are + not locally stored but remotely served. If you still want the unbeatable + speed of in-memory caching, Apache's own memory caching is needed.

+ +
+ MMapStatic Caching + + +

mod_file_cache provides the + MMapStatic directive, which + allows you to have Apache map a static file's contents into memory at + start time (using the mmap system call). Apache will use the in-memory + contents for all subsequent accesses to this file.

+ + +
MMapStatic /usr/local/apache2/htdocs/index.html
+
+ +

As with the + CacheFile directive, any + changes in these files will not be picked up by Apache after it has + started.

+ +

The MMapStatic + directive does not keep track of how much memory it allocates, so + you must ensure not to over-use the directive. Each Apache child + process will replicate this memory, so it is critically important + to ensure that the files mapped are not so large as to cause the + system to swap memory.

+
+ +
+ +
+ mod_mem_cache Caching + + +

mod_mem_cache provides a HTTP-aware intelligent + in-memory cache. It also uses heap memory directly, which means that + even if MMap is not supported on your system, + mod_mem_cache may still be able to perform caching.

+ +

Caching of this type is enabled via;

+ +
+# Enable memory caching
+CacheEnable mem /
+
+# Limit the size of the cache to 1 Megabyte
+MCacheSize 1024
+
+ +
+ +
+
+ +
+ Disk-based Caching + + + + mod_disk_cache + + + CacheEnable + CacheDisable + + + +

mod_disk_cache provides a disk-based caching mechanism + for mod_cache. As with mod_mem_cache + this cache is intelligent and content will be served from the cache only + as long as it is considered valid.

+ +

Typically the module will be configured as so;

+ + +
+CacheRoot   /var/cache/apache/
+CacheEnable disk /
+CacheDirLevels 2
+CacheDirLength 1
+
+ +

Importantly, as the cached files are locally stored, operating system + in-memory caching will typically be applied to their access also. So + although the files are stored on disk, if they are frequently accessed + it is likely the operating system will ensure that they are actually + served from memory.

+ +
+ Understanding the Cache-Store + + +

To store items in the cache, mod_disk_cache creates + a 22 character hash of the url being requested. Thie hash incorporates + the hostname, protocol, port, path and any CGI arguments to the URL, + to ensure that multiple URLs do not collide.

+ +

Each character may be any one of 64-different characters, which mean + that overall there are 22^64 possible hashes. For example, a URL might + be hashed to xyTGxSMO2b68mBCykqkp1w. This hash is used + as a prefix for the naming of the files specific to that url within + the cache, however first it is split up into directories as per + the CacheDirLevels and + CacheDirLength + directives.

+ +

CacheDirLevels + specifies how many levels of subdirectory there should be, and + CacheDirLength + specifies how many characters should be in each directory. With + the example settings given above, the hash would be turned into + a filename prefix as + /var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w.

+ +

The overall aim of this technique is to reduce the number of + subdirectories or files that may be in a particular directory, + as most file-systems slow down as this number increases. With + setting of "1" for + CacheDirLength + there can at most be 64 subdirectories at any particular level. + With a setting of 2 there can be 64 * 64 subdirectories, and so on. + Unless you have a good reason not to, using a setting of "1" + for CacheDirLength + is recommended.

+ +

Setting + CacheDirLevels + depends on how many files you anticipate to store in the cache. + With the setting of "2" used in the above example, a grand + total of 4096 subdirectories can ultimately be created. With + 1 million files cached, this works out at roughly 245 cached + urls per directory.

+ +

Each url uses at least two files in the cache-store. Typically + there is a ".header" file, which includes meta-information about + the url, such as when it is due to expire and a ".data" file + which is a verbatim copy of the content to be served.

+ +

In the case of a content negotiated via the "Vary" header, a + ".vary" directory will be created for the url in question. This + directory will have multiple ".data" files corresponding to the + differently negotiated content.

+
+
+ +
+ Maintaining the Disk Cache + + +

Although mod_disk_cache will remove cached content + as it is expired, it does not maintain any information on the total + size of the cache or how little free space may be left.

+ +

Instead, provided with Apache is the htcacheclean tool which, as the name + suggests, allows you to clean the cache periodically. Determining + how frequently to run htcacheclean and what target size to + use for the cache is somewhat complex and trial and error may be needed to + select optimal values.

+ +

htcacheclean has two modes of + operation. It can be run as persistent daemon, or periodically from + cron. htcacheclean can take up to an hour + or more to process very large (tens of gigabytes) caches and if you are + running it from cron it is recommended that you determine how long a typical + run takes, to avoid running more than one instance at a time.

+ +

+
+ Figure 1: Typical + cache growth / clean sequence.

+ +

Because mod_disk_cache does not itself pay attention + to how much space is used you should ensure that + htcacheclean is configured to + leave enough "grow room" following a clean.

+ +
+
+ +
+ +
diff --git a/docs/manual/images/caching_fig1.gif b/docs/manual/images/caching_fig1.gif new file mode 100644 index 0000000000000000000000000000000000000000..456da36f19af4717244ae437963b69bf4788af2b GIT binary patch literal 16515 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 literal 0 Hc-jL100001 diff --git a/docs/manual/images/caching_fig1.png b/docs/manual/images/caching_fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f824d657de418b5b856bc2b9061bb48e2bf6371 GIT binary patch literal 14262 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 Z7cr1MC0||QYzExh_#&esT`6fA_&>^M4ygbD literal 0 Hc-jL100001 diff --git a/docs/manual/index.xml b/docs/manual/index.xml index 941f439ab66..773c0c5d1e7 100644 --- a/docs/manual/index.xml +++ b/docs/manual/index.xml @@ -50,6 +50,7 @@ Binding Configuration Files Configuration Sections + Content Caching Content Negotiation Dynamic Shared Objects (DSO) Environment Variables -- 2.47.2