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 0000000000..9115cdcd50 --- /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 HcmV?d00001 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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 g!2eS{&dX@~ literal 0 HcmV?d00001 diff --git a/docs/manual/index.xml b/docs/manual/index.xml index 941f439ab6..773c0c5d1e 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.40.0