我需要使与已删除/未发布或更新的资源相关的一组 URL 的缓存无效。例如,如果我的资源 UUID 是1234abcd
我想在/resource/1234abcd/*
.
我知道在 Varnish 中无法使用 来做到这一点purge
,但可以通过禁令来做到这一点。但是我很难理解禁令是如何运作的。
例如,如果我更新资源1234abcd
并禁止其所有衍生物,我假设下一个客户端请求/resource/1234abcd/derv1
将是一个新的后端获取,并且新资源将被缓存。我会有两个版本的同一个衍生品,一个被禁止,一个没有(直到旧版本到期,最终它的禁令也到期)?如果我的资源有很长的到期日期,我可能会积累很多我宁愿立即清除的缓存资源禁令。
在软件设计级别上,留下无法访问的资源而不是实施基于正则表达式的清除有什么用处,这似乎更易于管理?
另外,我在我的开发环境中实施了禁令,我看到禁令只在被请求后一分钟左右生效。这是否与禁令潜伏者或其他一些时间设置有关?
谢谢。
禁令和禁令清单
Varnish 中的禁令是根据所谓的禁令列表完成的。禁止列表中的项目与理想匹配缓存对象属性的特定标准匹配。
ban lurker是一个监控禁令列表的单独线程,负责删除匹配的对象。
禁止和正则表达式 url 匹配
在大多数情况下,您需要匹配需要失效的 URL 模式。
一个简单的方法是发布以下禁令:
这个例子的问题是请求范围:ban lurker 只能访问对象及其属性。请求信息不是其中的一部分,因为一个对象只包含响应信息。
在这种情况下,潜伏者不会匹配禁止列表中的项目,并且该项目将保留在缓存中,直到下一个用户点击匹配的 URL。这效率不高。
对潜伏者友好的禁令
我们用来绕过这些范围限制的一个技巧是在响应中添加主机和url信息。
以下是如何执行此操作:
然后,您可以运行以下禁令:
潜伏者将能够匹配这些属性,并将匹配的对象从缓存中远程,而不需要发生请求。
潜伏者何时从缓存中删除对象?
该
varnishd
二进制文件有几个运行时设置会影响禁令潜伏者如何处理禁令:如何发布禁令
您可以通过 3 种方式发布禁令:
varnishadm
本地二进制文件这是一个
varnishadm
例子:有关远程CLI调用的更多信息,请查看:http: //varnish-cache.org/docs/6.0/reference/varnish-cli.html#varnish-command-line-interface
这是一个HTTP示例:
在这个HTTP示例中,我们结合了purging和banning。
curl发出的定期清除如下所示:
使用bans的更灵活的正则表达式清除将像这样发布:
禁令问题
禁止并非没有问题。
禁令的整个概念围绕着将列表中的模式与存储在缓存中的对象进行匹配。
如此大的禁止列表和大量对象可能会导致大量 CPU 开销
URL 上的标签
禁令的另一个用例是基于标签的失效。
有时很难将实体更改转换为匹配的 URL。有时您甚至不知道实体更改会影响哪些 URL。
在这种情况下,标记内容并使匹配这些标记之一的对象无效更有意义。
在您的应用程序中,您将发出如下响应标头:
如果您想删除属于产品类别的所有资源,您可以简单地发出以下禁令:
基于标签的失效的更好解决方案
如果您计划将禁令用于基于标签的失效,如果您的禁令列表增长得很快,并且您在缓存中有太多需要验证的对象,您将遇到相同的 CPU 问题。
一个更好的解决方案是使用Varnish 模块,它是Varnish 模块集合
xkey
附带的。有关更多信息,请参阅https://github.com/varnish/varnish-modules/blob/master/src/vmod_xkey.vcc。你必须编译这个模块,但是 API 更灵活,性能也好很多。