VarnishのすべてのドメインとすべてのURLのキャッシュをクリアする方法を探しています。
現在、各URLに対して個別のコマンドを発行する必要があります。たとえば、次のとおりです。
curl -X PURGE http://example.com/url1
curl -X PURGE http://example.com/url1
curl -X PURGE http://subdomain.example.com/
curl -X PURGE http://subdomain.example.com/url1
// etc.
私が何かをする方法を探している間
curl -X PURGE http://example.com/*
これにより、example.comのすべてのURLがクリアされますが、example.comのサブドメイン内のすべてのURL、基本的にVarnishが管理するすべてのURLもクリアされます。
これを達成する方法はありますか?
これは私の現在のVCLファイルです:
vcl 4.0;
backend default {
.Host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
# Command to clear the cache
# curl -X PURGE http://example.com
if (req.method == "PURGE") {
return (purge);
}
}
Varnish 4.0では、ban
コマンドを使用して実装しました。
sub vcl_recv {
# ...
# Command to clear complete cache for all URLs and all sub-domains
# curl -X XCGFULLBAN http://example.com
if (req.method == "XCGFULLBAN") {
ban("req.http.Host ~ .*");
return (synth(200, "Full cache cleared"));
}
# ...
}
まあ、私はちょうどニスを再起動することをお勧めします。ニスはキャッシュをメモリに保持するため、すべてのファイルが削除されます。
実行:Sudo /etc/init.d/varnish restart
URLまたは内部キャッシュキーの変更がないと仮定すると、フルフラッシュの場合、最も単純な方法はVarnishを再起動し、キャッシュをメモリに保持することです。
クイックリスタートを実行できない場合、Rastislavによって提案されたBANは素晴らしいアプローチです。 TTLが最長である限りアクティブである必要があるため、フルフラッシュが頻繁に必要な場合は、BANのリスト(ほとんど関係のないBANをスイープする)が常にBAN便利です
したがって、あなたの場合、VCLは次のようになります。
# Highly recommend that you set up an ACL for IPs that are allowed
# to make the BAN call
acl acl_ban {
"localhost";
"1.2.3.4"/32;
}
sub vcl_recv {
if (client.ip ~ acl_ban && req.method == "BAN") {
ban("req.http.Host == " + req.http.Host);
# Throw a synthetic page so the request won't go to the backend.
return(synth(200, "Ban added"));
}
}
ただし、コメントでCarlosが述べているように、これは実際にlazy無効化を作成します(したがって、要求時にのみ削除されます)。オブジェクトを実際に background ban lurker で完全に消去したい場合は、代わりに以下を実行できます。
# Highly recommend that you set up an ACL for IPs that are allowed
# to make the BAN call
acl acl_ban {
"localhost";
"1.2.3.4"/32;
}
sub vcl_recv {
if (client.ip ~ acl_ban && req.method == "BAN") {
# see below for why this is obj. rather than req.
ban("obj.http.Host == " + req.http.Host);
# Throw a synthetic page so the request won't go to the backend.
return(synth(200, "Ban added"));
}
}
sub vcl_backend_response {
# add any portions of the request that would want to be able
# to BAN on. Doing it in vcl_backend_response means that it
# will make it into the storage object
set beresp.http.Host = bereq.http.Host;
}
sub vcl_deliver {
# Unless you want the header to actually show in the response,
# clear them here. So they will be part of the stored object
# but otherwise invisible
unset beresp.http.Host;
}
次に、フラッシュを実行します。
curl -X BAN http://example.com;
コマンドラインからすべてのニスキャッシュを削除します(すべてのキャッシュを無効にします)。
varnishadm "ban.url ." # Matches all URLs
注:コマンドはVarnish 2.xではpurge.urlです。
ホスト名で禁止することもできます:
varnishadm "ban req.http.Host == xxx.com"