序章

最新のWebサイトおよびアプリケーションは、多くの場合、大量の静的コンテンツをエンドユーザーに配信する必要があります。 このコンテンツには、画像、スタイルシート、JavaScript、およびビデオが含まれます。 これらの静的アセットの数とサイズが増えると、帯域幅の使用量が増え、ページの読み込み時間が長くなり、ユーザーのブラウジングエクスペリエンスが低下し、サーバーの利用可能な容量が減少します。

ページの読み込み時間を大幅に短縮し、パフォーマンスを向上させ、帯域幅とインフラストラクチャのコストを削減するために、CDN、またはcオンテントd配信nネットワークを実装できます。地理的に分散したサーバーのセット全体でこれらの資産をキャッシュします。

このチュートリアルでは、CDNの概要とその機能、およびCDNがWebアプリケーションに提供できるメリットについて説明します。

CDNとは何ですか?

コンテンツ配信ネットワークは、地理的に分散したサーバーのグループであり、静的コンテンツをエンドユーザーに配信するように最適化されています。 この静的コンテンツはほとんどすべての種類のデータですが、CDNは、Webページとその関連ファイル、ストリーミングビデオとオーディオ、および大規模なソフトウェアパッケージを配信するために最も一般的に使用されます。

Diagram of content delivery without a CDN

CDNは、さまざまな場所にある複数のポイントオブプレゼンス(PoP)で構成され、それぞれがoriginまたはホストサーバーからアセットをキャッシュする複数のedgeサーバーで構成されます。 ユーザーがWebサイトにアクセスし、画像やJavaScriptファイルなどの静的アセットをリクエストすると、そのリクエストはCDNによって最も近いエッジサーバーにルーティングされ、そこからコンテンツが提供されます。 エッジサーバーにアセットがキャッシュされていないか、キャッシュされたアセットの有効期限が切れている場合、CDNは近くの別のCDNエッジサーバーまたはオリジンサーバーから最新バージョンをフェッチしてキャッシュします。 CDNエッジにアセットのキャッシュエントリがある場合(これは、Webサイトが適度な量のトラフィックを受信した場合に大部分が発生します)、キャッシュされたコピーをエンドユーザーに返します。

Content Delivery Network (CDN) diagram

これにより、地理的に分散したユーザーは、静的コンテンツを受信するために必要なホップ数を最小限に抑え、近くのエッジのキャッシュからコンテンツを直接フェッチできます。 その結果、レイテンシとパケット損失が大幅に減少し、ページの読み込み時間が短縮され、オリジンインフラストラクチャの負荷が大幅に削減されます。

CDNプロバイダーは、多くの場合、 DDoS の緩和とレート制限、ユーザー分析、ストリーミングまたはモバイルのユースケースの最適化などの追加機能を追加コストで提供します。

CDNはどのように機能しますか?

ユーザーがWebサイトにアクセスすると、最初に、ホストWebサーバーのIPアドレスを含むDNSサーバーからの応答を受信します。 次に、ブラウザはWebページのコンテンツを要求します。このコンテンツは、HTMLページ、CSSスタイルシート、JavaScriptコード、画像など、さまざまな静的ファイルで構成されていることがよくあります。

CDNをロールアウトし、これらの静的アセットをCDNサーバーにオフロードしたら、手動で「プッシュ」するか、CDNにアセットを自動的に「プル」させます(両方のメカニズムについては、次のセクションで説明します)。次に、静的コンテンツへのリンクを書き換えて、これらのリンクがCDNによってホストされているファイルを指すようにするようにWebサーバーに指示します。 WordPressなどのCMSを使用している場合、このリンクの書き換えは、 CDNEnablerなどのサードパーティのプラグインを使用して実装できます。

多くのCDNはカスタムドメインのサポートを提供し、CDNエンドポイントを指すドメインの下にCNAMEレコードを作成できるようにします。 CDNは、このエンドポイント(エッジにあり、バックエンドサーバーよりもユーザーにはるかに近い)でユーザーリクエストを受信すると、ユーザーに最も近いPoint of Presence(PoP)にリクエストをルーティングします。 このPoPは、多くの場合、インターネットエクスチェンジポイント(IxP)に配置された1つ以上のCDNエッジサーバーで構成されます。これは、基本的にインターネットサービスプロバイダー(ISP)がネットワークを相互接続するために使用するデータセンターです。 次に、CDNの内部ロードバランサーは、このPoPにあるエッジサーバーにリクエストをルーティングします。エッジサーバーは、コンテンツをユーザーに提供します。

キャッシングメカニズムはCDNプロバイダーによって異なりますが、通常は次のように機能します。

  1. CDNがPNGイメージなどの静的アセットの最初のリクエストを受信すると、アセットはキャッシュされないため、近くのCDNエッジサーバーまたはオリジンサーバー自体からアセットのコピーをフェッチする必要があります。 これはキャッシュの「ミス」と呼ばれ、通常、X-Cache: MISSを含むHTTP応答ヘッダーを調べることで検出できます。 この最初のリクエストは、このリクエストの完了後にアセットがエッジでキャッシュされるため、将来のリクエストよりも遅くなります。
  2. このエッジの場所にルーティングされたこのアセットの将来のリクエスト(キャッシュの「ヒット」)は、有効期限が切れるまで(通常はHTTPヘッダーを介して設定されます)キャッシュから処理されるようになります。 これらの応答は最初のリクエストよりも大幅に高速になり、ユーザーの待ち時間が大幅に短縮され、WebトラフィックがCDNネットワークにオフロードされます。 X-Cache: HITが含まれているはずのHTTP応答ヘッダーを調べることで、応答がCDNキャッシュから提供されたことを確認できます。

特定のCDNがどのように機能し、実装されているかについて詳しくは、CDNプロバイダーのドキュメントを参照してください。

次のセクションでは、pushpullCDNの2つの一般的なタイプのCDNを紹介します。

プッシュ対。 プルゾーン

ほとんどのCDNプロバイダーは、データをキャッシュする2つの方法を提供しています。プルゾーンとプッシュゾーンです。

プルゾーンには、オリジンサーバーのアドレスを入力し、CDNにサイトで利用可能なすべての静的リソースを自動的にフェッチしてキャッシュさせることが含まれます。 プルゾーンは、HTML、CSS、JavaScriptファイルなどの頻繁に更新される中小規模のWebアセットを配信するために一般的に使用されます。 CDNにオリジンサーバーのアドレスを提供した後、次のステップは通常、静的アセットへのリンクを書き換えて、CDNによって提供されたURLを指すようにします。 その時点から、CDNはユーザーの着信アセットリクエストを処理し、地理的に分散したキャッシュとオリジンからコンテンツを適切に提供します。

プッシュゾーンを使用するには、指定されたバケットまたはストレージの場所にデータをアップロードし、CDNが分散したエッジサーバーのフリートのキャッシュにプッシュします。 プッシュゾーンは通常、アーカイブ、ソフトウェアパッケージ、PDF、ビデオ、オーディオファイルなど、変更頻度の低い大きなファイルに使用されます。

CDNを使用する利点

ほとんどすべてのサイトでCDNを展開することで得られるメリットを享受できますが、一般的にCDNを実装する主な理由は、帯域幅をオリジンサーバーからCDNサーバーにオフロードし、地理的に分散したユーザーの遅延を減らすことです。

これらと、以下のCDNを使用することで得られるその他の主な利点のいくつかについて説明します。

オリジンオフロード

サーバーの帯域幅容量に近づいている場合は、画像、動画、CSS、JavaScriptファイルなどの静的アセットをオフロードすると、サーバーの帯域幅使用量が大幅に削減されます。 コンテンツ配信ネットワークは、静的コンテンツを提供するように設計および最適化されており、このコンテンツに対するクライアントの要求は、エッジCDNサーバーにルーティングされて提供されます。 これには、オリジンサーバーがはるかに低い頻度でこのデータを提供するため、オリジンサーバーの負荷を軽減するという追加の利点があります。

ユーザーエクスペリエンスを向上させるための低レイテンシ

ユーザーベースが地理的に分散していて、トラフィックの重要な部分が地理的に離れたエリアから来ている場合、CDNは、ユーザーに近いエッジサーバーに静的アセットをキャッシュすることでレイテンシを減らすことができます。 ユーザーと静的コンテンツの間の距離を縮めることで、コンテンツをより迅速にユーザーに配信し、ページの読み込み速度を上げることでユーザーエクスペリエンスを向上させることができます。

これらの利点は、主に帯域幅を大量に消費するビデオコンテンツを提供するウェブサイトでさらに複雑になります。この場合、待ち時間が長く、読み込み時間が遅いと、ユーザーエクスペリエンスとコンテンツエンゲージメントに直接影響します。

トラフィックスパイクを管理し、ダウンタイムを回避する

CDNを使用すると、エッジサーバーの大規模な分散ネットワーク全体で要求を負荷分散することにより、大規模なトラフィックのスパイクとバーストを処理できます。 配信ネットワークで静的コンテンツをオフロードしてキャッシュすることにより、既存のインフラストラクチャでより多くの同時ユーザーに対応できます。

シングルオリジンサーバーを使用しているWebサイトの場合、これらの大規模なトラフィックスパイクがシステムを圧倒し、計画外の停止やダウンタイムを引き起こす可能性があります。 さまざまなレベルのWebトラフィックを処理するように設計された高可用性で冗長なCDNインフラストラクチャにトラフィックをシフトすると、アセットとコンテンツの可用性を高めることができます。

コストを削減

通常、静的コンテンツの提供は帯域幅の使用量の大部分を占めるため、これらのアセットをコンテンツ配信ネットワークにオフロードすると、毎月のインフラストラクチャの支出を大幅に削減できます。 CDNは、帯域幅のコストを削減するだけでなく、オリジンサーバーの負荷を軽減することでサーバーのコストを削減し、既存のインフラストラクチャを拡張できるようにします。 最後に、一部のCDNプロバイダーは、固定価格の月額請求を提供しており、変動する月間帯域幅の使用量を安定した予測可能な定期的な支出に変換できます。

セキュリティを強化する

CDNのもう1つの一般的な使用例は、DDoS攻撃の軽減です。 多くのCDNプロバイダーには、エッジサーバーへのリクエストを監視およびフィルタリングする機能が含まれています。 これらのサービスは、疑わしいパターンについてWebトラフィックを分析し、悪意のある攻撃トラフィックをブロックしながら、信頼できるユーザートラフィックを引き続き許可します。 CDNプロバイダーは通常、インフラストラクチャレベルでの一般的な攻撃保護(OSIレイヤー3および4)から、より高度な緩和サービスやレート制限まで、さまざまなDDoS緩和サービスを提供します。

さらに、ほとんどのCDNでは完全なSSLを構成できるため、CDNが提供するSSL証明書またはカスタムSSL証明書を使用して、CDNとエンドユーザー間のトラフィック、およびCDNとオリジンサーバー間のトラフィックを暗号化できます。

最適なソリューションの選択

ボトルネックが帯域幅ではなくオリジンサーバーのCPU負荷である場合、CDNは最適なソリューションではない可能性があります。 この場合、NGINXやVarnishなどの一般的なキャッシュを使用したローカルキャッシュは、システムメモリからアセットを提供することで負荷を大幅に削減する可能性があります。

CDNを展開する前に、JavaScriptファイルとCSSファイルの縮小と圧縮、WebサーバーのHTTP要求圧縮の有効化などの追加の最適化手順も、ページの読み込み時間と帯域幅の使用に大きな影響を与える可能性があります。

ページの読み込み速度を測定して改善するための便利なツールは、Googleの PageSpeedInsightsです。 要求時間と応答時間のウォーターフォール内訳、および提案された最適化を提供するもう1つの便利なツールは、Pingdomです。

結論

コンテンツ配信ネットワークは、Webサイトのスケーラビリティと可用性を向上させるための迅速で効果的なソリューションになります。 地理的に分散した最適化されたサーバーのネットワークに静的アセットをキャッシュすることで、エンドユーザーのページの読み込み時間と遅延を大幅に削減できます。 さらに、CDNを使用すると、ユーザーの要求を吸収し、エッジのキャッシュから応答することで帯域幅の使用量を大幅に削減できるため、帯域幅とインフラストラクチャのコストを削減できます。

プラグインと、WordPress、Drupal、Django、Ruby on Railsなどの主要なフレームワークのサードパーティによるサポートに加えて、DDoS軽減、完全なSSL、ユーザーモニタリング、アセット圧縮などの追加機能を備えたCDNは、トラフィックの多いWebサイトを最適化します。