让 Varnish 在 POST 请求中缓存的 GET 响应过期

让 Varnish 在 POST 请求中缓存的 GET 响应过期

我正在研究应用程序堆栈的缓存层,并认真考虑使用 Varnish。Varnish 听起来不错,但我的大部分数据不仅是动态的,还需要身份验证才能访问,并且对每个用户都是唯一的。

根据我目前所读的内容,似乎有两种选择:

  1. 当应用程序收到 POST 请求时,我可以将自定义标头附加到来自源服务器的 Varnish 响应中,使用 VCL 对其进行解析,手动使自定义标头指定的现有缓存过期(在我的情况下,通常是对同一资源的 GET 响应),然后在 Varnish 中从响应中删除标头,然后再将其返回给用户。我很确定这是可能的。

  2. 配置/编写 VCL 脚本来执行所有操作,因此当 POST 请求进入并且响应返回状态 200 时,相应资源上的 GET 响应缓存将过期。我不确定这是否可行。

基本上,我想知道:

  1. 在请求其他资源时,是否可以使用 VCL 直接强制缓存响应过期?如果可以的话,请提供代码片段!

  2. 有没有更好的方法?我认为设置 Varnish 来处理缓存唯一响应不会有任何问题,我只需将 API 令牌附加到缓存文件的名称即可。我真正需要的是让应用程序在用户执行更新 GET 的操作 (POST) 时强制 Varnish 过期。

答案1

通常,POST 请求中返回的内容与 GET 请求的输出不同。Varnish 的默认行为是不缓存 POST 请求。但是,回答你的问题:

  1. 这是有可能的。你可以使用禁令来实现这一点:(ban("obj.http.x-url ~ " + req.url);禁令潜伏者友好禁令的示例)

  2. 由于您能够控制应用程序的代码,因此最好的方法是在 Varnish 中设置清除处理程序,然后让您的应用程序向其发出请求(通过 curl)。事实上,您的清除处理程序可能会使用上述禁令,也可能使用return(purge)。禁令通常用于一次使多个对象的缓存无效,而清除会使单个页面无效。

因此,一旦您的应用程序看到 POST 请求,它将(假设您编写了必要的逻辑)向 Varnish 发出 PURGE 请求,并附带需要失效的资源的 URL(不必是相同的 URL)。

相关内容