【问题标题】:How to invalidate varnish cached object with Ban expression如何使用 Ban 表达式使清漆缓存对象无效
【发布时间】:2021-08-25 03:42:50
【问题描述】:

考虑我请求的网址是www.example.com/foo/emplooyee?names = test1;test2。 varnish 将整个 URL 与查询参数一起存储,以唯一标识缓存。

现在,在我的后端,我正在运行一项服务,我应该将其配置为每当 名称(即 test1 或 test2)发生更改时应该触发 HTTP 禁令一个较旧的名称(禁止表达式中一次一个名称)以使所有以相似名称输入的缓存 URL 无效。

问题: 我的客户请求网址可能是这样的,

如何编写VCL代码并在Ban表达式中使所有查询参数为test1的对象无效?

【问题讨论】:

    标签: regex varnish cache-control varnish-vcl


    【解决方案1】:

    这是封禁所需的 VCL 代码:

    vcl 4.1;
    
    acl purge {
        "localhost";
        "192.168.55.0"/24;
    }
    
    sub vcl_recv {
        if (req.method == "PURGE") {
            if (!client.ip ~ purge) {
                return(synth(405));
            }
            if(!req.http.x-invalidate-pattern) {
                return(purge);
            }
            ban("obj.http.x-url ~ " + req.http.x-invalidate-pattern
                + " && obj.http.x-host == " + req.http.host);
            return (synth(200,"Ban added"));
        }
    }
    
    sub vcl_backend_response {
        set beresp.http.x-url = bereq.url;
        set beresp.http.x-host = bereq.http.host;
    }
    
    sub vcl_deliver {
        unset resp.http.x-url;
        unset resp.http.x-host;
    }
    

    这是一个示例 HTTP 请求,用于使查询字符串中包含 test1 值的所有请求无效:

    PURGE / HTTP/1.1
    Host: www.example.com
    X-Invalidate-Pattern: ^/foo/emplooyee\?names=([^;]+;)*test1(;[^;]+)*$
    

    这是来自curl的相同请求:

    curl -XPURGE -H'X-Invalidate-Pattern: ^/foo/emplooyee\?names=([^;]+;)*test1(;[^;]+)*$' http://www.example.com
    

    此 VCL sn-p 可以灵活地通过禁止从缓存中删除多个项目,但如果您不通过 X-Invalidate-Pattern 标头设置模式,它只会从缓存中删除 URL 本身。

    这是一个示例,我们只是从缓存中删除 http://www.example.com/foo/emplooyee?names=test1

    curl -XPURGE 'http://www.example.com/foo/emplooyee?names=test1'
    

    不要忘记修改 VCL 代码中的 acl 块并添加正确的 IP 地址或 IP 范围。

    【讨论】:

    • 谢谢@Thijs Feryn,它的工作方式完全符合我的需要。
    • 当试图禁止缓存对象中不存在的东西时会发生什么?会不会只是 ban.list 中的一个新条目?
    • 确实,它会被添加到禁用列表中,并且在没有对象匹配它时会在一段时间后消失。添加禁令后添加的任何对象都将与禁令不匹配。长话短说:别担心,你很安全。
    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多