【问题标题】:How do I make Varnish purge all variants of a URL?如何让 Varnish 清除 URL 的所有变体?
【发布时间】:2012-08-05 18:48:34
【问题描述】:

Varnish 2.1:我正在尝试使用 http PURGE 让 Varnish 更新一个缓存的 URL。

在测试时,我会得到看起来很奇怪的结果,直到我在文档中阅读以下内容:“但是,如果缓存中有相同 URL 的多个变体,则只会清除匹配的变体。清除 gzip 变体同一页面的请求必须如下所示:"

所以现在如果我执行这两个命令:

curl -I http://example.com/my-url
curl -X PURGE http://example.com/my-url

我收到 200 已清除响应。

如果我做这两个:

curl -I http://example.com/my-url -H "Accept-Encoding: gzip"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: gzip"

我也得到了 200 净化。

现在如果我尝试:

curl -I http://example.com/my-url -H "Accept-Encoding: deflate"

我得到表明 Content-Encoding: 是“text/html;charset=utf-8”的标头,并且它在缓存中有年龄。这似乎表明我的应用不支持“放气”,这可能是正确的。

该页面还有一个 Age: 标头,表明它正在被缓存。

现在我该如何清除它? (我在问一个没有实际意义的问题吗?)

所有这些尝试都返回“404 Not in cache”:

curl -X PURGE http://example.com/my-url -H "Accept-Encoding: deflate"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: text/html;charset=utf-8"
curl -X PURGE http://example.com/my-url -H "Accept-Encoding: text/html"

是否有清除 URL 的所有变体的神奇方法?

【问题讨论】:

  • 你的 VCL 是否有 vlc_hitvlc_miss 的条目?
  • 嗯,我换个说法,请原谅我问了一个不恰当的问题。我的意思是问它是否有 purge 条目,用于命中和未命中。
  • 是的,我可以看到它们在第一个和第二个示例中都正确执行。我已经在 PURGE 调用中看到了来自这些例程的已清除和“不在缓存中”的结果。
  • 出于好奇.. 如果您尝试curl -I http://example.com/my-url -H "Accept-Encoding: gzip",然后是curl -X PURGE http://example.com/my-url,您会得到什么?我不确定为什么它在您的示例中不起作用,除了缓存的响应不是页面,但据我了解,仅清除 url 应该清除它的所有实例。话虽如此,我的清漆经验并不丰富。
  • 该测试返回“404 不在缓存中”。如果我重复清除并添加 -H "Accept-Encoding: gzip" 它会返回 "200 Purged"。这几乎就是我的问题的要点——如何清除缓存页面的所有变体。

标签: varnish


【解决方案1】:

啊哈,通过应用一些 google-fu,我偶然发现了一个论坛帖子,其中建议如下:

purge("req.url ~ ^" req.url "$"); 

即在清除后使用正则表达式来处理所有 Accept-Encoding 标头。

更多信息在这里:http://www.gossamer-threads.com/lists/varnish/misc/15124

.. 这意味着你需要修改你的 VCL。

【讨论】:

  • 哦,干得好,先生!我要测试一下。更改 VCL 很好。会回来报告的。
  • 这里有个问题......链接中的示例使用了一个名为“purge()”的调用,但我的 VCL 代码看起来更像这里的教程清除代码:varnish-cache.org/docs/trunk/tutorial/purging.html有一个 purge() 调用,只需将 obj.ttl 设置为 0。
  • 我的意思是 varnish-cache.org/docs/2.1/tutorial/purging.html 涵盖 2.1,而不是 3.0
  • 我的最终解决方案包括升级到 Varnish 3,在 Ubuntu 10 中使用 Chef 是一项不小的壮举
【解决方案2】:

我认为这是你需要的:

acl purge {
        "localhost";
        "192.168.55.0"/24;
}

sub vcl_recv {
        # allow PURGE from localhost and 192.168.55...

        if (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed.";
                }
                return (lookup);
        }
}

sub vcl_hit {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
}

sub vcl_miss {
        if (req.request == "PURGE") {
                purge;
                error 200 "Purged.";
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-03
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2017-07-22
    • 2012-11-14
    • 2018-03-28
    相关资源
    最近更新 更多