0

当 varnish 通过Purgeand使缓存失效时Ban,它是否使用 vcl_hash 中定义的哈希键来帮助查找对象?如果我要通过自定义标头obj.http.page_id而不是本文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);
        }
   }
4

2 回答 2

2

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

然而,PURGE 将执行正常的对象查找,因此您无法使用备用键来执行此操作。

于 2016-02-10T05:38:05.793 回答
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);
}
于 2016-04-27T20:23:45.267 回答