FastlyサーバーのTTLの選択ロジック


#1

この記事の内容について

この記事ではFastlyを利用した際にサーバー上にキャッシュされる時間(TTL)の設定方法や、キャッシュ対象外となる条件などをまとめてみたいと思います。

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
この記事に記載さいれている内容の詳細は以下のURL等を参照して下さい
https://docs.fastly.com/guides/tutorials/cache-control-tutorial

他社CDNではTTLを設定する対象をURLのPathや拡張子単位で設定していくものもあるのですが、Fastlyではオリジンサーバーからの返却されるレスポンスヘッダーに設定されているCache-Controlなどのヘッダーの内容に基づいてTTLをコントロールします。

もちろんFastlyサーバー上でそれらのヘッダーを無視してTTLを設定(上書き)することも可能なのですが、この記事ではまず基本となるオリジンサーバーからのレスポンスヘッダー情報に基づいてTTLを選択するロジックを説明します。

キャッシュしない条件

最初にキャッシュを行わない条件について理解しておきましょう。Fastlyサーバーでは以下の条件の場合はキャッシュを行いません。

  • HTTPリクエストのMethodがGETかHEAD以外の場合(例POST, PUT, DELETEなど)

  • オリジンからのHTTPレスポンスにSet-Cookieが含まれている。

  • オリジンからのレスポンスにCache-Control: private が含まれている
    (Cache-Control: no-store, no-cache はキャッシュ対象となります)

これらの条件に適合するとCache-Controlヘッダーが存在してもFastlyサーバーはキャッシュを行いませんので注意しましょう。

TTLの設定ロジック

続いてFastlyサーバーがオリジンサーバーからのレスポンスヘッダーの内容に基づいてTTLを選択するロジックを説明します。

TTLの設定に関連するヘッダーは何種類かあるのですが、FastlyサーバーでのTTLに関連するヘッダーはCache-Control, Expires, Set-Cookie, Surrogate-Controlヘッダーです。

これらのヘッダーの内容を参照し、以下のような優先順位で適用されるTTLを決定します。

  1. Set-CookieまたはCache-Control: privateを含む場合 → キャッシュしない
  2. Surrogate-Control: max-age=ヘッダーに指定したTTL
  3. Cache-Control: s-maxage=ヘッダーに指定したTTL
  4. Cache-Control: max-age=ヘッダーに指定したTTL
  5. Expires:ヘッダーに指定したTTL
  6. Fastly設定上で指定されたFallback TTL(Default TTL)

つまりSet-CookieCache-Control: privateが存在する場合はSurrogate-ControlやExpiresヘッダーが存在していてもキャッシュが行われません。

Surrogate-Control:max-age=120Cache-Control: max-age=60のふたつのヘッダーが存在する場合はSurrogate-Controlヘッダーが優先されますので、TTLとしては120秒が適用されることになります。

なお、max-age, s-maxage, private以外の値がCache-Controlヘッダーに存在してもFastlyサーバーの挙動に影響は与えません。それらのヘッダーはそのままブラウザに送信されます。

Fastly側でFallback TTL(Default TTL)を設定

オリジンからのレスポンスにSurrogate-ControlやCache-Control, Expiresが存在しない場合はFastly設定上で指定するTTLが適用されます。(上記の優先順位の6番の挙動)

特に追加で設定を行っていない場合は設定画面のSettingタブのFallback TTLで設定した内容が適用されます。

以上がオリジンからのレスポンスに基づいてFastlyサーバーがTTLを選択するロジックとなります。

Fastlyサーバー側でTTLを設定(上書き)する手順については以下のサイトを参照して下さい。

また、TTLが意図したどおりに設定されているかを確認する方法を以下を参照下さい。