使用Apache的mod_cache缓存在Ubuntu 10.04上

使用Apache的mod_cache缓存在Ubuntu 10.04上

本文介绍如何使用Apache的mod_cache在Ubuntu 10.04上缓存网站内容。 如果您拥有高流量的动态网站,可以在每个请求上生成大量数据库查询,您可以通过缓存内容几分钟或更长时间(取决于更新内容的频率)来显着减少服务器负载。

我不会保证这将为您工作!

1初步说明

我假设你有一个工作的Apache2设置(Apache 2.2.x - 在该版本之前,mod_cache被认为是实验性的)从Ubuntu存储库 - Ubuntu 10.04存储库中的Apache版本是2.2.14,所以你应该很好走。

我在这里使用文档root / var / www作为我的测试vhost - 如果您的文档根目录不同,您必须调整此文件。

2启用mod_cache

mod_cache有两个管理高速缓存存储的子模块, mod_disk_cache (用于存储硬盘上的内容)和mod_mem_cache (用于存储内存中比缓存更快的内容)。 确定要使用哪一个,并继续使用第2.1章(mod_disk_cache)或2.2(mod_mem_cache)。

2.1 mod_disk_cache

mod_disk_cache配置存储在/etc/apache2/mods-available/disk_cache.conf中 ,所以我们来编辑一个:

vi /etc/apache2/mods-available/disk_cache.conf

确保取消对CacheEnable磁盘/行的注释,以使最小配置如下所示:

<IfModule mod_disk_cache.c>
# cache cleaning is done by htcacheclean, which can be configured in
# /etc/default/apache2
#
# For further information, see the comments in that file,
# /usr/share/doc/apache2.2-common/README.Debian, and the htcacheclean(8)
# man page.

        # This path must be the same as the one in /etc/default/apache2
        CacheRoot /var/cache/apache2/mod_disk_cache

        # This will also cache local documents. It usually makes more sense to
        # put this into the configuration for just one virtual host.

        CacheEnable disk /

        CacheDirLevels 5
        CacheDirLength 3
</IfModule>

您可以在http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html上找到有关这些配置选项和进一步配置选项的说明

现在我们可以启用mod_cache和mod_disk_cache:

a2enmod cache
a2enmod disk_cache
/etc/init.d/apache2 restart

为了确保我们的缓存目录/ var / cache / apache2 / mod_disk_cache不会随着时间填满,我们必须用htcacheclean命令清理它。 该命令是我们安装的apache2-utils包的一部分,如下所示:

aptitude install apache2-utils

之后,我们可以启动htcacheclean作为守护进程,如下所示:

htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i

这将清除我们的缓存目录每30分钟,并确保它不会超过100MB。 要了解有关htcacheclean的更多信息,请查看

man htcacheclean

当然,您不想在每次重新启动服务器时手动启动htcacheclean - 因此我们编辑/etc/rc.local ...

vi /etc/rc.local

...并在出口0行之前添加以下行:

[...]
/usr/sbin/htcacheclean -d30 -n -t -p /var/cache/apache2/mod_disk_cache -l 100M -i
[...]

每次启动服务器时,都会自动启动htcacheclean

2.2 mod_mem_cache

mod_mem_cache配置位于/etc/apache2/mods-available/mem_cache.conf中

vi /etc/apache2/mods-available/mem_cache.conf
<IfModule mod_mem_cache.c>
        CacheEnable mem /
        MCacheSize 4096
        MCacheMaxObjectCount 100
        MCacheMinObjectSize 1
        MCacheMaxObjectSize 2048
</IfModule>

这是默认配置 - 如果你喜欢可以修改它。 mod_mem_cache的配置指令列表可以在这里找到: http : //httpd.apache.org/docs/2.2/mod/mod_mem_cache.html

现在让我们启用mod_cache和mod_mem_cache,如下所示:

a2enmod cache
a2enmod mem_cache
/etc/init.d/apache2 restart

已经这样了 使用mod_mem_cache,您不必清理任何缓存目录。

3测试

不幸的是,mod_cache不提供任何记录功能,如果你想知道日志记录是否正常工作,这是不好的。 因此,我创建一个小的PHP测试文件/var/www/cachetest.php ,它发出HTTP头,告诉mod_cache它应该缓存该文件300秒,并且只需打印时间戳:

vi /var/www/cachetest.php
<?php
header("Cache-Control: must-revalidate, max-age=300");
header("Vary: Accept-Encoding");
echo time()."<br>";
?>

现在在浏览器中调用该文件 - 它应该显示当前时间戳。 然后点击浏览器的地址栏,然后按ENTER键 ,以便再次加载页面(不要按F5或重新加载按钮 - 这将始终从服务器获取新的副本,而不是缓存!) - 如果一切顺利,您仍然应该看到旧的缓存时间戳。 如果等待300秒,您应该从服务器而不是缓存获取新的副本。

4个HTTP头

缓存不能开箱即用 - 您必须修改Web应用程序,以便缓存可以工作(您的Web应用程序可能已经支持缓存 - 请参阅应用程序的文档以了解)。 只有当您的Web应用程序发出的HTTP标头才能这样做时,mod_cache才会缓存网页。

以下是一些告诉mod_cache 缓存的头文件示例:

  • 过期头文件过期:过期:Sun,1978年11月19日05:00:00 GMT“
  • 某些Cache-Control标头: “Cache-Control:no-store,no-cache,must-revalidate”“Cache-Control:must-revalidate,max-age = 0”
  • Set-Cookie标头:如果设置了Cookie,则不会缓存页面。

所以如果你想要mod_cache缓存你的页面,修改你的应用程序不发送这样的标题。

如果你想要mod_cache来缓存你的页面,你可以在将来设置一个具有日期的Expires标题,但推荐的方法是使用max-age

"Cache-Control: must-revalidate, max-age=300"

这告诉mod_cache缓存页面300秒( max-age ) - 不幸的是mod_cache不知道s-maxage选项(参见http://www.mnot.net/cache_docs/#CACHE-CONTROL ),这就是为什么我们必须使用max-age选项(它也会告诉您的浏览器缓存) - 如果您获得意想不到的结果,请记住这一点!) 。 如果mod_cache知道s-maxage选项,我们可以使用“Cache-Control:must-revalidate,max-age = 0,s-maxage = 300” ,这将告诉mod_cache而不是浏览器来缓存该页面。

当然,如果你同时从上面发出一个非缓存头( 过期的ExpiresSet-Cookie等),这个头就没用了!

这个缓存的另一个非常重要的标题是:

"Vary: Accept-Encoding"

这使得mod_cache保留每个缓存页面的两个副本,一个压缩(gzip)和一个未压缩的文件,以便它可以根据用户代理/浏览器的功能提供正确的版本。 一些用户代理不了解gzip压缩,所以应该得到未压缩的版本。

所以这里是总结:如果你想要mod_cache缓存,使用以下两个标题:

"Cache-Control: must-revalidate, max-age=300"
"Vary: Accept-Encoding"

并确保没有过期日期的过期,Cookie等发送。

如果您的应用程序是用PHP编写的,您可以使用PHP的header()函数发送HTTP标头,例如:

header("Cache-Control: must-revalidate, max-age=300");
header("Vary: Accept-Encoding");

如果您想了解有关HTTP头和缓存的更多信息,则该页面是必读的: http : //www.mnot.net/cache_docs/

5链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏