我有点困惑,不知道使用 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
“如果他们需要快速更改某些内容,也许他们希望更好地控制内容,否则浏览器缓存中的内容就会处于陈旧状态?”
你现在就回答了你自己的问题 ;)
发布新内容时,让无法控制的缓存失效是一件很麻烦的事,而快速让旧缓存失效则对快速推出新内容大有裨益。如果您不想或不必担心这一点,您可以让浏览器缓存以减少基础设施的负载。