我正在使用以下vcl来帮助我确定我是否遇到了Varnish缓存命中或未命中:
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Varnish-Cache = "HIT";
}
else {
set resp.http.X-Varnish-Cache = "MISS";
}
}
这工作正常,但不适用于application/json内容类型。
我在每个请求上都得到X-Varnish-Cache =“MISS”,但是我不明白为什么会这样(我怀疑这是一个假否定)。
这是我(显然)未缓存的json请求的响应 header 的示例:
Accept-Ranges:bytes
Age:0
Cache-Control:public, max-age=10800
Connection:keep-alive
Content-Encoding:gzip
Content-Length:2139
Content-Type:application/json
Date:Thu, 09 Jan 2014 16:08:21 GMT
Etag:"1389283199-1"
Expires:Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified:Thu, 09 Jan 2014 15:59:59 +0000
Server:Apache
Vary:Cookie,Accept-Encoding
Via:1.1 varnish
X-Drupal-Cache:HIT
X-Powered-By:PHP/5.3.23
X-Varnish:544296535
X-Varnish-Cache:MISS
如果我看一下响应时间,则对同一URL的后续请求的响应时间要快8倍(第一次是800毫秒,第二次是100毫秒,然后再打开)。这使我认为Varnish正在缓存,但是我的vcl是不正确的。
我还应该补充一点,该请求没有发送任何cookie,这是一个GET请求。
最佳答案
您的 VCL 是正确的(顺便说一句:当 Varnish 响应来自缓存 X-Varnish
header 时,带有 2 个数字)。
由于 Drupal 缓存,响应时间得到改善。
由于 cookie 或您的 VCL,可能 JSON 没有被缓存。
您在 https://github.com/NITEMAN/varnish-bites/blob/master/varnish3/drupal-base.vcl 上有一个适用于 drupal 的 VCl
无论如何,要跟踪问题您的完整 VCL 和请求的 varnishlog 跟踪。
关于caching - 带有 json 内容类型的 Varnish 缓存未命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21025535/