如何验证 Apache 缓存是不是正常工作?
Posted
技术标签:
【中文标题】如何验证 Apache 缓存是不是正常工作?【英文标题】:How do I verify Apache caching is working?如何验证 Apache 缓存是否正常工作? 【发布时间】:2014-02-20 05:25:00 【问题描述】:我已将缓存指令添加到我的 httpd.conf 文件中,但无法发现如何验证它实际上是在缓存页面并为它们提供服务。我该如何验证?
我在服务器配置级别(不使用 VirtualHost)添加了缓存指令:
CacheEnable disk /
CacheRoot /var/cache
CacheDefaultExpire 3600
【问题讨论】:
【参考方案1】:您可以通过确认以下几点来检查您的 apache 是否真的在缓存内容。
检查 /var/cache 目录的大小。一段时间后,当你的 apache 受到攻击时,它的大小应该会增长
您可以在日志中查看,响应码应该是 302 而不是 200。
如果这两个点都匹配,那么应该有工作的 mod_disk_cache 模块。
【讨论】:
谢谢。我看到一个空文件夹和200
。如何找出问题所在?
这是正确的吗?检查谷歌搜索,缓存页面可以显示为代码200
。你有302
代码的来源吗?
我认为你的意思是 304 而不是 302。302 是重定向。【参考方案2】:
请尝试以下设置。
<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 用户所属的组是它的所有者,并且具有读写权限 我希望您在 httpd.conf 文件中也加载了以下两个模块。 "mod_disk_cache" "mod_cache" 请尝试以下设置。 <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>【参考方案3】: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 状态日志
【讨论】:
【参考方案4】:您可以简单地编写一个快速的 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 也可能永远不会使用它,而只是不断刷新它。必须缺少另一个设置。在谷歌上研究这个非常困难!【参考方案5】:
日志中的 304 并不意味着您的内容是从缓存中提供的。但是是的,看看文件夹 /var/cache/mod_proxy 你可以看到内容和大小在增长。
在 httpd.conf 添加这个
SetEnv CACHE_MISS 1
LogFormat "%h %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\" %CACHE_MISSe" 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
最后注意1。 下次如果您在浏览器中执行 F5 ,您应该会看到正在提供相同的资源,并且最后不会有 1。
【讨论】:
【参考方案6】:如果您将\"%cache-statuse\"
添加到您的 LogFormat 行,它将显示在您的访问日志文件中。
【讨论】:
【参考方案7】:验证工作缓存的简单测试:
请求一个 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'
【讨论】:
【参考方案8】:遇到了同样的挑战,这里的答案和 cmets 非常有帮助。 我在测试时还发现另一个有用的选项是添加一个或多个 Apace 缓存标头。
CacheHeader CacheDetailHeader它们使使用基本 http 客户端(例如 curl)测试和验证设置变得容易。
【讨论】:
以上是关于如何验证 Apache 缓存是不是正常工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Apache Zeppelin/Shiro 在不同的端口(不是 8080)上工作?