ワイルドカードパージ

ワイルドカードによるパージでは、ディレクトリブランチや URL パスの下にあるすべてのページのキャッシュを一括削除することができます。例えば、「/service」パスの下にあるすべてのページのキャッシュを空にしたい場合などに利用します。Fastly API や Fastly アプリを使用して、各 URL を1つずつパージするのはあまり効率的ではありません。

Fastly にはワイルドカードパージ機能そのものはありませんが、サロゲートキーを使用してわずかな設定変更を行うことで、同じ動作を実装することができます。サロゲートキーを使用すると、オブジェクトのグループにキーワード (キー) をタグ付けし、コントロールパネルまたはカスタム VCL 経由でキーを使用して複数のコンテンツを一度にパージすることができます。

ワイルドカードのパスに基づいてコンテンツをパージするには、以下の手順に従ってください。

コントロールパネル経由でのパージ

コントロールパネル経由でワイルドカードパスに基づいてコンテンツをパージするには、以下の手順に従ってください。

デフォルトのワイルドカードヘッダーの作成

デフォルトのワイルドカードを設定することで、他のサロゲートキーを URL パスに追加できる柔軟性を確保できます。

  1. Fastly コントロールパネルにログインします。
  2. All services ページから、該当するサービスを選択します。検索ボックスを使用して ID、名前、またはドメインで検索することができます。
  3. Edit configuration ボタンをクリックし、アクティブなバージョンをクローンするオプションを選択します。ドメインページが表示されます。
  4. Content をクリックします。Content ページが表示されます。
  5. Create header ボタンをクリックします。Create a header ページが表示されます。

    デフォルトのワイルドカードヘッダー作成の設定

  6. 以下の要領で Create a header ページの各フィールドに入力します。
    • Name フィールドに Default Wildcard と入力します。この名前は Fastly コントロールパネルに表示されます。
    • Type メニューから Cache を選択し、Action メニューから Set を選択します。
    • Destination フィールドに http.Surrogate-Key と入力します。
    • Source フィールドに "" と入力します。
    • Ignore if set メニューから No を選択します。
    • Priority フィールドに 10 と入力します。
  7. Create ボタンをクリックします。Content ページの Headers セクションに新しいヘッダーが表示されます。

パージする各ワイルドカードのパスにヘッダーを作成する

次に、パージできるようにする必要がある各ワイルドカードのパスにヘッダーを作成します。例えば、/*/foo のワイルドカードのパスをパージしたいとします 。

  1. Create header ボタンをクリックして新しいヘッダーを作成します。

    パージされるパスのワイルドカードヘッダー

  2. 以下の要領で Create a header ページの各フィールドに入力します。
    • Description フィールドに /*/foo Wildcard と入力します。この名前は Fastly コントロールパネルに表示されます。
    • Type メニューから Cache を選択し、Action メニューから Append を選択します。
    • Destination フィールドに http.Surrogate-Key と入力します。
    • Source フィールドに " */foo" と入力します。Source フィールドのアスタリスクの前にスペースがありますが、これは複数のサロゲートキーを URL に付加する際に重要です。
    • Ignore if set メニューから No を選択します。
    • Priority フィールドに 20 と入力します。
  3. Create ボタンをクリックします。Content ページの Headers セクションに新しいヘッダーが表示されます。

Action が Append に設定され、デフォルトのワイルドカードサロゲートキーに追加されていることにご注目ください。Priority は20に設定されており、デフォルトのワイルドカードのヘッダーが最初に実行され、その後にワイルドカードパスが追加されます。

パージする各ワイルドカードパスに条件を設定する

最後に、パージできるようにする必要がある各ワイルドカードのパスに条件を設定します。

  1. ワイルドカードのパスのヘッダー名の横にある Attach a condition をクリックします。Create a new cache condition ウィンドウが表示されます。

    新しい条件を設定するウインドウ

  2. 以下の要領で Create a new cache condition ウィンドウの各フィールドに入力します。
    • Name フィールドに /*/foo Wildcard Condition と入力します。
    • Apply if フィールドに req.url ~ "^/[^/]*/foo$" と入力します。
  3. Save and apply to ボタンをクリックすると、新しい条件が作成されます。

この場合の条件について見てみましょう。上記の Apply if フィールドでは、最初の "^""$" が Fastly に以下のパターンを探すように指示しています。

  • リクエストの Host ヘッダーの後の最初のスラッシュから始まる。
  • ディレクトリは1つのみ。
  • URL の終わりの /foo のパスが後に続く。

例としては、/a/foo/bar/foo/c/foo などがあります。また、最初の "^"">"$" を削除して条件をより一般的なものにし、URL パスの途中で発生したパターンも対象にすることができます。

その他の URL ワイルドカードの条件の例

Apply if フィールド マッチしたパターン
req.url ~ "/[^/]*/foo" /delta/wow/a/foo/neat/cool/img.gif
req.url ~ "^/.*/foo$" /a/b/c/d/e/f/foo

ワイルドカードのパージ

ワイルドカードをパージする必要がある場合があります。コントロールパネルで以下の手順に従うことで、これを行うことができます。

  1. Fastly コントロールパネルにログインします。
  2. Purge メニューから Purge Key を選択します。

    パージメニュー

    Purge Key ウィンドウが表示されます。

  3. Keys フィールドに、パージしたいサロゲートキーを入力します。上記の例で言うと、New Header ウィンドウの Source フィールドで入力した引用符を除いて */foo と入力します。

    パージキーのウィンドウ

  4. Purge ボタンをクリックします。

カスタム VCL 経由でパージする

カスタム VCL でワイルドカードのパスに基づいてコンテンツをパージするには、以下の手順に従ってください。

  1. VCL テンプレートに以下のコードを追加します。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
    sub construct_skey {
      if (req.url.path ~ "^(((((/[^/]+)?/[^/]+)?/[^/]+)?/[^/]+)?/[^/]+)") {
        # This prevents us from doing this twice when shielding
        if (std.strstr(beresp.http.Surrogate-Key, re.group.1)) {
          return;
        }
    
        if (!re.group.2) {
          set beresp.http.Surrogate-Key = if(beresp.http.Surrogate-Key, beresp.http.Surrogate-Key " ", "")
            + re.group.1;
          return;
        }
    
        if (!re.group.3) {
          set beresp.http.Surrogate-Key = if(beresp.http.Surrogate-Key, beresp.http.Surrogate-Key " ", "")
            + re.group.1 + " " + re.group.2;
          return;
        }
    
        if (!re.group.4) {
          set beresp.http.Surrogate-Key = if(beresp.http.Surrogate-Key, beresp.http.Surrogate-Key " ", "")
            + re.group.1 + " " + re.group.2 + " " + re.group.3;
          return;
        }
    
        if (!re.group.5) {
          set beresp.http.Surrogate-Key = if(beresp.http.Surrogate-Key, beresp.http.Surrogate-Key " ", "")
            + re.group.1 + " " + re.group.2 + " " + re.group.3 + " " + re.group.4;
          return;
        }
        set beresp.http.Surrogate-Key = if(beresp.http.Surrogate-Key, beresp.http.Surrogate-Key " ", "")
          + re.group.1 + " " + re.group.2 + " " + re.group.3 + " " + re.group.4 + " " + re.group.5;
      }
    }
    
  2. vcl_fetch のサブルーチンを呼び出します。

    1
    2
    3
    
    sub vcl_fetch {
    call construct_skey;
    }
    
  3. 成功したかどうかを確認するには、まだキャッシュされていないオブジェクトを Fastly-Debug:1 ヘッダーを使用して curl コマンドでリクエストし、サロゲートキーを表示します。例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    
    $ curl -svo /dev/null http://www.example.com/test/test2/file3.txt -H Fastly-Debug:1
    * Trying 192.0.2.0...
    * Connected to www.example.com (192.0.2.0) port 80 (#0)
    > Host: www.example.com
    > User-Agent: curl/7.43.0
    > Accept: */*
    > Fastly-Debug:1
    >
    < HTTP/1.1 200 OK
    < Server: Apache
    < Content-Type: text/plain
    < Surrogate-Key: /test /test/test2 /test/test2/file3.txt
    < Via: 1.1 varnish
    < X-Backend-IP: 203.0.113.0
    < Cache-Control: max-age=31536000, stale-while-revalidate=31536000, stale-if-error=31536000
    < Content-Length: 19
    < Accept-Ranges: bytes
    < Date: Fri, 29 Jan 2016 21:30:08 GMT
    < Via: 1.1 varnish
    < Age: 1035
    < Connection: keep-alive
    < Fastly-Debug-Path: (D cache-sjc3123-SJC 1454103008) (F cache-sjc3134-SJC 1454101973) (D cache-den6026-DEN 1454101973) (F cache-den6027-DEN 1454101973)
    < Fastly-Debug-TTL: (H cache-sjc3123-SJC - - 1035) (M cache-den6026-DEN - - 0)
    < Fastly-Debug-Digest: b43bd38cf940e1669c2927c8662660e5170758053dda42e772ce3fc34ee57fc1
    < X-Served-By: cache-den6026-DEN, cache-sjc3123-SJC
    < X-Cache: MISS, HIT
    < X-Cache-Hits: 0, 1
    < Vary: Accept-Encoding
    <
    { [19 bytes data]
    * Connection #0 to host www.example.com left intact
    

    上記の例では < Surrogate-Key: /test /test/test2 /test/test2/file3.txt のヘッダーから、3つのサロゲートキーが追加されているのが分かります。

API 経由でパージする

また、API 経由でキーベースのパージを行い、HTTP リクエストを使用してワイルドカードのパージを行うこともできます。

1
2
POST /service/<Fastly Service ID>/purge/*/foo
Fastly-Key: FASTLY_API_TOKEN

これにより、ヘッダールールの設定に従って "*/foo" のサロゲートキーに関連付けられているコンテンツがすべて消去されます。API でサービスをパージするためのシンタックスは、API に関するドキュメントのパージセクションに記載されています。

Back to Top