コンテンツ配信ネットワーク(CDN)とは?
CDNとは、本来のサーバーよりも距離が近いサーバーネットワーク上からキャッシュ情報を表示してパフォーマンスを向上させる仕組みです。
トラフィックが急増した時なども本来のサーバーへの負担を軽減できますし、優れたキャッシュ管理能力で通信品質を維持できます。
CDNはパフォーマンスを維持しつつ、常に1拠点当たりのキャッシュ量を増やす事が評価につながります。
コンテンツ配信ネットワーク(CDN)とは?
CDNとは、サーバーの分散ネットワークを使ってユーザーにリソースを配信し、WEBサイトの表示パフォーマンスを向上させる仕組みです。
トラフィック急増時にオリジンサーバー(本来のサーバー)の代わりに対応し、サーバー負荷を軽減す。
この記事ではCDNの機能や特徴、および構成後のポイントなどをご紹介します。
CDN導入のメリット
コンテンツ配信ネットワーク(CDN)は、ユーザーにコンテンツを素早く配信するために最適化されたサーバーネットワーク構成です。
このCDNを導入するメリットとして、主に以下の事が挙げられます。
・オリジンサーバーから直接ロードされるより早くコンテンツを配信できる
・ラウンドトリップ時間(RTT)の待ち時間が短くなる
・CDNキャッシュにより、オリジンサーバーへのリクエストの必要がなくなる
・キャッシュする・しないコンテンツを管理できる
CDNによる新規ネットワーク構築
まず前提としてCDNを使用してリソースを配信する方が、オリジンサーバーから直接リソースをロードさせるよりも高速です。
すぐには認識しずらいかも知れませんが、実際に構築するとその速さが実感できます。
CDNを使用してオリジンからリソースを配信すると、クライアントと近くのCDNサーバーの間に新しい接続が確立されます。
さらにCDNサーバーとオリジン間の接続は、CDNのネットワークを介して行われます。
新規構築ネットワークの利点
これには2つの利点があります。
できるだけユーザーの近くで接続終了
ユーザーのできるだけ近くで新しい接続を終了させれば、不要な接続設定コストが削減されます。
遠い位置での接続にはコストがかかり、複数のラウンドトリップが必要なためです。
再接続で通信をショートカット
事前にウォームアップされた接続を使用すると、可能な最大スループットでデータを即座に転送できます。
CDNがある場合とない場合の接続設定の比較
CDNはWEB全体に分散した複数のCDNサーバーを介し、トラフィックをオリジンサーバーにルーティングする事で接続を構築します。
この時CDNサーバー間の接続は、ボーダーゲートウェイプロトコル(BGP)によって決定されたルートではなく、高度に最適化されたルートを介して行われます。
BGPはインターネット上のベースとなるルーティングプロトコルですが、必ずしもパフォーマンス向上を目指すものではありません。
従ってCDNで決定されたルートの方が、BGPで決定されたルートよりもパフォーマンスが向上する場合が多いのです。
キャッシュ機能
CDNサーバーでリソースをキャッシュすると、わざわざオリジンサーバーまでいくリクエスト通信が不要になります。
その結果リソースがより迅速に配信されますので、WEBページの表示速度が向上しオリジンサーバーの負荷も軽減されます。
ただしWEBは常に新しい情報に更新されますよね。そこでキャッシュへの追加登録が必要です。
キャッシュへのリソースの追加
CDNキャッシュにデータを登録する最も一般的な機能が、CDNの「オリジンプル」機能です。
まだキャッシュされていないリソースが要求されると、CDNはオリジンサーバーからそのリソースを要求してリクエストをキャッシュします。
このようにして未キャッシュリソースのみが再キャッシュされ、蓄積されるのです。
キャッシュの削除
キャッシュのストレージ容量は当たり前ですが限りがあります。
キャッシュが上限に近づくと最近アクセスされていないリソースや多くのスペースを占めるリソースを削除して、スペースを確保します。
このプロセスは「キャッシュエビクション」と呼ばれます。
この時キャッシュから削除されたリソースは、必ずしもCDNネットワーク内の全てのキャッシュから削除される訳ではありません。
パージ(キャッシュ無効化)
パージはリソースの有効期限が切れたり削除されたりするのを待たずに、CDNのキャッシュからリソースを削除するためのメカニズムです。
誤字脱字や価格間違い、誤った情報の修正などでコンテンツの緊急変更が必要な場合、このパージ機能が利用されます。
さらにパージは、サイトのキャッシュ管理において重要な役割を果たします。
キャッシュタグ
パージは、通常「キャッシュタグ」または「代理キャッシュキー」と呼ばれる概念と組み合わせて使用されます。
これによりサイト所有者は、「タグ」と呼ばれる識別子をキャッシュされたリソースに複数関連付ける事ができます。
例えば「フッター」など全ページの共通リソースにおける変更・追加をするとしましょう。
この時CDNの「フッター」にあらかじめ関連付けられたタグを軸に、全てのリソースの該当箇所のみを削除するように指示ができるのです。
キャッシュ可能なリソース
リソースをキャッシュするかどうかは「リソースタイプ」によって異なります。
・パブリックリソース
・プライベートリソース
・静的リソース
・動的リソース
リソースがどのタイプに属するのかは、HTTPヘッダーで識別されます。
プライベートリソース
プライベートリソースには、単一ユーザー向けのデータが含まれているため、CDNでキャッシュするべきではありません。
プライベートリソースは「Cache-Control: private」ヘッダーで示すことができます。
パブリックリソース
パブリックリソースにはユーザー固有の情報が含まれていないため、CDNによってキャッシュ可能です。
リソースに「Cache-Control: no-store」または「Cache-Control: private」ヘッダーがない場合、キャッシュ可能と見なされる場合があります。
パブリックリソースをキャッシュできる時間の長さは、コンテンツが変更される頻度によって異なります。
動的コンテンツ
動的コンテンツは頻繁に変更されます。ショッピングサイトなどはまさにこのコンテンツタイプですね。
ただしショッピングサイトが頻繁に変更されるからと言って、キャッシュに不向きなのではありません。
例えばトラフィックが多い時間帯にコンテンツを5秒間隔でキャッシュする技があります。
そうするとデータの鮮度への影響を最小限に抑えながら、オリジンサーバーの負荷を大幅に減らす事ができるのです。
静的コンテンツ
静的コンテンツは変更されることはほとんどありません。
画像やビデオおよびライブラリ等は、このコンテンツタイプです。
静的コンテンツは頻繁には変更されないため、半年・1年など長いスパンでキャッシュする必要があります。
関連記事
CDNを選択するポイント
CDNを選択する際の最も重要なポイントは「パフォーマンス」ですよね。
ただしその他の機能(セキュリティや分析機能など)、および価格やサポートなども考慮しなければなりません。
PoPとキャッシュヒット率
CDNのパフォーマンスは、大まかに「Point of Presence(PoP)の最小化」と「キャッシュヒット率の最大化」とのバランスです。
・Point of Presence(PoP)とは、拠点となるCDNサーバーの数
・キャッシュヒット率とは、特定時間中に1サーバー内で使うキャッシュの量
両者のバランスが大事
・経由するサーバー拠点数を少ないとパフォーマンスが下がるが、1拠点当たりの利用キャッシュ量を増やせる。
・経由するサーバー拠点を多いとパフォーマンスは高いが、1拠点当たりの利用キャッシュ量が減る。
PoPが高い場合は待ち時間を短縮できますが、トラフィックがより多くのキャッシュに分割されるため、キャッシュヒット率が低下する可能性があります。
PoPが少ない場合は数が少ない訳ですから、場所によってはユーザーから離れたサーバーからの通信になりますよね。
となるとその分パフォーマンスが下がりますが、キャッシュヒット率は高くなる訳です。
少ないサーバー経由数で1拠点当たりの利用キャッシュ量を増やしつつ、パフォーマンスは下げない事が大事です。
キャッシュ階層型アプローチ
これに対する対策として、CDNはキャッシュに階層型アプローチを使用します。
ユーザーの近くにあるいわゆる辺境のPoP「エッジキャッシュ」は、キャッシュヒット率が高く階層中央にあるPoPで補完されます。
エッジキャッシュがリソースを見つけることができない場合に、この階層中央のPoP内キャッシュを探す訳です。
このアプローチの場合待ち時間がわずかに長くなり、リソースがCDNキャッシュから提供される可能性も高くなりますが、キャッシュヒット率は比較的高い数値を維持できます。
パフォーマンスは常に変動する
CDNのパフォーマンスは固定値ではありません。
サイトとそのユーザーの性質によっては、CDNの1つが優れたパフォーマンスを提供する場合があるでしょう。
しかしCDNのパフォーマンスは、地域、時間帯、さらには現在の状態によっても大幅に異なってきます。
CDNのパフォーマンス値を知る事は大切ですが、常に変動する環境から正確なパフォーマンス値を予測する事は難しいのです。
追加機能
CDNはメインの機能以外に様々な機能を提供します。
一般的に提供される機能には、負荷分散、画像最適化、ビデオストリーミング、エッジコンピューティング、およびセキュリティ製品が含まれます。
CDNをセットアップおよび構成する方法
CDNを利用するためには、サインアップした後CDNプロバイダを指すようにドメインDNSレコードのCNAMEを更新する必要があります。
例えばwww.example.comのCNAMEレコードを「example.my-cdn.com」と設定する訳です。
こうする事でサイトへのトラフィックがCDNを介してルーティングされます。
セットアップの具体的な方法については別記事にて紹介します。
CDN導入後におこなう事
CDNは配信を開始して終わりではなく、常にパフォーマンス性能を向上させる観察が必要です。
キャッシュヒット率を上げてパフォーマンス機能を有効にすることで、CDNを最大限に活用しなければなりません。
キャッシュヒット率の向上
CDNを効率的に配置すれば、それだけ1拠点で提供できるキャッシュの量が変わってきます。
この提供量の変化は、先述したキャッシュヒット率(CHR)によって測定されます。
キャッシュヒット率は「キャッシュヒット数」を「特定の時間中の合計リクエスト数」で割ったものです。
CHR90%が目標
新しくスタートキャッシュのCHRは「0」ですが、キャッシュにリソースが追加されるとCHRは増加します。
通常はCHR90%が目標ですので、CDNプロバイダーはCHRに関する分析とレポートを提供する必要があります。
CHRを最適化する場合、キャッシュされたリソースが期間中にどれだけ読込されているかがポイントになるのです。
キャッシュ分析チェック
ほとんどのCDNはキャッシュ分析を提供します。
さらにWebPageTestやLighthouseなどのツールを使用して、ページの全ての静的リソースが正しい時間キャッシュされているかを素早く確認する事もできます。
これは各リソースのHTTPキャッシュヘッダーをチェックすることによって実現されます。
適切な最大存続時間(TTL)を使用してリソースをキャッシュすると、将来の不要なオリジン接触が回避されるため、CHRが増加します。
HTTPキャッシュヘッダー
少なくともリソースをCDNでキャッシュするには、通常以下のヘッダーの1つを設定する必要があります。
Cache-Control: max-age=
Cache-Control: s-max-age=
Expires
Cache-Control: immutable
上記以外に、さらにCache-Control: immutableディレクティブも設定することをお勧めします。
Cache-Control: immutableはリソースが「鮮度を保っている期間中は更新されない」ことを示します。
このヘッダーによりブラウザは、ブラウザのキャッシュからリソースを提供する時にリソースを再検証しないため、不要なサーバー要求が排除されます。
残念ながらこのヘッダーはFirefoxとSafariでのみサポートされており、Chromiumベースのブラウザではサポートされていません。
CDN導入後の調整
リクエストURLの管理
CDNではキャッシュおよびキャッシュからのリソース取得のキーとして、基本的には「リクエストURL」が使用されます。
リクエストURLは、リクエストヘッダーやクエリパラメータなどの影響を大きく受けます。
例えば同じページでありながら違うURLが存在する(パラメータが付く)場合は、CDNのパフォーマンスに影響する訳です。
そこで行われるのが「リクエストURLの書き換え」です。
クエリパラメータ
CDNはデフォルトで、リソースをキャッシュする時にクエリパラメータを考慮に入れます。
重複コンテンツ
同じリソースである可能性が高い以下のURLを、CDNはデフォルトでは個別にキャッシュします。
example.com/blog
example.com/blog.php?id=2
これは「?id=2」を無視するようにCDNの設定を調整することで修正できます。
パラメータの順序を照会する
CDNは以下を個別にキャッシュします。
example.com/blog.php?id=123&query=time
example.com/blog.php?query=time&id=123
ほとんどのサイトではクエリパラメータの順序は重要ではないため、クエリパラメータを並べ替えるようにCDNを構成します。
それによりサーバーの応答をキャッシュするために使用されるURLが正規化され、CHRが増加します。
この様にクエリパラメータの処理を調整する事で、CHRに大きな影響を与える可能性があります。
適切に構成されれば、厳密には不要なキャッシュや不十分なキャッシュ(ユーザーに誤った情報が提供される結果)を改善できるのです。
リクエストURLの書き換えは、ユーザーに提供される正しいコンテンツを保証する面でも重要です。
クッキー
Cookieは、Cookieヘッダーを介してリクエストに設定されます。
「Set-Cookieヘッダー」などがよく使われます。
ただしSet-Cookieキャッシュを入れると通常このヘッダーを含むサーバー応答をキャッシュしないため、不必要な使用は避けるべきです。
まとめ
CDNを使用する事はネットワークリソースを迅速に配信し、オリジンサーバーの負荷を軽減してトラフィックの急増に対処するのに役立ちます。
そして静的コンテンツと動的コンテンツの両方をキャッシュすることができ、状況に応じて削除する事も出来ます。
サイトを定期的に監査して、コンテンツを最適にキャッシュしているかどうかを確認する必要があります。