使用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而不是浏览器来缓存该页面。
当然,如果你同时从上面发出一个非缓存头( 过期的Expires
, Set-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链接
- Apache: http : //httpd.apache.org/
- mod_cache: http : //httpd.apache.org/docs/2.2/mod/mod_cache.html
- mod_disk_cache: http : //httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
- mod_mem_cache: http : //httpd.apache.org/docs/2.2/mod/mod_mem_cache.html
- Apache缓存指南: http : //httpd.apache.org/docs/2.2/caching.html
- 缓存教程: http : //www.mnot.net/cache_docs/
- Ubuntu: http : //www.ubuntu.com/