CDNのキャッシュ制御の基本を初心者向けに整理してみた

年三日坊主のKKです。

 前回の「CDNの基本を初心者向けに整理してみた」に引き続き今回はCDNのキャッシュ制御についてまとめてみたいと思います。


なぜキャッシュ制御が重要なのか?

CDNは便利ですが、必ず意識しなければならない大きな問題があります。

👉 「古いコンテンツが配信され続ける可能性がある」

例えば:

  • HTMLを更新したのに反映されない
  • 画像を差し替えたのに古いまま

これはすべてキャッシュ制御の問題です。


1. キャッシュの有効期限(TTL)

まず基本になるのがTTL(Time To Live)です。

👉 「キャッシュをどれくらい(いつまで)保持するか」

 CDNは標準のTTLが設定できます。 


イメージ
 キャッシュ作成 → 一定時間保持 → 期限切れ → 再取得 

※CDNによっては上記よりも更に複雑な制御をしている場合もあります。


  • max-age=60 → 60秒キャッシュ
  • max-age=3600 → 1時間キャッシュ

ポイント
  • 短い → 常に最新だが負荷増
  • 長い → 高速だが更新反映が遅い

👉 一般的には両立が難しくどちらかを諦めるトレードオフが発生します

 ※CDNによっては複雑な制御によりトレードオフを軽減している場合もあります。 


2. Cache-Controlヘッダ

TTLはオリジンサーバ側からHTTPヘッダで制御することができます。

それが Cache-Control です。


基本例
 Cache-Control: max-age=3600 

👉 1時間キャッシュを指示するヘッダ


よく使うディレクティブ
● public / private
 Cache-Control: public 
  • CDNなどでもキャッシュ可能
 Cache-Control: private 
  • ブラウザのみキャッシュ
  • CDNはキャッシュしない

● no-cache
 Cache-Control: no-cache 

👉 キャッシュはするが毎回確認する


● no-store
 Cache-Control: no-store 

👉 一切キャッシュしない


● s-maxage(重要)
 Cache-Control: s-maxage=600 

👉 CDN専用TTL

  • ブラウザとCDNで挙動を分けられる

例(実務でよくある)
 Cache-Control: public, max-age=60, s-maxage=600 
  • ブラウザ:60秒
  • CDN:600秒

3. CDN特有のキャッシュ制御(補足)

CDNにはHTTPヘッダ以外にも独自機能があります。


  • 強制キャッシュ(ヘッダ無視)
  • URLパターンごとのTTL設定
  • Cookie有無でキャッシュ分岐
  • クエリ文字列の扱い

 一般的にCDNはオリジンサーバのHTTPヘッダで指定されたTTLに従い、指定が無い場合に標準のTTLが適用されます。
一方、オリジンサーバ側がHTTPヘッダで指定したTTLを無視して、CDN側でTTLを設定することもできます(強制キャッシュ(ヘッダ無視))。  

👉 実務では「CDN設定」と「HTTPヘッダ」の両方で制御する


4. キャッシュ削除(パージ)

TTLを待たずにキャッシュを消す方法です。

👉 「今すぐ更新を反映したい」時に使う


イメージ
 CDNに削除指示 → キャッシュ削除 → 次回アクセスで再取得 

 


種類
  • URL単位削除
  • パス単位削除
  • 全削除(フルパージ)

注意点
  • CDNによっては反映に時間がかかる
  • 大量パージはコストや制限あり

※パージ処理が従量課金対象になるCDNもあるのでカジュアルにパージを多用することはおすすめできません。
キャッシュ削除(パージ)


5. 動的コンテンツのキャッシュ戦略

ここが一番実務っぽいポイントです。


基本
 動的コンテンツ = キャッシュしない 

例:CGIやPHPなどで生成されるページやコンテンツ要素

■ しかし実務では…

👉 一部キャッシュするケースもある


パターン①:短時間キャッシュ
 Cache-Control: max-age=5 

👉 5秒だけキャッシュ

  • APIレスポンスなど短時間では応答内容が変動しないもので有効

パターン②:キー分割

例:

  • ホストヘッダーごとにキャッシュ
  • ユーザIDごとにキャッシュ
  • URLのクエリごとにキャッシュ
  • Cookieごとに分岐

👉 CDN設定で制御


パターン③:疑似静的化
 /api/news → JSONを一定時間キャッシュ 

👉 動的だけどキャッシュ可能にする


よくある失敗

初心者がやりがちなミス:


❌ HTMLを長時間キャッシュ

👉 更新が反映されない


❌ no-storeを多用

👉 CDNの意味がなくなる


❌ パージ頼み

👉 運用が破綻する

❌ キー分割指定誤り/漏れ

👉 キャッシュを分けるキー指定の誤り/漏れで想定とは異なるコンテンツがキャッシュされてしまう


まとめ

CDNのキャッシュ制御は以下の3つで考えるとシンプルです:


✔ まとめ

  • TTLで「どれくらい保持するか」決める(デフォルト設定の定義)
  • Cache-Controlで「どう扱うか」定義する(個別設定の定義)
  • 「手動削除(パージ)」「一部動的コンテンツをキャッシュ」(例外の定義)

👉 一言で言うと

「速さ」と「最新性」のバランスを取る技術


おまけ(実務ヒント)

現場ではよくこう設計します:

コンテンツ 設定
HTML 短TTL
画像 長TTL
JS/CSS 長TTL + バージョニング(クエリ指定)
API 短TTL or 非キャッシュ

 

なお、当社では上記を踏まえた具体的なCDNの設計、構築、運用を承っておりますので、お気軽にご相談ください。