在我们的清漆配置中,我们有一个 vcl_fetch 函数定义如下:
if (beresp.ttl > 0s) {
/* Remove Expires from backend, it's not long enough */
unset beresp.http.expires;
/* Set the clients TTL on this object */
set beresp.http.cache-control = "max-age=900";
/* Set how long Varnish will keep it */
set beresp.ttl = 1h;
/* marker for vcl_deliver to reset Age: */
set beresp.http.magicmarker = "1";
}
然后在 vcl_deliver 中:
if (resp.http.magicmarker) {
/* Remove the magic marker */
unset resp.http.magicmarker;
/* By definition we have a fresh object */
set resp.http.age = "0";
}
问题是,如果我设置一个脚本(shell 脚本或 php 脚本)来访问相同的 URL,我首先会看到一个 MISS,然后是一个 HIT(到目前为止一切正常)。
我期望坐的是重复 HITS 直到 1 小时标记过去,在 1 小时标记处有一个 MISS,然后再次进行一小时的 HIT。换句话说,因为我重复点击同一个 URL,它应该每 1 小时在 HIT 和 MISS 之间循环一次。
相反,我看到的是这样的:
6/20/2013 6:30:05 - STRING HIT NOT FOUND
6/20/2013 10:32:11 - STRING HIT NOT FOUND
6/21/2013 12:33:06 - STRING HIT NOT FOUND
6/21/2013 2:34:06 - STRING HIT NOT FOUND
现在是凌晨 5 点 57 分(距离未找到 HIT 已近 4 小时)。
上面的缓存未命中确实都出现在半小时左右,但它们相隔 4 小时、2 小时和 2 小时,并且 TTL 设置为 1 小时。
所以我不明白为什么这个对象被保存超过 1 小时以及为什么它以看似随机的间隔被驱逐。我怎样才能更好地确定发生了什么?
顺便说一下,如果有帮助,我正在使用清漆 3。
所以有问题的清漆服务器正在缓存一个 Drupal 7 站点。在 Drupal 7 站点中,我们配置并启用了 Drupal Varnish 模块。
据我所知,这是定期清除缓存。我能够确定使用以下命令并查看我未发布的 BAN: