在我们的 varnish 配置中我们有一个 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(到目前为止一切正常)。
我期望的是,在 1 小时过去之前,会反复点击,在 1 小时时会错过一次,然后再次点击一小时。换句话说,因为我反复点击同一个 URL,所以它应该每 1 小时在点击和错过之间循环一次。
我看到的是这样的:
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,如果有帮助的话。
答案1
因此,有问题的 varnish 服务器正在缓存 Drupal 7 站点。在 Drupal 7 站点中,我们配置并启用了 Drupal Varnish 模块。
据我所知,这是定期清除缓存。我能够使用以下命令确定这一点,并查看我未发布的 BAN:
varnishadm -T localhost:6082 -S /etc/varnish/secret ban.list
Present bans: 1371834738.031740 193 req.http.host ~ www.ourdomain.com && req.url ~ /