varnish vcl有选择地清除缓存

时间:2012-04-07 11:53:29

标签: varnish varnish-vcl

所以我第一次使用清漆。我花了很长时间阅读它是如何工作的,但我无法弄清楚如何有选择地清除缓存。

就像说我有这样的网址

/?account=123&url=google.com

和另一个像

/?account=123&url=stackoverflow.com

我需要清除缓存account=123

我只能弄清楚发布清除

/帐户= 123&安培; URL = stackoverflow.com

只会使用PURGE方法清除网址与传入网址匹配的缓存。

感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

所以这才有效。在清漆3中​​,选择性吹扫称为禁令。所以你需要使用

ban("obj.http.x-url ~ " + req.url);

答案 1 :(得分:3)

我们遇到了类似的问题,并最终使用单独的X-Purge-Regex-URL请求标头来使用HTTP请求清除内容。

以下是我们用来实现此目的的VCL:

acl purge {
  "localhost";
  "10.1.1.0"/28;
}

sub vcl_recv {
  if (req.http.X-Purge-Regex-URL) {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    ban_url(req.url);
    error 200 "Banned URL";
  }
}

在您的情况下,我们可以使用curl -H "X-Purge-Regex-URL: True" --head "http://my.host.addr/?account=123"

清除内容

请注意ban_url()不关心HTTP主机。它清除所有主机的所有匹配URL。如果这不是你想要的,你应该使用ban()来禁止使用req.http.hostreq.url

答案 2 :(得分:1)

HTTP PURGE方法允许您清除特定网址。

要使用regexp进行清除,您必须使用telnet连接到varnish管理端口或使用命令行工具varnishadm。

通常你可以通过

这样做
telnet localhost 6082

使用telnet,连接到varnish服务器后,可以使用purge命令进行清除:

purge req.url ~ /?account=123
上面的

将清除匹配“/?account = 123”

的每个网址

如果要像使用HTTP PURGE请求一样清除特定页面,则必须使用双等号而不是波浪号(〜)

purge req.url == /?account=123

你也可以用

清除整个域名
purge req.http.host == yourdomain.com

或您网域上的特定网页:

purge req.http.host == yourdomain.com && req.url ~ /?account=123

答案 3 :(得分:0)

我不是Varnish专家,但这对我有用:

acl purge {
  "localhost";
  "10.1.1.0";
}

sub vcl_recv {
  if (req.http.X-Purge-Regex-URL) {
    if (!client.ip ~ purge) {
      error 405 "Not allowed.";
    }
    ban_url(req.url);
    #error 200 "Banned URL";
  }
}

请注意,我评论了error 200 "Banner URL" - 在我的情况下导致问题。