| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> |
| <HTML> |
| <HEAD> |
| <TITLE>Apache module mod_file_cache</TITLE> |
| </HEAD> |
| <!-- Background white, links blue (unvisited), navy (visited), red (active) --> |
| <BODY |
| BGCOLOR="#FFFFFF" |
| TEXT="#000000" |
| LINK="#0000FF" |
| VLINK="#000080" |
| ALINK="#FF0000" |
| > |
| <!--#include virtual="header.html" --> |
| <H1 ALIGN="CENTER">Module mod_file_cache</H1> |
| <P> |
| <STRONG>This module should be used with care. You can easily create a |
| broken site using mod_file_cache, so read this document |
| carefully.</STRONG> |
| </P> |
| |
| <P> |
| <EM>Caching</EM> frequently requested files that change very |
| infrequently is a technique for reducing server load. mod_file_cache |
| provides two techniques for caching frequently requested |
| <EM>static</EM> files. |
| Through configuration directives, you can direct mod_file_cache |
| to either open then mmap()a file, or to pre-open a file and save |
| the file's open <EM>file handle</EM>. Both techniques reduce server |
| load when processing requests for these files by doing part of the |
| work (specifically, the file I/O) for serving the file when the server |
| is started rather than during each request. |
| </P> |
| |
| <P> |
| <CODE>mod_file_cache</CODE> is not compiled into the server by |
| default. To use <CODE>mod_file_cache</CODE> you have to enable the |
| following line in the server build <CODE>Configuration</CODE> file: |
| <PRE> |
| AddModule modules/experimental/mod_file_cache.o |
| </PRE> |
| </P> |
| |
| <P> |
| Notice: You cannot use this for speeding up CGI programs or other files |
| which are served by special content handlers. It can only be used for |
| regular files which are usually served by the Apache core content handler. |
| </P> |
| |
| <P> |
| This module is an extension of and borrows heavily from the |
| mod_mmap_static module in Apache 1.3. |
| </P> |
| <H2>Summary</H2> |
| <P> |
| <CODE>mod_file_cache</CODE> caches a list of statically configured |
| files via <CODE>MMapFile</CODE> or <CODE>CacheFile</CODE> directives |
| in the main server configuration. |
| </P> |
| |
| <P> |
| Not all platforms support both directives. For |
| example, Apache on Windows does not currently support the MMapStatic |
| directive, while other platforms, like AIX, support both. You will |
| receive an error message in the server error log if you attempt to |
| use an unsupported directive. If given an unsupported directive, the |
| server will start but the file will not be cached. On platforms that |
| support both directives, you should experiment with both to see |
| which works best for you. |
| </P> |
| |
| <H3><CODE>MmapFile</CODE> Directive </H3> |
| <P> |
| The <CODE>MmapFile</CODE> directive of <CODE>mod_file_cache</CODE> |
| maps a list of statically configured files into memory through the |
| system call <CODE>mmap()</CODE>. This system call is available on |
| most modern Unix derivates, but not on all. There are sometimes |
| system-specific limits on the size and number of files that can be |
| mmap()d, experimentation is probably the easiest way to find out. |
| </P> |
| <P> |
| This mmap()ing is done once at server start or restart, only. So whenever |
| one of the mapped files changes on the filesystem you <EM>have</EM> to |
| restart the server (see the <A HREF="../stopping.html">Stopping and |
| Restarting</A> documentation). To reiterate that point: if the |
| files are modified <EM>in place</EM> without restarting the server |
| you may end up serving requests that are completely bogus. You |
| should update files by unlinking the old copy and putting a new |
| copy in place. Most tools such as <CODE>rdist</CODE> and |
| <CODE>mv</CODE> do this. The reason why this modules doesn't take |
| care of changes to the files is that this check would need an extra |
| <CODE>stat()</CODE> every time which is a waste and against the |
| intent of I/O reduction. |
| </P> |
| |
| <H3><CODE>CacheFile</CODE> Directive </H3> |
| <P> |
| The <CODE>CacheFile</CODE> directive of <CODE>mod_file_cache</CODE> |
| opens an active <EM>handle</EM> or <EM>file descriptor</EM> to the |
| file (or files) listed in the configuration directive and places |
| these open file handles in the cache. When the file is requested, |
| the server retrieves the handle from the cache and passes it to the |
| sendfile() (or TransmitFile() on Windows), socket API. |
| </P> |
| <P> |
| Insert more details about sendfile API... |
| </P> |
| <P> |
| This file handle caching is done once at server start or restart, |
| only. So whenever one of the cached files changes on the filesystem |
| you <EM>have</EM> to restart the server (see the <A |
| HREF="../stopping.html">Stopping and Restarting</A> documentation). |
| To reiterate that point: if the files are modified <EM>in |
| place</EM> without restarting the server you may end up serving |
| requests that are completely bogus. You should update files by |
| unlinking the old copy and putting a new copy in place. Most tools |
| such as <CODE>rdist</CODE> and <CODE>mv</CODE> do this. |
| </P> |
| |
| <H2>Directives</H2> |
| <UL> |
| <LI><A HREF="#mmapfile">MMapFile</A> |
| </LI> |
| <LI><A HREF="#cachefile">CacheFile</A> |
| </LI> |
| </UL> |
| |
| <HR> |
| |
| <H2><A NAME="mmapfile">MMapFile</A></H2> |
| <P> |
| <A |
| HREF="directive-dict.html#Syntax" |
| REL="Help" |
| ><STRONG>Syntax:</STRONG></A> MMapFile <EM>filename ...</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Default" |
| REL="Help" |
| ><STRONG>Default:</STRONG></A> <EM>None</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Context" |
| REL="Help" |
| ><STRONG>Context:</STRONG></A> server-config |
| <BR> |
| <A |
| HREF="directive-dict.html#Override" |
| REL="Help" |
| ><STRONG>Override:</STRONG></A> <EM>Not applicable</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Status" |
| REL="Help" |
| ><STRONG>Status:</STRONG></A> Experimental |
| <BR> |
| <A |
| HREF="directive-dict.html#Module" |
| REL="Help" |
| ><STRONG>Module:</STRONG></A> mod_file_cache |
| <BR> |
| <A |
| HREF="directive-dict.html#Compatibility" |
| REL="Help" |
| ><STRONG>Compatibility:</STRONG></A> Only in Apache 1.3 (via |
| mod_mmap_statis) or later. |
| |
| <P> |
| The <CODE>MMapFile</CODE> directive maps one or more files (given as |
| whitespace separated arguments) into memory at server startup time. They |
| are automatically unmapped on a server shutdown. When the files have changed |
| on the filesystem at least a HUP or USR1 signal should be send to the server |
| to re-mmap them. |
| </P> |
| |
| <P> |
| Be careful with the <EM>filename</EM> arguments: They have to literally |
| match the filesystem path Apache's URL-to-filename translation handlers |
| create. We cannot compare inodes or other stuff to match paths through |
| symbolic links <EM>etc.</EM> because that again would cost extra <CODE>stat()</CODE> |
| system calls which is not acceptable. This module may or may not work |
| with filenames rewritten by <CODE>mod_alias</CODE> or |
| <CODE>mod_rewrite</CODE>. |
| </P> |
| |
| Example: |
| |
| <PRE> |
| MMapFile /usr/local/apache/htdocs/index.html |
| </PRE> |
| |
| |
| <H2><A NAME="cachefile">CacheFile</A></H2> |
| <P> |
| <A |
| HREF="directive-dict.html#Syntax" |
| REL="Help" |
| ><STRONG>Syntax:</STRONG></A> CacheFile <EM>filename ...</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Default" |
| REL="Help" |
| ><STRONG>Default:</STRONG></A> <EM>None</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Context" |
| REL="Help" |
| ><STRONG>Context:</STRONG></A> server-config |
| <BR> |
| <A |
| HREF="directive-dict.html#Override" |
| REL="Help" |
| ><STRONG>Override:</STRONG></A> <EM>Not applicable</EM> |
| <BR> |
| <A |
| HREF="directive-dict.html#Status" |
| REL="Help" |
| ><STRONG>Status:</STRONG></A> Experimental |
| <BR> |
| <A |
| HREF="directive-dict.html#Module" |
| REL="Help" |
| ><STRONG>Module:</STRONG></A> mod_file_cache |
| <BR> |
| <A |
| HREF="directive-dict.html#Compatibility" |
| REL="Help" |
| ><STRONG>Compatibility:</STRONG></A> Only available in Apache 2.0 or later. |
| |
| <P> |
| The <CODE>CacheFile</CODE> directive opens handles to one or more |
| files (given as whitespace separated arguments) and places these |
| handles into the cache at server startup time. Handles to cached |
| files are automatically closed on a server shutdown. When the files |
| have changed on the filesystem, the server should be restarted to |
| to re-cache them. |
| </P> |
| |
| <P> |
| Be careful with the <EM>filename</EM> arguments: They have to literally |
| match the filesystem path Apache's URL-to-filename translation handlers |
| create. We cannot compare inodes or other stuff to match paths through |
| symbolic links <EM>etc.</EM> because that again would cost extra <CODE>stat()</CODE> |
| system calls which is not acceptable. This module may or may not work |
| with filenames rewritten by <CODE>mod_alias</CODE> or |
| <CODE>mod_rewrite</CODE>. |
| </P> |
| |
| Example: |
| |
| <PRE> |
| CacheFile /usr/local/apache/htdocs/index.html |
| </PRE> |
| |
| <P> |
| <STRONG>Note</STRONG>: don't bother asking for a for a directive which |
| recursively caches all the files in a directory. Try this |
| instead... |
| See the <A HREF="core.html#include">Include</A> directive, and consider this command: |
| <PRE> |
| find /www/htdocs -type f -print \ |
| | sed -e 's/.*/mmapfile &/' > /www/conf/mmap.conf |
| </PRE> |
| |
| <!--#include virtual="footer.html" --> |
| </BODY> |
| </HTML> |