年三日坊主の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の設計、構築、運用を承っておりますので、お気軽にご相談ください。

