首页 > 精选文章 > Web服务器 > 正文

Apache 缓存系统的简单介绍

Apache 从2.0开始就已经可以使用缓存模块了,不过在2.0的时候还是实验性的,到了2.2已经完全可以放心的使用。Apache 的缓存实现主要依靠 mod_cache、mod_disk_cache、mod_file_cache 及 mod_mem_cache。只需在配置编译的时候加上参数:--enable-cache、 --enable-disk-cache、--enable-file-cache、 --enable-mem-cache 即可。

关于 Apache 的编译安装本文就不再说了,可以参考以前的文章。这里主要介绍一下如何配置使用 Apache 的缓存功能。

具体来说,Apache 的缓存方式有两种,一种是基于硬盘文件的缓存,由 mod_disk_cache 实现,另一种是使用内存缓存,由 mod_mem_cache 实现,不过它们都是依赖 mod_cache 模块的,mod_cache 模块提供了一些缓存配置的指令供它们使用,而 mod_file_cache 模块是搭配 mod_mem_cache 模块使用的,下面分别进行介绍。

1、基于硬盘文件的缓存

基于硬盘文件存储的缓存由 mod_disk_cache 模块实现,先看个简单的配置例子:

<IfModule mod_cache.c>
    CacheDefaultExpire 86400
    <ifModule mod_disk_cache.c>
        CacheEnable disk /
        CacheRoot /tmp/apacheCache
        CacheDirLevels 5
        CacheDirLength 5
        CacheMaxFileSize 1048576
        CacheMinFileSize 10
    </ifModule mod_disk_cache.c>
</IfModule mod_cache.c>

把上面的配置加到 Apache 的 httpd.conf 文件中,如果缓存相关的模块都已经编译进了 Apache 的核心,则无需加载模块,直接就能使用上面的指令。指令的详细说明如下: 基于硬盘文件存储的文件基本上就这些内容,设置好后重启 Apache 应该就能使用了。一切正常的话,可以在缓存目录下看到 Apache 自动建立的一些目录和缓存的数据文件。

2、基于内存的缓存

基于内存的缓存主要由 mod_mem_cache 模块实现,还是看个简单的配置吧,这样比较直观:-)

<IfModule mod_cache.c>
    <ifModule mod_mem_cache.c>
        CacheEnable mem /
        MCacheMaxObjectCount 20000
        MCacheMaxObjectSize 1048576
        MCacheMaxStreamingBuffer 65536
        MCacheMinObjectSize 10
        MCacheRemovalAlgorithm GDSF
        MCacheSize 131072
    </ifModule mod_disk_cache.c>
</IfModule mod_cache.c>

简单说一下上面一些指令的意思: 保存重启 Apache 基于内存的缓存系统应该就能生效了,根据需要可以使基于内存的存储或硬盘文件的存储方式一起使用,只要指明不同的URL路径即可。

3、注意事项

使用缓存需要注意如下事项:
      
  1. 要使用缓存,必须使用指令 CacheEnable 启用它,目前可用的缓存类型为 disk 或 mem,禁止缓存可以使用 CacheDisable,如 CacheDisable /private   
  2. 待缓存的 URL 返回的状态值必须为: 200、203、300、301 或 410   
  3. URL 的请求方式必须是 GET 方式   
  4. 发送请求时,头部中包含 “Authorization: ”的字符串时,返回的内容将不会被缓存   
  5. URL 包含查询字符串,如问号?后的那些东西,除非返回的内容包含“Expires:”,否则不会被缓存   
  6. 如果返回的状态值是 200,则返回的头部信息必须包含以下的一种才会被缓存:Etag、Last-Modified、Expires,除非设置了指令 CacheIgnoreNoLastMod On   
  7. 如果返回内容的头部信息“Cache-Control:”中包含“private”,除非设置了指令 CacheStorePrivate On,否则不会被缓存   
  8. 如果返回内容的头部信息“Cache-Control:”中包含“no-sotre”,除非设置了指令 CacheStoreNoStore On,否则不会被缓存   
  9. 如果返回内容的头部信息“Vary:”中包含了“*”,不会被缓存

4、其它一些指令的介绍

如果你的网站有几个文件的访问非常频繁而又不经常变动,则可以在 Apache 启动的时候就把它们的内容缓存到内存中(当然要启用内存缓存系统),使用的是 mod_file_cache 模块,具体如下:

有多个文件可以用空格格开
MMapFile /var/www/html/index.html /var/www/html/articles/index.html

上面是缓存文件的内容到内存中,除此之外,还可以只缓存文件的打开句柄到内存中,当有请求进来的时候,Apache 直接从内存中获取文件的句柄,返回内容,和 MMapFile 指令很像,具体如下:

CacheFile /var/www/html/index.html /var/www/html/articles/index.html

上面两个指令所缓存的文件如果有修改的话,必须重启 Apache 或使用 graceful 之类的方式强制使 Apache 更新缓存数据,否则当用户访问的时候获取的不是最新的数据。

有时候需要根据某些特殊的头部信息来决定是否进行缓存,则可以使用如下指令:

当头部信息中包含 Set-Cookie 时则跳过不进行缓存操作
CacheIgnoreHeaders Set-Cookie

有时候需要缓存的时候跳过 URL 中的查询字符串?使用如下指令:

CacheIgnoreQueryString On

更多指令请参考:http://www.itlearner.com/code/apache2.2/caching.html

Apache 的缓存系统不仅可以缓存服务器本身的文件,也可以缓存通过代理得到的内容,对了,Apache 可以像 Squid 一样做代理,而且做的还不错,下篇文章就介绍一下 Apache 的代理功能吧。善用 Apache 的缓存功能,可以让你的网站速度提升不少。做为一个网站来说,虽然可用的各种缓存方案很多,但在 Web 服务器层做缓存的效率还是很值得一试的。

  • 上一篇:央行下调存贷款基准利率、存款准备金率
  • 下一篇:暴风影音CEO冯鑫:与腾讯之战不可避免
  • 了解这些字:缓的意思 存的意思 系的意思 统的意思 的的意思 简的意思 单的意思 介的意思