LOG IN SIGN UP
Documentation

チュートリアル: キャッシュ制御

Fastly によるリソースのキャッシュ方法は完全に制御することができます。Fastly に指示するには、バックエンド HTTP ヘッダを使用するのが最も望ましい方法です。他には、VCL (Varnish Configuration Language) を使用する方法があります。

バックエンド HTTP ヘッダ

Fastly のキャッシュおよび Web ブラウザに、それぞれ異なる影響を与える 4 種類の HTTP ヘッダを設定することができます。複数の種類を使用したい場合は、以下の順に優先されます。

Surrogate-Control

形式:

Surrogate-Control: max-age=(time in seconds)

例:

Surrogate-Control: max-age=3600

この例では、あるデータが Fastly のキャッシュ上に 1 時間キャッシュされます。このヘッダは削除され、Fastly のキャッシュにしか見えません。

Cache-Control: s-maxage

形式:

Cache-Control: s-maxage=(time in seconds)

これは Surrogate-Control と同様ですが、ヘッダが削除されず、Fastly のキャッシュ、および Fastly とブラウザ間のキャッシュ (ブラウザ自体を除く) がこのヘッダに従う点が異なります。

Cache-Control: max-age

形式:

Cache-Control: max-age=(time in seconds)

Fastly のキャッシュ、Fastly とブラウザ間のキャッシュ、およびブラウザ自体がこのヘッダに従います。

Expires

このヘッダでは、指定された期限が切れるまでコンテンツがキャッシュされます。Fastly のキャッシュ、Fastly とブラウザ間のキャッシュ、およびブラウザ自体がこのヘッダに従います。フォーマットの説明については 14.21 RFC2616 をお読みください。

キャッシュしない

特定のリソースをキャッシュしない場合、ヘッダを次のように設定します。

Cache-Control: private

従来のように、max-age=0 または Expires を設定しただけでは、複数の未処理リクエストを同時に満たすためにそのコンテンツが使用されない保証はありません。また、エラーの場合や、バックエンドの同じオブジェクトへのリクエストをすでに処理中の場合に、期限切れ (失効) のオブジェクトが使用される可能性があります。

より複雑な例

仮に、自分のリソースを Fastly に永久的にキャッシュさせたいが、ブラウザが Fastly をキャッシュしないようにブラウザにヘッダを送信したいとします (したがって、どのブラウザにも Fastly のミスヒットが生じますが、サービスでのキャッシュミスではありません)。

これを実行する最良の方法は、ブラウザに送ろうとする Cache-Control ヘッダをブラウザと Fastly の両方に送信し、Fastly には Surrogate-Control ヘッダでキャッシュ期間を知らせることです。例えば、次のように設定します。

Cache-Control: max-age=3600
Surrogate-Control: max-age=2592000

Cache-Control ヘッダを private と設定した場合を除き、Surrogate-Control ヘッダが Cache-Control より優先されます。ただし、Cache-Control と異なり Surrogate-Control ヘッダは削除されるので、ブラウザには見えません。

バックエンドの設定例

Apache の設定

Apache を使用している場合、ヘッダを追加するには mod_expires モジュールを使用するのがもっとも簡単です。例えば、GIF 画像を、キャッシュサーバが最後にアクセスしてから 75 分間キャッシュするには、次のようなディレクティブを VirtualHost の下に (またはグローバルに) 追加します。例えば、次のようにします。

ExpiresActive On
ExpiresByType image/gif "access plus 1 hours 15 minutes"

URL のサブツリー全体をキャッシュすることもできます。例えば、次のように設定します。

<Location "/css">
  ExpiresActive On
  ExpiresDefault "access plus 1 year"
</Location>

<Location "/static/">
  ExpiresActive On
  ExpiresDefault "access plus 1 day"
</Location>

NGINX の設定

NGINX を設定するには、expires ディレクティブを追加します。例えば、次のように設定します。

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
   expires 1h;
}

また、ヘッダをより柔軟に変更する必要がある場合は、HttpHeadersMore モジュールを使用してみてください。

Amazon S3 の設定

S3 には、デフォルトでは複数のオブジェクトに Cache-Control ヘッダを設定する機能はありません。そのため、これを S3Explorer を使ってファイル単位で実行するか、または boto などのクラウドライブラリを使って自動的に実行する必要があります。キャッシュ期間を長くして即時パージを行うとパフォーマンスを向上できます。

from boto.s3.connection import S3Connection

connection = S3Connection('aws access key', 'aws secret key')

buckets = connection.get_all_buckets()

for bucket in buckets:
    for key in bucket.list():
        print('%s' % key)

        if key.name.endswith('.jpg'):
            contentType = 'image/jpeg'
        elif key.name.endswith('.png'):
            contentType = 'image/png'
        else:
            continue

        key.metadata.update({
            'Content-Type': contentType,
            'Cache-Control': 'max-age=864000'
        })
        key.copy(
            key.bucket.name,
            key.name,
            key.metadata,
            preserve_acl=True
        )

プログラミング言語およびフレームワークを使った際のカスタムヘッダ

PHP

詳細: http://php.net/manual/ja/function.header.php

例: 特定の HTML を 1 時間キャッシュするには、何らかの出力を送信する前に下記のコードを追加します。

header('Cache-Control: max-age=3600');

Django

詳細: https://docs.djangoproject.com/en/dev/ref/request-response/#setting-headers

例:

response = HttpResponse()
response['Cache-Control'] = 'max-age=3600'

Sinatra

詳細: http://sinatra.rubyforge.org/doc/

例:

get '/' do
    headers['Cache-Control'] = 'max-age=3600'
end

Translations available [EN] English

翻訳についての注意事項Back to Top