Varnish 4在清除或禁止时是否使用哈希键查找对象?

时间:2016-01-25 05:30:43

标签: varnish varnish-vcl varnish-4

当varnish通过PurgeBan使缓存无效时,它是否使用vcl_hash中定义的哈希键来帮助查找对象?如果我要通过自定义标头obj.http.page_id而不是article推荐的obj.http.url来使缓存无效,是否会影响性能,因为哈希键不会使用http.page_id?我在文档中没有看到任何提及,但是在使用新方法之前想要说清楚。

   sub vcl_recv {

      if (req.method == "PURGE") {

        if (!client.ip ~ purge) {

            return (synth(405, "Not allowed."));
        }

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

        return (purge);
      }
   }

   sub vcl_hash {
        hash_data(req.url);
        if (req.http.host) {
            hash_data(req.http.host);
        } else {
            hash_data(server.ip);
        }
   }

2 个答案:

答案 0 :(得分:1)

如果您正在执行BAN,那么它不需要匹配哈希,因为在查找对象时将应用BAN。

然而,PURGE会进行正常的对象查找,因此您无法使用备用密钥进行查找。

答案 1 :(得分:1)

BAN比PURGE更重要。 PURGE必须与从vcl_hash()返回的值完全匹配obj。 BAN可以使用正则表达式并放在BAN列表中。每个进入的请求都必须检查BAN列表以确定缓存是否包含陈旧数据。如果BAN的数量变得太大,则遍历每个请求的BAN列表可能导致性能下降。好消息是BAN被ban-lurker-thread删除,该线程遍历缓存并将缓存中对象的时间戳与BAN请求的时间戳进行比较。如果没有缓存对象的时间戳早于BAN请求与BAN的正则表达式匹配,则BAN将从列表中删除,因为它不再有用。

为PURGE和BAN设置单独的条件可能很有用:

if (req.method == "BAN")
{
    // TODO: Add client validation as needed
    ban("obj.http.x-url ~ " + req.url);
    return(synth(901, "BAN Set for " + req.url));
}

if (req.method == "PURGE")
{
    // TODO: Add client validation as needed
    return(purge);
}