CDNトラブルシュート(キャッシュされない)


CDNサーバにコンテンツがキャッシュされないことがあります。ここでは、原因と考えられる事項をまとめます。

参考:CDNキャッシュヒットの判定

CDNのデフォルト設定

HTMLファイル

CloudflareなどのCDNでは、キャッシュのデフォルト設定が以下のようになっています(変更が多いHTMLはキャッシュさせず、イメージのみをキャッシュさせるというポリシです):

  • HTMLファイル:キャッシュしない
  • イメージファイル:キャッシュする

検索文字列を含む

多くのCDNのデフォルト設定では、検索文字列(例:http://example.jp/index.html?page=1)を含むURLをキャッシュしません。

クッキーを含む

多くのCDNのデフォルト設定では、HTTPリクエストにクッキーが含まれれる場合、対象URLをキャッシュしません。

ETAGヘッダが設定されている

オリジンサーバがクラスタ化(複数台により構成)されており、ETAGヘッダが生成されている場合、ひとつのURLに対し複数のETAG値が存在することになります。そして、この場合、キャッシュは正常に稼動しません。この修正には、オリジンサーバでETAGヘッダを生成させないようにする必要があります。

Apacheでの設定は以下になります:

  • FileETag None

PragmaおよびCache-Controlヘッダの設定ミス

オリジンサーバが以下のようなHTTPヘッダを生成する場合、CDNはオブジェクトをキャッシュしません。

オリジンサーバのレスポンスに以下のHTTPヘッダが含まれている場合

  • Cache-Control
    • no-store, private
  • Pragma
    • No-cache

もしくは、以下のHTTPヘッダが不適切に設定されている場合、

  • Cache-Control
    • max-age
      • キャッシュの生存時間(秒)。これが0だとキャッシュされない
  • Expires
    • キャッシュの有効時刻。この時刻が、現在の時刻の前だとキャッシュされない

これを修正するには、以下の3種類の方法があります:

CMSによるHTTPヘッダ生成の抑制

WordPressなどのCMSでは、生成したブログページに対しNo-cacheを強制的に挿入することがあります。これの抑制はCMSにより異なります:

  • WordPress
    •  functions.phpに以下のような定義を追加する
      • add_filter( ‘nocache_headers’, ‘custom_nocache_headers’ );
      • function custom_nocache_headers( $headers ) {
      •  unset( $headers[‘Expires’]);
      •  unset( $headers[‘Cache-Control’]);
      •  unset( $headers[‘Pragma’]);
      •  return $headers;
      • }

 WebサーバによるHTTPヘッダの強制書き換え、強制削除

CMS等によっては、no-cacheの生成を抑制できない場合があります。この場合も、Webサーバにno-cacheを削除させる設定を行うことができます:

  • Apache
    •  mod_headersを使用しCache-Controlを削除することができます。設定は以下のようになります:
      • Requestheader unset Cache-Control

CDNにおけるオリジンHTTPヘッダの無視

オリジンサーバのHTTPヘッダを無視できるCDNもあります。

HTTPヘッダの不足

CDNがオブジェクトをキャッシュするには、以下のHTTPヘッダが生成されている必要があります:

  • Last-Modified
  • Expires
  • Content-Length

基本的な対策としては、オリジンサーバ側で前記HTTPヘッダを生成することですが、CDN側のTTL設定によりキャッシュさせることも可能です。ただし、Last-Modified等がない場合、ブラウザキャッシュでもキャッシュされない可能性があるため、FEO的には、きちんとオリジンサーバで修正すべきです。

ファイルが大きすぎる

CDNには、キャッシュできる最大サイズが設定されています。これを超えるファイルはキャッシュされません。

クライアントがレンジリクエストを発行している

レンジリクエストを含むリクエストは、CDNによりキャッシュできないことがあります。詳細についてはレンジリクエストを参照ください。