Ver.1.00.01
はじめに
本ガイドラインではCDNextのキャッシュサーバーにおけるキャッシュ挙動について説明します。
またお客様がご利用中のオリジンサーバーでCDNextからのみアクセス許可したい場合の設定例も記載しておりますので、ご活用ください。
キャッシュを行う (オリジンサーバーにリクエストする) タイミングについて
■キャッシュサーバーにキャッシュがない場合
クライアント端末からキャッシュサーバーにリクエストされた内容を、キャッシュサーバーはオリジンサーバーにリクエストします。
通常、キャッシュサーバーはオリジンサーバーからリクエストに応じたコンテンツを取得し、キャッシュを保持するとともにクライアント端末にコンテンツをレスポンスします。
■キャッシュサーバーにキャッシュがある場合
-
キャッシュTTLが切れていない時
キャッシュサーバー内に保持されているキャッシュされたコンテンツをそのままクライアント端末にレスポンスします。
-
キャッシュTTLが切れている場合
Last-Modifiedヘッダ、Etagヘッダが適切に設定されていれば、キャッシュサーバーからオリジンサーバーヘIMS/INMリクエストによるコンテンツの更新確認が行われます。
-
コンテンツが更新されていない場合
コンテンツに更新がない場合、キャッシュサーバーはキャッシュされているコンテンツをクライアント端末へレスポンスするとともに、キャッシュTTLを0に戻し、再度次回TTL切れまでそのまま配信します。
-
コンテンツが更新されていた場合
キャッシュサーバーはオリジンサーバーより更新されたコンテンツを再取得し、キャッシュに保持するとともにクライアント端末へコンテンツをレスポンスします。
-
コンテンツが更新されていない場合
1. CDNextにおけるキャッシュ挙動について
1-1 対応リクエストメソッド
- GET/HEAD/POST/PUT/DELETE/OPTION/PATCH以外(一般的にはTRACE/CONNECT等)は拒否します。
- GET/HEADのリクエストのみキャッシュします。それ以外はキャッシュされず、オリジンサーバーに転送されます。
- HEADの場合もフェッチはGETになります。
- それ以外のメソッドはGETのキャッシュがあってもオリジンサーバーに転送されます。
1-2 Proxy リクエスト (キャッシュサーバーからオリジンサーバーへのリクエスト)
- Proxy時のユーザーのリクエストヘッダは、基本的に全て転送されます。
- Proxy時にCDNで追加で付与されるヘッダは下記の通りとなります。
| No | 付与されるヘッダ | 説明 |
|---|---|---|
| 1 | X-Real-IP | 実際にアクセスしてきたIPアドレス |
| 2 | X-Forwarded-For | X-Forwarded-For仕様に基づくProxy経由のIPアドレス列挙 |
| 3 | X-Forwarded-Proto | リクエストプロトコル |
| 4 | X-CDNext-VHOST-ID | 利用したCDNextのVHOST-ID (32桁の16進数の乱数) |
| 5 | Via | Proxy経由時に付与されたVia文字列列挙(CDNextはJSTCDNを付与) |
1-3 Proxyレスポンス (キャッシュサーバーからクライアント端末へのレスポンス)
- Proxy時にCDNで追加で付与されるヘッダは下記の通りとなります。
| No | 付与されるヘッダ | 説明 |
|---|---|---|
| 1 | Via | JSTCDNのViaヘッダ |
| 2 | X-Cache | キャッシュステータス |
| 3 | x-cache-age | キャッシュされてからの経過秒数 |
1-4 Proxy/フェッチ/Revalidate挙動
【FirestHand (キャッシュサーバー上にキャッシュがない状態)のユーザーリクエストの場合】
- ユーザーリクエストがGET/HEADに関わらずコンテンツ全体がフェッチされます。
【Revalidateとなる (TTLがExpireしたキャッシュへの) ユーザーリクエストの場合】
- オブジェクトにLast-Modifiedヘッダがある場合は、Revalidate リクエストにIf-Modified-Sinceヘッダが付与されます。
- オブジェクトにEtagヘッダがある場合は、RevalidateリクエストにIf-None-Matchヘッダが付与されます。
- If-Modified-Since/If-None-Matchは両方同時に付与されます。判定優先はオリジンサーバーに依存します。
- 304 NotModifiedだった場合、CDNextサーバー上のオブジェクトのTTLに関する情報を置き換えます。
- Last-Modifiedヘッダがない場合は、通常リクエストによりオブジェクトが置き換えられます。
- ユーザーリクエストへの応答とフェッチ受信は非同期となります。
- Proxy時のフェッチ速度は、クライアント側の受信速度に依存しません。
- FirstHandのユーザーリクエストがまだ応答中であっても、フェッチが完了していれば次のユーザーリクエストはキャッシュHitします。
- ユーザーリクエストを中断してもフェッチは中断されません。
1-5 リクエストヘッダによる挙動について
- リクエストヘッダによる max-age, no-cache, no-store などの強制要求は無視されます。
1-6 レスポンスヘッダによるキャッシュコントロール
- レスポンスヘッダによるキャッシュ挙動は下記の通りとなります。
| No | レスポンスヘッダ | キャッシュ挙動 |
|---|---|---|
| 1 | Pragma: no-cache | 無視。キャッシュされる。 |
| 2 | Cache-Control: no-cache | 有効。キャッシュされない。max-age/s-maxageより優先される。 |
| 3 | Cache-Control: no-store | 有効。キャッシュされない。max-age/s-maxageより優先される。 |
| 4 | Cache-Control: private | 有効。キャッシュされない。max-age/s-maxageより優先される。 |
| 5 | Cache-Control: public | 有効。no-cache/no-store/Expires/privateが優先。 |
| 6 | Cache-Control: must-revalidate | 無視。Revalidateされない |
| 7 | Cache-Control: proxy-revalidate | 無視。Revalidateされない。 |
| 8 | Cache-Control: max-age=NN | 有効。TTLが設定される。 |
| 9 | Cache-Control: s-maxage=NN | 有効。TTLが設定される。max-ageより優先される。 |
| 10 | Expires: HTTP_TIME | 有効。TTLがHTTP_TIMEまで設定される。HTTP_TIME < nowの場合はキャッシュされない。max-age/s-maxageが設定されている場合は、max-age/s-maxageが優先される。 |
| 11 | Expires: -1 | 有効。キャッシュされない。max-age/s-maxageより優先される。no-cache/no-store相当。 |
■Cache-Control ヘッダのキャッシュ挙動について
Cache-Control におけるキャッシュ挙動は、CDNホスト設定、仮想パス設定の「キャッシュ挙動」で、キャッシュする/しないを変更することができます。
詳細は、「CDNext利用マニュアル」内、「4-6 CDNホスト設定画面」 「 仮想パス編集画面」をご参照ください。
1-7 キャッシュ/TTL設定優先度
- キャッシュ/TTL設定の優先度は下記の通りとなります。
no-cache = no-store = private = Expires: 1 > s-maxage > max-age > Expires:HTTP_TIME > Web 管理画面
「Cache-Controlヘッダを無視してキャッシュ」の設定をした場合、この限りではありません。詳細は、「CDNext利用マニュアル」内、[4-6 CDNホスト設定画面] [4-8 仮想パス編集画面]をご参照ください。
1-8 Last-Modified/Etagヘッダについて
- どちらかが付与されていれば、TTL超過時にRevalidationにてIMS/INMリクエストとなります。
- どちらも付与されていなければ、通常のGETリクエストとなります。
1-9 その他レスポンスヘッダによるキャッシュ挙動
| No | レスポンスヘッダ | キャッシュ挙動 |
|---|---|---|
| 1 | Set-Cookie |
応答に"Set-Cookie"があってもキャッシュされます。 |
| 2 | Vary |
応答に"Vary: *"がある場合はキャッシュされません。"Vary: Accept-Encoding"を利用の場合は圧縮有り無しのファイルがそれぞれキャッシュされます。 |
■オリジンサーバーでCDNextのキャッシュサーバーからのみアクセスを許可したい場合
キャッシュサーバーからのリクエストヘッダをもとに、たとえば Apache であれば、.htaccess等で以下のような制御をご検討ください。
【.htaccess記載例】
RewriteEngine On
RewriteCond %{HTTP:Via} !JSTCDN$ [OR,NC]
RewriteCond %{HTTP:X-CDNext-VHOST-ID} !^CDNextで発行される32桁のID$
RewriteRule ^(.*)$ - [F]
※CDNext以外からのアクセスの場合、403エラーを返答する記載例です。実際の記載内容はオリジンサーバーの設定状況等により異なる場合がございますのでご注意下さい。
※CDNextで発行される32桁のIDは、CDNホストの「設定」画面「FQDN」 タブ内の「CNAME情報」項目に表示される32桁の文字列になります。
※Apache以外で同様の制御を実施したい場合も同様の制御を実施して頂く事で、オリジンサーバーでCDNextからのみアクセス許可をする事が可能です。