我已经启用了 mod_cache 和 mod_disk_cache Apache 模块,以便能够缓存从 PHP 脚本动态生成的图像(基于宽度和高度参数)。
每当我为 PHP 脚本提供较小的宽度和高度参数时,一切都会正常工作(Apache 会缓存文件)。但是,当我提供较大的参数时,随着图像大小变大(超过 50k),Apache 不再缓存响应。在这种情况下,Apache 会在 /var/cache/apache/mod_disk_cache 中创建一个目录,但该目录为空(它不包含 .header 和 .data 文件)。
我曾尝试设置 CacheMaxFileSize 指令,但似乎不起作用(我尝试在 disk_cache.conf 文件中将其设置为一个大值 (2000000),但似乎没有任何效果,并且在站点配置文件中设置该指令会禁用所有缓存 - 小文件的缓存停止工作)。
有谁遇到过类似的事情并知道如何解决?
服务器运行的是 Ubuntu 12.04 和 Apache 2.2.22
这是我的配置:
/etc/apache2/mods-available/disk_cache.conf
<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.
CacheDirLevels 2
CacheDirLength 1
CacheIgnoreCacheControl On
CacheIgnoreURLSessionIdentifiers jsessionid
CacheIgnoreURLSessionIdentifiers PHPSESSID
CacheIgnoreHeaders Set-Cookie
CacheMaxFileSize 2000000
</IfModule>
/etc/apache2/sites-available/img.mydomain.com
<VirtualHost *:80>
ServerName img.mydomain.com
ServerAlias img.mydomain.eu
DocumentRoot /var/www/mydomain.com/img/
<Directory />
Options None
AllowOverride None
Order allow,deny
Deny from all
</Directory>
<Directory /var/www/mydomain.com/>
AllowOverride All
</Directory>
<Directory /var/www/mydomain.com/img/>
Options FollowSymlinks
Order allow,deny
Allow from all
</Directory>
<IfModule mod_disk_cache.c>
CacheEnable disk /cached/
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/img.mydomain.com-error.log
LogLevel debug
CustomLog ${APACHE_LOG_DIR}/img.mydomain.com-access.log combined
</VirtualHost>
PHP 图像生成脚本 /var/www/mydomain.com/img/cached/logo.php
<?php
//Generate Imagick image based on provided width and height
header("Content-Type: image/" . strtolower($image->getImageFormat()));
header("Content-Length: " . strlen($image));
header("Cache-Control: public, must-revalidate, max-age=2592000");
echo $image;
?>
答案1
我的一个朋友找到的方法是使用强制缓存整个文件wget
,方法很简单:
wget http://my.domain.com/mybigfile.ogg
或者
wget -O /dev/null http://my.domain.com/mybigfile.ogg
没有 范围!
这将强制apache
缓存整个文件。
之后,访问范围现在可以存在于缓存文件中...
(抱歉回答晚了:我在搜索这种解决方案时发现了这个问题。所以在查看了正在运行的解决方法后,我发布了这个;)
答案2
你需要告诉它存储的最大文件大小,默认值为 1MB,因此每个大于该大小的文件都不会被缓存
在 disk_cach 的配置中将最大大小设置为 10MB 左右
CacheMaxFileSize 10000000
这里有一个配置文件作为示例:LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache_disk.c>
CacheRoot DIRECTORY_OF_THE_DISK_CACHE_HERE
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 10000000
CacheDefaultExpire 86400
</IfModule>
</IfModule>