varnish - Varnish 和 WordPress,没有外部插件是否有可能实现真正的缓存?
问题描述
也许这在 Varnish Cache 世界中听起来是一个新手问题,但为什么在 WordPress 中似乎需要安装一个外部缓存插件才能完全缓存?
网站通过 Varnish 正确加载,一个 curl -I 命令:
HTTP/1.1 200 OK
Server: nginx/1.11.12
Date: Thu, 11 Oct 2018 09:39:07 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: max-age=0, public
Expires: Thu, 11 Oct 2018 09:39:07 GMT
Vary: Accept-Encoding
X-Varnish: 19575855
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS
Accept-Ranges: bytes
Pragma: public
Cache-Control: public
Vary: Accept-Encoding
使用此配置,默认情况下不会缓存 WordPress 安装。在测试了多个缓存插件之后——有些不工作,或者没有复杂的配置就不能工作——我发现了 Swift Performance,在他们的 Lite 版本中,只需激活 Cache 选项,这里真的充分利用了所有的优势,在这里我可以看到 varnish 与非常在压力测试中取得了不错的成绩。
这对于单个环境中的单个站点可能没问题,但在共享托管方面,当每个客户都可以拥有自己的 WP(或其他 CMS)安装时可能会出现问题。
所以关键是如果不安装第 3 方缓存(和复杂)插件,就无法充分利用 Varnish 的缓存优势?为什么不默认缓存所有?
任何形式的建议和帮助都将受到高度欢迎,在此先感谢。
解决方案
使用此配置,默认情况下不会缓存 WordPress 安装
默认情况下,如果您在 Wordpress 或 Varnish 配置中都没有更改任何内容,那么一切都会以 Wordpress 页面缓存120 秒的方式协同工作。所以真正的缓存是可能的,但它会是一个短暂的缓存并且非常无效。
您的特定标头表明不应发生缓存。它们要么是由 Varnish 本身发送的(我们都犯了复制粘贴的罪,而不考虑它的作用),要么是 Wordpress 插件(通常是坏的,而不是好的)。在不知道您的具体配置的情况下,很难破译任何东西。
Varnish 是一个透明的 HTTP 缓存代理。这意味着默认情况下,它只会使用由后端(Wordpress)发送的 HTTP 标头来Cache-Control
决定是否可以缓存资源以及缓存多长时间。
POST
事实上,除了一些特定区域(错误页面、登录提交等)之外,Wordpress 不会发送与缓存相关的标头。
此处概述的标准方法是使用最高 TTL 配置 Varnish。接着就,随即:
Varnish 不知道您何时更新文章内容或更改主题。典型的解决方案是使用缓存失效插件,如 Varnish HTTP Purge。
当内容发生变化时,插件需求来自于清除缓存的必要性。
假设您更新了一个 Wordpress 页面的文本。您之前访问过相同的页面,它进入 Varnish 缓存进行存储。下次访问时会发生什么,Varnish 将为所有下一次访问者提供相同的、现在陈旧的内容。
Varnish 的 Wordpress 插件,如 Varnish HTTP Purge,将连接到 Wordpress,它们将指示 Varnish 在页面更新时清除缓存。这是他们的主要目的。
这种方法(高 TTL 和缓存清除)是 Varnish 的事实上的标准。由于 Varnish 没有关于何时更新内容的信息,因此清除缓存的内部工作与应用程序本身有关。缓存清除功能或者捆绑到 CMS 代码本身(例如 Magento 2,它是开箱即用的,没有任何额外的插件),或者是 Wordpress 插件。
推荐阅读
- python - 如何从 Python 中的 .txt 文件打印单个列表?
- angular - 如何在 ng2-smart-table 中获取过滤后的行数据值
- scala - 性能在 Cassandra 中写入许多记录(例如 2000000)?
- perl - 打印 perl FTP 消息
- typescript - 为 Visual Studio Code 禁用 tsserver?
- javascript - 不读取 javascript 文件
- android-studio - 如何从 Play 商店打开已发布的应用程序?
- javascript - 将 .graphql 中的类型导入 .js 文件
- javascript - 具有父级和 this 关键字的复合选择器
- javascript - 在 React 中设置标记超时