3

我正在尝试使用 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);

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

  1. CGI 脚本流标头
  2. 几秒钟的延迟
  3. CGI 脚本流主体
  4. Apache 发送 304

这对我来说毫无意义。Apache 在发送未修改的响应之前等待整个响应。

我的期望

  1. CGI 脚本流标头
  2. Apache 发送 304
  3. CGI 脚本被取消或 CGI 脚本主体被丢弃

有什么办法可以完成吗?

4

2 回答 2

0

CGI 脚本应更改如下。

  1. 不要使用静态的 Last-modified 日期。动态资源的 Last-Modified 应该设置为当前执行时间。

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

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

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

于 2013-07-20T17:56:24.257 回答
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>
于 2013-07-21T15:59:55.557 回答