尽可能长时间地缓存对象

尽可能长时间地缓存对象

根据这本书,Varnish 自动使过期对象失效。 经过使无效,我理解移除一旦这些对象过期,我们就从数据存储中删除它们。

有没有办法指示 Varnish 永远保留这些过期的对象,只有在需要存储新对象时才使最旧的对象无效?

保留过期的对象很重要,因为它们仍然可以在原始服务器上重新验证,304如果它们仍然有效,则可以返回响应(从而避免新的传输)。

我读到过宽限模式允许保留超出其 TTL 的对象:

sub vcl_fetch {
  set beresp.grace = 30m;
}

如果我将宽限模式设置为 1 年左右,它会按我想要的方式工作吗?

  • 它会与原始服务器重新验证过期的对象吗?
  • 当需要为新对象腾出空间时,它会自动删除最旧的对象吗?

答案1

根据评论内容总结:

If I set the grace mode to something like 1 year, will it work as I want?
will it revalidate the expired objects with the origin server?

不完全是。它会重新验证过期的对象,但会异步进行。当请求到达 varnish 并且对象已过期但处于宽限期内时,会立即返回过期的对象,然后使用“如果自此之后已修改”请求刷新该对象到后端。这似乎就是您想要的,除了提供过期的对象。

will it automatically delete the oldest object when it needs to make room for a new one?

当 Varnish 需要空间时,它会清除对象,但即使对象仍然存储在某处,如果它已过期,那么它将不会提供给客户端(除非处于宽限模式)

Is there a way to instruct Varnish to keep these expired objects forever, to only invalidate the oldest ones when a new object needs to be stored?

我认为除了宽限期之外,没有其他方法可以让 Varnish 保留陈旧的对象。

bgfetch我检查了我的 varnish 生产 (v4.1) 日志,只在(宽限期内异步刷新) 和的情况下看到 IMS 后端请求pass。每当 VarnishMISS缓存中的对象时,提取都是在没有 IMS 标头的情况下完成的。

答案2

您是否正在通过 主动使缓存对象失效ban?比起一年的宽限期,您更需要 ;)。

问候,

巴斯蒂安

相关内容