web-dev-qa-db-ja.com

Varnishで完全なキャッシュをクリアする方法は?

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);
    }
}
8
laurent

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"));
    }

    # ...
}
10
laurent

まあ、私はちょうどニスを再起動することをお勧めします。ニスはキャッシュをメモリに保持するため、すべてのファイルが削除されます。

実行:Sudo /etc/init.d/varnish restart

10
Paulo Victor

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;
3
Joshua DeWald

コマンドラインからすべてのニスキャッシュを削除します(すべてのキャッシュを無効にします)。

varnishadm "ban.url ."  # Matches all URLs

注:コマンドはVarnish 2.xではpurge.urlです。

ホスト名で禁止することもできます:

varnishadm "ban req.http.Host == xxx.com"
2
Ashwin