同时使用 Varnish 和浏览器缓存是否有意义?

同时使用 Varnish 和浏览器缓存是否有意义?

我有点困惑,不知道使用 Varnish 的最佳做法是什么:我看到很多网站都在使用 Varnish,并且Cache-Control: no-store, no-cache, must-revalidate启用了 HTTP 标头。他们的网站内容很长时间没有变化了 - 那么他们为什么不使用浏览器缓存呢?也许他们想更好地控制内容,如果他们需要快速更改某些内容,否则浏览器缓存中的内容就会处于陈旧状态?

所以,基本上我想知道我是否应该利用 Varnish 和浏览器缓存,或者只为提供不变内容的网站使用 Varnish?这里有任何规则吗?什么是“最佳实践”?通常我会选择 Varnish 和浏览器缓存,但我看到的上述网站让我对此感到困惑。

答案1

您应该同时使用两者,这是两件完全不同的事情。

  • 浏览器缓存是计算机中的缓存。其主要目的是节省带宽,通过使用已查看/下载的资产来减少延迟。
  • Varnish 缓存是托管网站的服务器上的缓存。其主要目的是减少服务器因运行 CPU 密集型脚本(例如 PHP)而产生的压力

两个缓存可以具有不同的缓存条目生存期/不同的缓存策略,这没问题。这取决于您缓存的资源的性质。

页面(HTML)

仅仅因为您Cache-Control: no-store, no-cache, must-revalidate在检查网站时看到了例如通过curl,并不意味着没有 Varnish 并且它不会缓存东西。

以 Magento 2 为例。Magento 本身发送:

Cache-Control: max-age=86400, public, s-maxage=86400

这是什么看到的。因此,Varnish 会将页面缓存 1 天。然而,在 Magento 2 的 Varnish VCL 中,它会Cache-Control在退出时进行修改,以确保浏览器根本不缓存。因此,等着瞧:

Cache-Control: no-store, no-cache, must-revalidate, max-age=0

原因如下:

  • 为了确保消除 PHP 引擎的繁重负担,Varnish 会缓存页面并从其缓存中提供它们
  • 浏览器必须始终获取最新页面(我们指的是产品页面等),因此它们根本不应该缓存
  • 当产品页面更新时(由管理员更新),Magento 会与 Varnish 通信以清除缓存页面。出于显而易见的原因,它无法对浏览器缓存说“将我从缓存中删除”,这就是浏览器不应该缓存页面的原因

静态资产

在浏览器中

您通常希望通过浏览器缓存静态资产,这就是为什么对于此类资源,您会看到 Far Future Expires 标头,如下所示:

Expires: Sat, 03 Aug 2019 14:24:01 GMT
Cache-Control: public, max-age=30672000

清漆

对于这些资源,许多人喜欢将 Varnish 配置为不缓存它们。这是因为 PHP 不需要繁重的工作来通过服务器发送这些文件,因此将它们缓存在服务器上根本没有意义。特别是考虑到 Varnish 缓存默认使用 RAM 存储后端(您可以对缓存进行静态文件分区尽管)。

答案2

“如果他们需要快速更改某些内容,也许他们希望更好地控制内容,否则浏览器缓存中的内容就会处于陈旧状态?”

你现在就回答了你自己的问题 ;)

发布新内容时,让无法控制的缓存失效是一件很麻烦的事,而快速让旧缓存失效则对快速推出新内容大有裨益。如果您不想或不必担心这一点,您可以让浏览器缓存以减少基础设施的负载。

相关内容