Varnish 4 在清除或禁止时是否使用哈希键查找 objects?
Does Varnish 4 use hash key to look up objects when purging or banning?
当 varnish 通过 Purge
和 Ban
使缓存无效时,它是否使用 vcl_hash 中定义的散列键来帮助查找 objects?如果我要通过自定义 header 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);
}
}
如果您正在执行 BAN,则它不需要匹配哈希,因为 BAN 将在查找对象时应用。
但是,PURGE 将进行正常的对象查找,因此您无法使用备用键进行查找。
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);
}
当 varnish 通过 Purge
和 Ban
使缓存无效时,它是否使用 vcl_hash 中定义的散列键来帮助查找 objects?如果我要通过自定义 header 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);
}
}
如果您正在执行 BAN,则它不需要匹配哈希,因为 BAN 将在查找对象时应用。
但是,PURGE 将进行正常的对象查找,因此您无法使用备用键进行查找。
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);
}