我如何验证Apache缓存是否起作用?

11

我已经在我的httpd.conf文件中添加了缓存指令,但是不知道如何验证它是否真正地缓存页面并提供服务。我该如何验证?

我在服务器配置级别(而不是使用VirtualHost)添加了缓存指令:

CacheEnable disk /
CacheRoot /var/cache
CacheDefaultExpire 3600
8个回答

7

您可以确认以下几点,以确定您的Apache是否真正地缓存内容。

  1. 检查 /var/cache 目录的大小。当您的Apache被访问时,它应该会随着时间增长而增大。

  2. 您可以在日志中检查,响应代码应为302而不是200。

如果您满足这两个条件,则 mod_disk_cache 模块应该正常工作。


1
谢谢。我看到一个空文件夹和“200”。我该如何找出问题所在? - Don Rhummy
这是否正确?通过谷歌搜索检查,缓存页面可能显示为代码“200”。您有“302”代码的来源吗? - Don Rhummy
6
我认为你的意思是 304 而不是 302,302 是重定向。 - vsingh

4
如果您在LogFormat行中添加\"%{cache-status}e\",它将显示在访问日志文件中。

3

您可以编写一个简单的 PHP 页面。如果您刷新该页面,则右上角的时间不应再增加 300 秒。

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

这对我不起作用,但很奇怪。我创建了两个文件,dynamic.php使用您的代码,static.html包含文本“hello world”。当我在浏览器中打开这些文件时,静态文件static.html的缓存正常工作,但动态文件dynamic.php的缓存却无法正常工作。然而,在这两种情况下,正确的文件都已经在服务器缓存磁盘上创建,但由于某种原因,Apache没有使用缓存。这意味着即使缓存已经在磁盘上正确创建,Apache也可能永远不会使用它,而只是不断刷新它。肯定还有其他设置缺失。在谷歌上研究这个问题非常困难! - Morgus Lethe

2

在日志中出现的304并不意味着您的内容是从缓存中提供的。但是,查看/var/cache/mod_proxy文件夹,您可以看到其内容和大小在增长。

在httpd.conf中添加以下内容:

SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{CACHE_MISS}e" combined

现在我的日志如下所示。
之前的内容。
192.xx.xx.xx - - [29/Oct/2015:10:11:12 -0400] "GET /pathToResource/javascript/extjs/lib/extjs4/ext-all.js HTTP/1.1" 304 - "https://my-url" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" 

在按照上述更改后,
192.xx.xx.xx - - [29/Oct/2015:10:11:12 -0400] "GET /pathToResource/javascript/extjs/lib/extjs4/ext-all.js HTTP/1.1" 304 - "https://my-url" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36" 1

在结尾处看到“Notice 1”。 下次在浏览器中按F5时,您应该看到相同的资源被提供,并且结尾不会有1

1

验证工作缓存的简单测试:

  • 请求一个URL,例如curl "http://mydomain/my/page?test_param"
  • 检查HTTP状态码是否为200、203、300、301或410(仅这些被缓存,请参见https://httpd.apache.org/docs/2.4/caching.html
  • 使用htcacheclean检查缓存,例如htcacheclean -p /var/cache -A|grep 'test_param'

0
请尝试使用以下设置。
<IfModule mod_cache.c>
LoadModule cache_disk_module /usr/lib/apache2/modules/mod_cache_disk.so
<IfModule mod_disk_cache.c>
CacheDefaultExpire 3600
CacheEnable disk /
CacheRoot "/path/to/cache/folder/"
CacheDirLevels 2
CacheDirLength 1
</IfModule>
</IfModule>

我已经做了,apache用户所在的组是所有者,并且具有读写访问权限。 - Don Rhummy
我希望您在httpd.conf文件中也加载了以下两个模块:"mod_disk_cache"和"mod_cache"。 - Alpesh Bhavsar
请尝试以下设置。<IfModule mod_cache.c> LoadModule cache_disk_module /usr/lib/apache2/modules/mod_cache_disk.so <IfModule mod_disk_cache.c> CacheDefaultExpire 3600 CacheEnable disk / CacheRoot "/path/to/cache/folder/" CacheDirLevels 2 CacheDirLength 1 </IfModule> </IfModule> - Alpesh Bhavsar

0
CacheRoot "/var/cache/folder"

检查

/var/log/apache2/error.log

如果有权限错误,它将无法写入目录,请像下面这样给apache2授予权限以访问该目录。
mkdir -p /var/cache/folder/
chown root:www-data /var/cache/apache2/mod_cache_disk/ -R
chmod 775 /var/cache/apache2/mod_cache_disk/ -R

访问页面,检查文件夹中是否有目录结构出现,其中有两个文件,一个是标题文件,另一个是数据文件。如果它显示数据正在缓存,否则可能是配置问题,我已经配置好了,缓存页面也在我的日志中显示200状态。


0

我曾经遇到过同样的挑战,这里的答案和评论非常有帮助。

在测试时,我还发现另一个有用的选项是添加一个或多个Apache缓存头。

它们使得用基本的HTTP客户端(如curl)轻松测试和验证设置变得容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接