1. /usr/local/apache/bin/httpd -k graceful
httpd: Syntax error on line 56 of /usr/local/apache/conf/httpd.conf: Cannot load /usr/local/apache/modules/mod_cache.so into server: /usr/local/apache/modules/mod_cache.so: undefined symbol: cache_generate_key_default
解决方法:
加入缓存支持的父模块mod_cache.c,该文件必须和cache_util.c cache_cache.c cache_storage.c cache_pqueue.c cache_hash.c一起编译
/usr/local/apache/bin/apxs -i -c ./mod_cache.c cache_util.c cache_cache.c cache_storage.c cache_pqueue.c cache_hash.c
2. CacheDirLevels*CacheDirLength value must not be higher than 20
解决办法:
CacheDirLevels最大值为:5
CacheDirLength最大值为:4
二者的乘积最大不能超过20
以上两个问题是在安装mod_cache,mod_disk_cache扩展并配置了httpd.conf重启apache后报出的错误。
浏览器的刷新有以下三种情况:
1. 强制刷新: windows快捷键(control+shift+F5) mac快捷键(command+shift+R)
此操作在刷新页面时,不会走本地缓存而是每次都会直接向web服务器发送请求。
2. F5或者转到按钮: windows快捷键(F5) mac快捷键(command+R)
此操作在刷新页面时,会发送上次的last-modified到web服务器,服务器端获取if-since-modified来判断文件在某时间内是否
修改过或过期,如果修改过或者过期了则返回新内容,否则返回http头, HTTP/1.1 304 Not Modified。
3. 地址栏输入地址回车或者超链接跳转:
此操作刷新页面时,如果页面头中包含Expires过期时间, 如果页面未过期,则直接使用本地缓存,不会再向web服务器发送请求,否则
则会再次向web服务器发送请求。
针对mod_cache模块,其又提供了两种数据存储模块mod_dis_cache(存储至磁盘), mod_mem_cache(存储至内存)
本操作采用将缓存数据存储至磁盘。
1. httpd.conf配置如下:
LoadModule cache_module modules/mod_cache.so //加载mod_cache.so模块
<IfModule mod_cache.c>
CacheEnable disk / //启用磁盘存储。参数1:存储类型disk or mem, 参数2:路径 /代表根目录下的所有文件
CacheDefaultExpire 60 //缓存默认过期时间单位秒
CacheIgnoreNoLastMod On //忽略last-modified
LoadModule disk_cache_module modules/mod_disk_cache.so //加载mod_disk_cache模块
<IfModule mod_dis_cache.c>
CacheRoot /var/www/htdocs/caches //缓存文件存储目录 指定的目录必须有写入权限
CacheDirLevels 3 //创建的缓存目录级数
CacheDirLength 2 //目录名字包含字符数
</IfModule>
</IfModule>
如1所示的mod_cache与mod_disk_cache配置,如果web服务器响应的页面中未提供last-modified或者expire,CacheDefaultExpire才会
生效。通常对于未提供last-modified的页面服务器不会缓存,所以此时需要忽略last-modified,因此需要设置CacheIgnoreNoLastMod为On
此时测试上面提到的三种刷新机制:(假定页面的缓存文件已经生成)
1. 强制刷新 每次都会向web服务器发送请求
2. F5或者转到按钮 每次都会向web服务器发送请求
3. 地址栏输入地址回车或者超链接跳转 如果未过期则使用本地缓存
2. httpd.conf配置如下:
LoadModule cache_module modules/mod_cache.so //加载mod_cache.so模块
<IfModule mod_cache.c>
CacheEnable disk / //启用磁盘存储。参数1:存储类型disk or mem, 参数2:路径 /代表根目录下的所有文件
LoadModule disk_cache_module modules/mod_disk_cache.so //加载mod_disk_cache模块
<IfModule mod_dis_cache.c>
CacheRoot /var/www/htdocs/caches //缓存文件存储目录 指定的目录必须有写入权限
CacheDirLevels 3 //创建的缓存目录级数
CacheDirLength 2 //目录名字包含字符数
</IfModule>
</IfModule>
如2所示的mod_cache与mod_disk_cache配置, 此情况需要在web程序中设置响应头信息如:
<?php
if(php_sapi_name() == 'apache2handler' || php_sapi_name() == 'apache') {
$headers = apache_request_headers();
if(isset($headers['If-Modified-Since']) && !empty($headers['If-Modified-Since']))
{
if(time() - strtotime($headers['If-Modified-Since']) <= 60)
{
header("HTTP/1.1 304 Not Modified");
exit;
}
}
}
//省略mysql查询的操作⋯⋯
header("Last-modified:".gmdate("D, d M Y H:i:s", time())." GMT");
header("Expires:".gmdate("D, d M Y H:i:s", time() + 60)." GMT");
header("Cache-Control:max-age=60");
?>
此时测试上面提到的三种刷新机制:(假定页面的缓存文件已经生成)
1. 强制刷新 每次都会向web服务器发送请求
2. F5或者转到按钮 向服务器发送请求头last-modified,如果未过期则使用本地缓存
3. 地址栏输入地址回车或者超链接跳转 如果未过期则使用本地缓存
注:firefox与chrome查看缓存,需在浏览器输入about:cache
对于apache中的cache请参考官网:
http://httpd.apache.org/docs/2.2/caching.html
http://httpd.apache.org/docs/2.2/mod/mod_cache.html
http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
对于mod_disk_cache,如果disk中的缓存文件过大,需要定期清除disk中的文件,此时可以使用htcacheclean
具体请参考官网:http://httpd.apache.org/docs/2.2/programs/htcacheclean.html
apache中mod_cache mod_disk_cache
最新推荐文章于 2024-05-29 08:51:56 发布