我正在尝试使用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:
这对我没有意义。 Apache在发送未修改的响应之前等待整个响应。
我的期望:
有没有办法完成它?
答案 0 :(得分:0)
CGI脚本应更改如下。
请勿使用静态的上次修改日期。应将动态资源的Last-Modified设置为当前执行时间。
缓存控制指令包含类型错误'pulic'应为'public'
不需要Expires指令,因为Cache-Control的优先级高于Expires。
无法发送标头后,您的预期行为“终止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>