滚动
缓存标签 + Varnish
Varnish Cache 是一种 Web 应用加速器,也称为 HTTP 缓存反向代理。Varnish 被成千上万个 Drupal 站点使用,可以将页面加载性能提高 10-1000 倍,并且它可以与缓存标签结合使用,从而简化缓存失效操作。
要实现缓存标签的基础集成,你需要做三件事,以确保 Varnish 能够正确处理 Drupal 生成的缓存标签:
- 更新 Varnish VCL,以便它能正确处理 BAN 请求。
- 发送缓存标签头部(例如 X-Cache-Tags),该头部会在每个请求中包含页面的所有缓存标签,并以空格分隔。
- 当内容或配置更新时,发送带有相应缓存标签的 BAN 请求,这样相关缓存标签的页面就会失效。
更新 Varnish VCL
Symfony 的 FOSHttpCache 包含非常好的VCL 修改文档,说明了如何支持缓存标签。但以下是让 Varnish 4.x 开始运行所需的最小 VCL 修改:
在 vcl_recv 中:
sub vcl_recv {
...
# 仅允许来自 'purge' ACL 中 IP 地址的 BAN 请求。
if (req.method == "BAN") {
# 与上面的 ACL 检查相同:
if (!client.ip ~ purge) {
return (synth(403, "Not allowed."));
}
# 使用 X-Cache-Tags 头部的 ban 逻辑。
if (req.http.X-Cache-Tags) {
ban("obj.http.X-Cache-Tags ~ " + req.http.X-Cache-Tags);
}
else {
return (synth(403, "X-Cache-Tags header missing."));
}
# 返回一个合成页面,这样请求就不会进入后端。
return (synth(200, "Ban added."));
}
}
在 vcl_backend_response 中:
sub vcl_backend_response {
# 设置 ban-lurker 友好的自定义头部。
set beresp.http.X-Url = bereq.url;
set beresp.http.X-Host = bereq.http.host;
...
}
在 vcl_deliver 中:
sub vcl_deliver {
# 在传递给客户端时移除 ban-lurker 自定义头部。
unset resp.http.X-Url;
unset resp.http.X-Host;
# 在开发中调试 Drupal 缓存标签时,可以注释掉下面几行。
unset resp.http.X-Cache-Tags;
unset resp.http.X-Cache-Contexts;
...
}
在对 VCL 做出相应修改后,请务必重启 Varnish!
发送缓存标签头部
你可以启用以下模块之一,让 Drupal 输出包含缓存标签的 HTTP 头部:
| 项目 | 模块 | 头部 |
| Varnish Purger | Varnish Purger Tags (varnish_purge_tags) | Cache-Tags |
| Generic HTTP Purger | Generic HTTP Tags Header (purge_purger_http_tagsheader) | Purge-Cache-Tags |
注意:在 8.x-3.0-beta5 之前的一些版本中,Purge 模块会自动配置 Purge-Cache-Tags 头部,但后来被移除,因为决定将责任转交给子模块。
在内容或配置更改时发送 BAN 请求
使用 Generic HTTP Purger 模块时,你可以进入 Purge 配置页面 (admin/config/development/performance/purge) 并添加 HTTP Purger。
输入你的 Varnish 服务器信息(主机名、端口、路径等),并在“Headers”配置中添加如下设置:
- Header: X-Cache-Tags
- Value: [invalidation:expression]
一旦保存该 Purge 配置,并配置好 cron 任务以处理清理队列 (drush p-queue-work),Varnish 就会在清理队列触发 BAN 时开始使页面失效!
本文档中的部分说明改编自以下来源: