如何使mod_cache与动态内容一起正常工作?

时间:2012-08-28 08:57:47

标签: apache caching cgi

我正在尝试使用mod_cache来缓存动态生成的内容。这是我的Apache配置:

CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheStorePrivate On
CacheStoreNoStore On

<Location /cgi-bin>
    SetHandler cgi-script
    Options +ExecCGI
</Location>

这是一个CGI脚本(仅用于测试):

#!/opt/app/phantomjs/bin/phantomjs
var date = new Date('Sun, 01 Jan 2012 00:00:00 GMT');
console.log('Last-Modified: '+ date.toUTCString());
console.log('Cache-Control: max-age=' + (365 * 24 * 60 * 60)+ ', public');
date.setDate(date.getDate() + 365);
console.log('Expires: '+ date.toUTCString() + '\n\n');

// lengthy operation here...

console.log(content);

这基本上有效。但会发生什么是客户端请求带有If-Modified-Since标头的cgi-bin:

  1. CGI脚本流标题
  2. 延迟几秒钟
  3. CGI脚本流体
  4. Apache发送304
  5. 这对我没有意义。 Apache在发送未修改的响应之前等待整个响应。

    我的期望

    1. CGI脚本流标题
    2. Apache发送304
    3. 取消CGI脚本或丢弃CGI脚本正文
    4. 有没有办法完成它?

2 个答案:

答案 0 :(得分:0)

CGI脚本应更改如下。

  1. 请勿使用静态的上次修改日期。应将动态资源的Last-Modified设置为当前执行时间。

  2. 缓存控制指令包含类型错误'pulic'应为'public'

  3. 不需要Expires指令,因为Cache-Control的优先级高于Expires。

  4. 无法发送标头后,您的预期行为“终止CGI脚本”。如果缓存有效,则在缓存条目无效之前不会执行CGI脚本。

答案 1 :(得分:0)

这是我在上次评论中所说的解决方案。将CGI执行转发到内部虚拟主机。使用此配置,mod_cache将按预期工作。我用apache 2.2.21在我的机器上测试了它。

# virtual cgi host - used internally only for cgi execution
<VirtualHost *:8080>
    ##ServerAdmin postmaster@dummy-host.localhost
    DocumentRoot "C:/Project/web"
    ServerName cgi-bin.local
    ErrorLog "logs/cgi-bin-error.log"
    CustomLog "logs/cgi-bin-access.log" combined
    LogLevel debug

    <Location /cgi-bin>
        SetHandler cgi-script
        Options +ExecCGI
    </Location>

</VirtualHost>

# Virtual host used by client
<VirtualHost *:8080>
    ##ServerAdmin postmaster@dummy-host.localhost
    DocumentRoot "C:/Project/web"
    ServerName web.local
    ErrorLog "logs/web-error.log"
    CustomLog "logs/web-access.log" combined

    CacheEnable mem /
    MCacheSize 4096
    MCacheMaxObjectCount 100
    MCacheMinObjectSize 50
    MCacheMaxObjectSize 20480
    MCacheMaxStreamingBuffer 20480
    CacheIgnoreCacheControl On
    CacheIgnoreNoLastMod On
    CacheStorePrivate On
    CacheStoreNoStore On

    ProxyRequests Off
    ProxyPass /cgn-bin http://cgi-bin.local:8080/
    ProxyPassReverse /cgn-bin http://cgi-bin.local:8080/

</VirtualHost>