根据这本书,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
?比起一年的宽限期,您更需要 ;)。
问候,
巴斯蒂安