CDNを使用して静的コンテンツ配信を高速化する

前書き

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

ページの読み込み時間を劇的に短縮し、パフォーマンスを改善し、帯域幅とインフラストラクチャのコストを削減するには、CDN、または c ontent d elivery n etworkを実装して、これらのアセットをキャッシュします地理的に分散したサーバーのセット。

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

CDNとは何ですか?

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

image:http://assets.digitalocean.com/articles/CDN/without-CDN.png [CDNを使用しないコンテンツ配信の図]

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

image:http://assets.digitalocean.com/articles/CDN/CDN.png [コンテンツ配信ネットワーク(CDN)図]

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

CDNプロバイダーは、多くの場合、https://www.digitalocean.com/community/tutorials/digitalocean-community-glossary#ddos-attack [DDoS]の軽減とレート制限、ユーザー分析、ストリーミングまたはモバイル使用の最適化などの追加機能を提供します。追加費用でケース。

CDNの仕組み

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

CDNをロールアウトし、これらの静的アセットをCDNサーバーにオフロードしたら、手動で「プッシュ」するか、CDNにアセットを自動的に「プル」させます(両方のメカニズムはhttps://www.digitalocean.com/ community / tutorials / using-a-cdn-to-speed-up-static-content-delivery#push-vs-pull-zones [次のセクション])、Webサーバーにこれらのように静的コンテンツへのリンクを書き換えるよう指示しますリンクは、CDNがホストするファイルを指すようになりました。 WordPressなどのCMSを使用している場合、このリンクの書き換えはhttps://wordpress.org/plugins/cdn-enabler/[CDN Enabler]などのサードパーティプラグインを使用して実装できます。

多くのCDNはカスタムドメインをサポートし、CDNエンドポイントを指すドメインの下にCNAMEレコードを作成できます。 CDNは、このエンドポイント(バックエンドサーバーよりもユーザーにはるかに近いエッジにある)でユーザーリクエストを受信すると、ユーザーに最も近いPoint of Presence(PoP)にリクエストをルーティングします。 このPoPは、多くの場合、インターネット交換ポイント(IxP)に配置された1つ以上のCDNエッジサーバーで構成されます。 次に、CDNの内部ロードバランサーは、このPoPにあるエッジサーバーにリクエストをルーティングし、このサーバーがユーザーにコンテンツを提供します。

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

  1. CDNは、PNG画像などの静的アセットの最初のリクエストを受信すると、アセットをキャッシュせず、近くのCDNエッジサーバーまたはオリジンサーバー自体からアセットのコピーを取得する必要があります。 これはキャッシュの「ミス」と呼ばれ、通常は `+ X-Cache:MISS +`を含むHTTP応答ヘッダーを調べることで検出できます。 この最初のリクエストは、このリクエストを完了するとアセットがエッジでキャッシュされるため、将来のリクエストよりも遅くなります。

  2. このエッジロケーションにルーティングされたこのアセット(キャッシュ「ヒット」)に対する今後のリクエストは、有効期限が切れるまで(通常はHTTPヘッダーを介して設定される)キャッシュから提供されます。 これらの応答は、最初の要求よりも大幅に高速になり、ユーザーのレイテンシを劇的に削減し、WebトラフィックをCDNネットワークにオフロードします。 HTTP応答ヘッダーを調べると、CDNキャッシュから応答が提供されたことを確認できます。HTTP応答ヘッダーには、 `+ X-Cache:HIT +`が含まれているはずです。

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

次のセクションでは、人気のある2種類のCDN、* push および pull * CDNを紹介します。

プッシュvs. プルゾーン

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

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

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

CDNを使用する利点

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

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

原点オフロード

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

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

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

これらの利点は、主に帯域幅を集中的に使用するビデオコンテンツを提供するWebサイトではさらに大きくなります。

トラフィックスパイクの管理とダウンタイムの回避

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

単一のオリジンサーバを使用するWebサイトの場合、これらの大きなトラフィックの急増がシステムを圧倒することが多く、計画外の停止とダウンタイムを引き起こす可能性があります。 さまざまなレベルのWebトラフィックを処理するように設計された、可用性が高く冗長なCDNインフラストラクチャにトラフィックをシフトすると、資産とコンテンツの可用性が向上します。

コストを削減

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

セキュリティを高める

CDNのもう1つの一般的な使用例は、DDoS攻撃の緩和です。 多くのCDNプロバイダーには、エッジサーバーへの要求を監視およびフィルタリングする機能が含まれています。 これらのサービスは、疑わしいパターンのWebトラフィックを分析し、悪意のある攻撃トラフィックをブロックしながら、評判の良いユーザートラフィックを許可し続けます。 通常、CDNプロバイダーは、インフラストラクチャレベル(https://en.wikipedia.org/wiki/Denial-of-service_attack#Types[OSIレイヤー3および4])での一般的な攻撃保護から、さらに多くのDDoS軽減サービスを提供します。高度な緩和サービスとレート制限。

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

最適なソリューションを選択する

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

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

ページの読み込み速度を測定して改善するのに役立つツールは、Googleのhttps://developers.google.com/speed/pagespeed/insights/[PageSpeed Insights]です。 要求と応答時間のウォーターフォール内訳と推奨される最適化を提供する別の便利なツールは、https://www.pingdom.com/ [Pingdom]です。

結論

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

WordPress、Drupal、Django、Ruby on Railsなどの主要なフレームワークのプラグインとサードパーティのサポート、DDoS緩和、完全なSSL、ユーザー監視、資産圧縮などの追加機能により、CDNはセキュリティとトラフィックの多いWebサイトを最適化します。

前の投稿:Apacheを使用してUbuntu 14.04サーバーにDrupalをインストールする方法
次の投稿:ウェビナーシリーズ:コンテナ化されたアプリケーションの構築