logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

缓存标签 + Varnish

03/10/2025, by Ivan

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 时开始使页面失效!

本文档中的部分说明改编自以下来源: