基本仕様
エッジキャッシュCDNは、オリジンサーバーからコンテンツを取得し一定期間エッジサーバーでキャッシュ後、 コンテンツを返却します。
プロトコル
HTTPおよびHTTPSプロトコル配信に対応しています。
バージョン
HTTP/1.1
HTTP/2
HTTP/3
に対応しています。
注釈
HTTP/2
HTTP/3
についてはHTTPS(SSL)通信が必須となります。
HTTPメソッド
エッジキャッシュは、以下のリクエストを受け入れてオリジンサーバーに転送します。 これら以外のメソッドは、なにも加工することなくオリジンサーバーに転送します。
GET
HEAD
PUT
POST
TRACE
OPTIONS
PATCH
DELETE
リクエストの最大長と URL の最大長
パス、クエリーストリング、ヘッダーを含め、リクエストの最大長は 20480 バイトです。
リクエストまたは URL がこの制限を超えるとリクエストヘッダーフィールドが長すぎることを示す HTTP ステータスコード 413 (Request Header Fields Too Large)
を
返却し、TCP 接続を終了します。
リクエストヘッダー
エッジキャッシュ仕様書に定めがない限りオリジンサーバーに転送します。
レスポンスヘッダー
エッジキャッシュでは、判定用にいくつかのレスポンスヘッダーを追加します。
値 |
説明 |
HIT |
キャッシュが存在する |
MISS |
キャッシュが存在しなくオリジンサーバーから取得 |
PASS |
キャッシュを行わない |
'-' |
エラーを返却した場合 |
オリジンサーバーの指定方法
コンテンツ取得先であるオリジンサーバーの指定は、IPアドレスまたはドメイン名を利用可能です。
エッジキャッシュは、内部的にオリジンサーバーのIPアドレスを最大5分キャッシュします。 そのため、オリジンサーバーのドメイン名に紐づくIPアドレスを変更した場合は、反映までにドメインに指定された TTL+5Min かかります。
警告
IPアドレスで直接指定することは推奨していません。そのため、オリジンサーバー専用のAレコードを準備いただき 割り当てることをお勧めしております。
カスタムオリジンへのリクエスト
HTTP/1.1
を使用してカスタムオリジンにリクエストを転送します。
対応プロトコル
HTTP
または HTTPS
追加するヘッダー
エッジキャッシュはリクエストが発生した際、以下のヘッダを付与しオリジンサーバーにリクエストします。
X-Forwarded-For
クライアントIPを X-Forwarded-For
に格納後、オリジンサーバーにリクエストします。
CDN経由のアクセスの場合、オリジンサーバーからみるとエッジキャッシュCDNのIPアドレスが
クライアントIPとして認識されます。そのため、オリジンサーバー側でクライアントIPアドレスに基づいて
アクセス制限やリダイレクトを制御している場合は、 X-Forwarded-For
内の実IPアドレスをご利用下さい。
X-Forwarded-Proto/X-Forwarded-Redbox-Proto
リクエストプロトコル(HTTPまたはHTTPS)を X-Forwarded-Proto
及び X-Forwarded-Redbox-Proto
内に格納後、オリジンサーバーにリクエストします。
HTTPSリクエストの場合でも、CDNからオリジンサーバーまでの通信はHTTPで通信されます。
そのため、リクエストプロトコルをオリジンサーバーで判別し動作を制御している場合は、
X-Forwarded-Proto
または X-Forwarded-Redbox-Proto
内のプロトコル名をご利用下さい。
注釈
オリジンサーバーの上位にProxyサーバーやロードバランサーが入っている場合やホスティング事業者側の都合でX-Forwarded-Protoヘッダを削除してしまう場合があります。 その際は、X-Forwarded-Protoの代わりにX-Forwarded-Redbox-Protoをご利用下さい。
削除するヘッダー
リクエストヘッダーにProxyが含まれてる場合は、これらを削除しオリジンサーバーにリクエストします。
カスタムオリジンからのレスポンス
オリジンサーバーからのレスポンス時に、エッジキャッシュCDNがどのような振る舞いをするかを掲載しています。
削除するヘッダー
レスポンスヘッダに以下の値が付与されている場合、ヘッダを削除後クライアントに返却します。
Vary(User-Agent)
Trailer
Warning
Server
Varyヘッダについて
エッジキャッシュCDNではオリジンからのレスポンスヘッダに Vary:User-Agent
が付与されている場合は、これらの値を削除しキャッシュ効率を高めています。
注釈
Varyヘッダは 「同じURLであってもVaryヘッダに指定されている内容が異なれば別のコンテンツとして取り扱いう」 というオリジンサーバーからの命令です。 たとえば、Vary: User-Agentというヘッダーをレスポンスヘッダに付与しておくとCDNはUser-Agentヘッダの内容に応じたキャッシュを保持します。 しかし、User-Agentはブラウザーのバージョンなどによって多数存在するためキャッシュ効率が非常に悪くなり、キャッシュヒット率の低下、オリジンサーバーの負荷が高まる恐れがあります。 ※Accept-Languageを指定いただいた場合は、クライアントのAccept-Language毎にキャッシュを生成します。
オリジンサーバーエラー時のレスポンス
オリジンサーバーとの通信時、以下の条件に当てはまる場合キャッシュサーバーはステータスコード500をレスポンスします。
オリジンドメインのDNSレコードが参照できなかった
オリジンドメインのDNSレコードが存在しなかった
オリジンドメインに割り当てられているDNSレコードが不正
オリジンとの通信が確立しなかった(初回TCP通信は10秒、TCP通信完了後CDNからの初回リクエスト30秒)
オリジンとの通信がキャッシュ前に途中で途切れた
500 502 504エラーが発生した場合
オリジンとの通信で5系レスポンスが発生し且つ高負荷の場合
コンテンツ圧縮(Gzip/Brotli)
コンテンツ圧縮対応プランの場合、特定のコンテンツを対象にエッジ側で自動的に圧縮し、対応したクライアントに圧縮コンテンツを提供します。 圧縮コンテンツを提供する条件は以下の通りです。
コンテンツ圧縮条件
コンテンツ圧縮対応プランで、コンテンツ圧縮機能を有効にしていること。
リクエストヘッダーに
Accept-Encoding: br, gzip
いずれかが付与されている圧縮コンテンツ対応クライアントであること。弊社で定めた所定の圧縮対象コンテンツであること。
キャッシュ可能コンテンツであること。(TTLがゼロ以上またはカスタム設定によりキャッシュ除外設定を実施していないこと)
オリジンからのレスポンスヘッダーに
Content-Length
が含まれていること。オリジンからのステータスコードが 200であること。
オリジンから
Content-Encoding
ヘッダがレスポンスされていないこと。
圧縮対象コンテンツ
以下のMimeTypesのコンテンツが圧縮対象となります。
"/xml"
"/json"
"text/*"
"/html"
"application/eot"
"application/x-otf"
"application/font"
"application/x-perl"
"application/font-sfnt"
"application/x-ttf"
"application/javascript"
"font/eot"
"font/ttf"
"application/opentype"
"font/otf"
"application/otf"
"font/opentype"
"application/pkcs7-mime"
"image/svg+xml"
"application/truetype"
"application/ttf"
"application/vnd.ms-fontobject"
"application/x-font-opentype"
"application/x-font-truetype"
"application/x-font-ttf"
"application/x-httpd-cgi"
"application/x-javascript"
"application/x-mpegurl"
"application/x-opentype"
圧縮コンテンツの優先順位
リクエストヘッダーに Accept-Encoding: br
が含まれている場合、エッジキャッシュCDNはBrotli圧縮を優先します。
ヘッダーは正規化され、正規化された値がオリジンサーバーに Accept-Encoding
ヘッダーとして送信されます。
br > gzip > deflate
brotli対応オリジンサーバーからのレスポンス時
エッジキャッシュCDNが、オリジンサーバーから Content-Encoding:br
ヘッダーを受け取った場合、
既にキャッシュ済のコンテンツが存在していたとしても、別コンテンツとしてキャッシュに格納します。
警告
既に圧縮されていないコンテンツがキャッシュ済の場合、圧縮対応クライアントからリクエストがきても、既にキャッシュ済の未圧縮コンテンツを返却します。 キャッシュ削除、またはコンテンツがリフレッシュされた段階で、再度コンテンツ圧縮条件を参照しコンテンツの圧縮を試みます。
圧縮コンテンツの注意事項
Accept-Encodingヘッダーについて
Accept-Encoding
ヘッダーが存在しない、または Accept-Encoding
ヘッダー内に gzip br
いずれも含まれない場合、
エッジキャッシュは、 Accept-Encoding
ヘッダーを削除後オリジンに転送します。
ETAGヘッダー
ETAGが含まれているコンテンツを圧縮する時、HTTPレスポンスヘッダーを変更することがあります。ETAGが付与されたコンテンツを圧縮した場合、 エッジキャッシュは強いETAGから弱いETAGに変換し弱いETAGをレスポンスします。
条件付きリクエスト
エッジキャッシュCDNは有効期限切れになっているコンテンツに対するリクエストを受け取ると、 リクエストをオリジンサーバーに転送し最新のコンテンツ取得するか、 最新のコンテンツがすでに存在することをオリジンサーバーに確認します。
オリジンサーバーがETag または LastModified
もしくはその両方の値をレスポンスしている場合、
エッジキャッシュCDNは次のどちらかまたは両方を追加しオリジンサーバーに転送します。
有効期限切れコンテンツの
ETag
値が含まれる If-Match またはIf-None-Match
ヘッダー。有効期限切れコンテンツの
LastModified
値が含まれるIf-Modified-Since
ヘッダー。
オリジンサーバーは、これらの情報を用いてコンテンツが更新されているかどうかを判別し、 最新コンテンツを返却するか、または HTTP 304 ステータスコード (変更なし) のみをレスポンスします。
CORS(Cross-Origin Resource Sharing)対応
エッジキャッシュCDNではオリジンサーバーのレスポンスヘッダ(Access-Control-Allow-Origin)を尊重してコンテンツと共にキャッシュし 呼び出し元に返却します。 そのため、CORSに対応させる場合はオリジンサーバーのレスポンスにAccess-Control-Allow-Originを含めて頂く必要が御座います。
CORSとは
注釈
あるドメインで実行されているWebアプリケーションが別のドメイン内にあるリソースにアクセスできるようにするHTTPの機能です。 クロスサイトスクリプティング攻撃の可能性を低減させるために、すべての最新の Web ブラウザーには * Same-Originポリシー と呼ばれるセキュリティ制限が実装されています。これにより、Web ページは他のドメイン内のリソースを呼び出すことができません。 CORSを使用すれば、外部ドメインのリソースを参照する事ができます。
Access-Control-Allow-Originヘッダ設定例
.htaccess:
<IfModule mod_headers.c>
<FilesMatch "\.(ttf|ttc|otf|eot|woff|font.css|css)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Nginx:
location ~ \.(ttf|ttc|otf|eot|woff|font.css|css)$ {
add_header Access-Control-Allow-Origin "*";
}
トラフィックスパイクの同時リクエスト
コンテンツを完全にキャッシュする間に、複数ユーザーから同時アクセスがあった場合、キャッシュ取得中のセッションを同時アクセスした全ユーザーに即時ストリーム配信し、 あらゆる状況下で配信待ちをゼロにする独自機能「インスタントストリーム」に対応しています。 インスタントストリームはオリジンサーバーへのアクセスは従来通り一度だけにとどめ、負荷を最小限にすると同時にCDN本来のメリットである高速配信を両立させます。
通常CDNは、オリジンサーバー負荷を軽減するため、コンテンツが完全にキャッシュされるまでの間に着信したリクエストを待ち状態にし、完全にキャッシュが完了してから一斉配信します。 そのため、完全にキャッシュするために時間を要するような数ギガバイトクラスの大容量ファイルの場合、キャッシュ期限切れが発生した際ダウンロード待ちが発生することを意味します。
インスタントストリーム制限事項
インスタントストリームにはいくつかの制限があります。
HTTP / 1.0クライアント
HTTP / 1.0のリクエストで、レスポンスヘッダーにContent-Lengthフィールドが含まれていない場合、インスタントストリームは無効となります。 コンテンツのキャッシュ取得中にHTTP / 1.0リクエストを着信すると、HTTP / 1.0リクエストはレスポンスヘッダーとレスポンスBodyを受信する前に、 コンテンツがダウンロードされるのを待機します。
Gzipとの互換性
CDNサービス側で自動的にGzip圧縮がおこなわれるコンテンツタイプについては、インスタントストリームは無効となります。
ESIとの互換性
ESIを介して処理されるレスポンスはインスタントストリームが無効となります。
オリジンクラスター
エッジキャッシュCDNは任意のオリジンサーバーを最大2つまで登録でき、以下のような制御を行うことができます。
注釈
オリジンクラスターを利用する場合は、いかなるケースでもオリジンサーバーの正常性を確認するための ヘルスチェック用URLをご用意いただく必要が御座います。
均等ロードバランシング
2台の登録されたオリジンサーバーに均等にHTTPリクエストを分散します。
プライマリー・セカンダリーオリジン
通常時はプライマリーオリジンを利用し、プライマリーオリジンのヘルスチェックに問題が発生した際は、 セカンダリーオリジンを利用します。プライマリーオリジンのヘルスチェックが正常に戻った場合は、 自動的にプライマリーオリジンからコンテンツを取得します。
取り消されたリクエスト
コンテンツがキャッシュになく、エッジキャッシュCDNがコンテンツをオリジンから取得中にクライアントがブラウザーを閉じる等をしてセッションを終了すると、 そのコンテンツをキャッシュせず破棄します。
オリジンサーバー応答タイムアウト
オリジンサーバーのタイムアウトは、以下の種類があります。
最初のバイトを受信するまでの待機時間(5s)
オリジンサーバーへのコネクションタイムアウト (デフォルト10s)
それぞれの byte を取得するまでのタイムアウト(デフォルト150s)
オリジンのKeepAlive Timeout 60秒
注釈
タイムアウト時間をデフォルト値から変更することが可能です。 タイムアウト時ステータスコードは500または502がレスポンスされます。
カスタムエラーページ
オリジンサーバーとの通信において以下の条件に該当する場合、エラーページやメンテナンスページサーバーからコンテンツを取得し表示させることが出来ます。
エッジキャッシュCDNとオリジンサーバー間でタイムアウト
オリジンサーバーから5系レスポンスが返却
注釈
デフォルトではエッジキャッシュCDNで定められたエラーページがレスポンスされます。
オリジンサーバーとTCP接続中断時の動作
オリジンサーバーがコンテンツをレスポンスしている最中に、エッジキャッシュCDNとTCP接続が中断した場合、 オリジンサーバーが Content-Length ヘッダーをレスポンスに含めたかどうかによって以下の通り動作が異なります。
Content-Length
ヘッダーあり – コンテンツをオリジンサーバーから取得した後、コンテンツをクライアントに返します。ただし、Content-Length
ヘッダーの値がコンテンツのサイズに一致しない場合はコンテンツをキャッシュしません。Transfer-Encoding: Chunked
– コンテンツをオリジンサーバーから取得した後、コンテンツをクライアントに返します。ただし、チャンクレスポンスが完了していない場合はコンテンツをキャッシュしません。Content-Length
ヘッダーなし – コンテンツをキャッシュしますが、コンテンツが完全でない場合があります。Content-Length
ヘッダーがない場合は、TCP 接続が誤って中断されたか、または故意に中断されたかを判断できません。
警告
Content-Length
ヘッダーを追加して、エッジキャッシュCDNが不完全なコンテンツをキャッシュしないように HTTP サーバーを設定することをお勧めします。
転送エンコード
オリジンサーバーが Transfer-Encoding: chunked
を返した場合、受け取ったコンテンツをクライアントに返し、そのオブジェクトをチャンク形式でキャッシュします。
クライアントがRange GETに必要なバイトを選択しリクエストすると、HTTPレスポンスコードが200から206に変更されます。
クライアントからキャッシュ済コンテンツの最大サイズを超える範囲のRangeヘッダーを受け取った場合、416 "Request Range Not
を返却します。
GEO IPブロック
エッジキャッシュCDNはクライアントIPアドレスの国に基づいてアクセスをブロックすることができます。(デフォルト:無効)
指定可能国
ISO 3166 Country Codesで定義されている国
注釈
GEOIPデータベースの更新頻度はDailyとなります。