如何设置清漆缓存控制头

Posted

技术标签:

【中文标题】如何设置清漆缓存控制头【英文标题】:How to Set Varnish Cache-Control Headers 【发布时间】:2012-02-19 01:33:54 【问题描述】:

我希望有人可以建议让 Varnish 发送缓存控制标头的正确方法。目前,我的配置正在向客户端发送 "Cache-Control: no-cache"

提前感谢任何可能提供帮助的人...

【问题讨论】:

如果你解释你想要什么可能会有所帮助。哪个配置(清漆或您的后端)发送无缓存标头?您可以在 Varnish 中覆盖这些标头,但这是否“正确”取决于您的响应的语义(它们是否可重用、在客户端上使用、持续多长时间等)。 @ivy,感谢您的回复。我想要完成的是让 Varnish 发送我手动指定的缓存控制标头,而不管后端向 Varnish 发送什么。 【参考方案1】:

[ivy] 有很好的建议,并且/但是当您尝试服从最终用户(浏览器)缓存的服务器意图时,它会变得有点复杂。我发现this resource 有助于理解一种配置 Varnish 以保持缓存的时间超过浏览器被指示的时间...

https://www.varnish-cache.org/trac/wiki/VCLExampleLongerCaching

【讨论】:

【参考方案2】:

根据文档,Varnish 忽略 Cache-Control: nocache。这里有证据证实:

http://drupal.org/node/1418908

要获得该结果,您应该从后端检测标头 Cache-Control .nocache.,然后使缓存无效,将后端响应设置为不可缓存,或发出 max-age: 0 在另一个标题中(我现在忘记了名字)。

【讨论】:

此问题现已关闭。我认为发帖人意识到他犯了一个错误。【参考方案3】:

您的后端正在向 Varnish 发送“Cache-Control: no-cache”,这意味着两件事:

Varnish 不会将响应存储在缓存中(因此下一次查找将失败) 您的客户端(浏览器和中间代理)不会缓存响应(并反复请求它们)。

解决方案很简单:在从后端获取响应之后(以及在将它们存储到缓存中之前)移除缓存控制标头。

在你的 vcl 文件中做:

sub vcl_fetch 
  remove beresp.http.Cache-Control;
  set beresp.http.Cache-Control = "public";

您可以选择仅对某些 url 执行此操作(将其包装在 ( if req.url ~ "" ) 逻辑中)并执行更高级的操作。

【讨论】:

从 Varnish 4.0 开始,vcl_fetch 被替换为 vcl_backend_response 从 Varnish 6.5 开始,remove 被替换为 unset

以上是关于如何设置清漆缓存控制头的主要内容,如果未能解决你的问题,请参考以下文章

如何清除清漆中的完整缓存?

Haproxy 在清漆前还是相反?

HTTP缓存控制 总结

如何合并这两个清漆后端?

页面的缓存与不缓存设置

wget --mirror 不创建清漆缓存