Apache mod_disk_cache 适用于小文件,但不适用于大文件

Apache mod_disk_cache 适用于小文件,但不适用于大文件

我已经启用了 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>

相关内容