CDN

CDNについて解説します。

CDNを利用する目的

サイト読み込み速度の高速化

CDNサービスとは大量のエッジサーバー(キャッシュサーバーとも言う)を使いファイルを配信するためのサービスです。そのためCDNサービスを運営する会社は世界中にキャッシュサーバーを持っています。CDNへのアクセスが発生すると、アクセスしたユーザーから物理的な距離が最も近い場所にあるサーバーを、CDNのシステムが自動で選択します。そのサーバーからファイルを配信することで、応答時間が短くなりサイトの読み込み速度の高速化が見込めます。

物理的な距離によるアクセス速度の違いは、データサイズにもよりますが目安として国内で数ミリ秒〜十数ミリ秒、海外だと100ミリ秒以上違いが出ると言われています。

また、副次的な効果として多くのCDNサービスがHTTP2に対応しており、自社のサーバーがHTTP2対応していなくても、CDNを利用することでキャッシュサーバーからのファイルの配信がHTTP2で行われ、読み込み速度の高速化が見込めることもあります。

トラフィックの分散

もう一つの大きな利点として、一部のリクエストをCDN側のキャッシュサーバーが担当するので、自社で用意したサーバーへの負荷が軽減されます。このため自社で用意したサーバーが高負荷によりレスポンスが遅くなっている場合、トラフィックの分散による高速化も期待ができます。

CDNの仕組み

キャッシュサーバーとオリジンサーバー

CDNは、CDN側が用意しているサーバー(キャッシュサーバー)と自社で用意するサーバー(オリジンサーバー)が連携してファイルの配信を行ないます。

具体的には、ユーザーのリクエストはまずキャッシューサーバーに送られ、URLで指定されたファイルがキャッシュサーバー内で見つからない場合(初回リクエスト時など)、キャッシュサーバーがオリジンサーバーからそのファイルを取得、サーバーに保存を行った後にユーザーに配信という流れになります。

ユーザーが同じURLに2回目以降にアクセスする際には、キャッシュサーバーに該当のファイルが既に保存されているので、オリジンサーバーにはリクエストが行われず、キャッシュサーバー内のファイルがユーザーに配信されます。

よって前セクションの「高速化」「トラフィックの分散」は、正確にはキャッシュサーバーにファイルが存在するとき、すなわち2回目のアクセスから実現することとなります。

キャッシュサーバーとオリジンサーバー

DNSの設定

前項にてユーザーのリクエストはまずキャッシューサーバーに送られると説明しましたが、CDNのキャッシュサーバーにアクセスするために、デフォルトではCDNサービスのドメインが使われます。そのためサービスで使うドメインでキャッシュサーバーにアクセスするためには、DNS(ドメインネームシステム)の変更を行う必要があります。

*DNS:サーバーに設定されたIPアドレスに対して、任意の名前(空間)との紐付けを行うことができるシステムです。例えば、192.41.192.129というサーバーのIPアドレスに対してwww.example.comの紐付けを行うことで、文字列でサーバーに対してアクセスを行うことができます。

具体的には、ドメインを管理しているDNSに対して、新しいCNAME(canonical name)レコードを追加します。CNAMEはドメインに別名を設定するための機能で、これで管理するドメインの別名をCDNサービスの(使用するサブ)ドメインとして登録することができます。この設定によりユーザーは、該当するドメインにアクセスするとキャッシュサーバーにアクセスが届くようになります。

キャッシュの対象範囲

メリットの大きいCDNのキャッシュサーバーですが、全てのリクエストをキャッシュ対象とするのではなく、変更の少ないファイルや画像など、完全な静的ファイルをキャッシュ対象とすることが推奨されます。理由としては、頻繁に内容が変わるページのHTML(例えばコメント欄のあるページなど)をキャッシュ対象にしてしまうと、ユーザーの書き込みが発生した際に、オリジンサーバー上では変更されていても、キャッシュサーバーでそれ以前の内容を配信してしまうので、ユーザーからすると変更が反映されていないように見えてしまうことがあるからです。

ではどのように対象範囲を指定すれば良いのかというと、大抵のCDNサービスではキャッシュ対象をHTTPメソッドやファイルの拡張子を使って指定できます。例えばPOSTメソッドはデータ追加に使われるのでGET、HEADメソッドに限定し、かつ拡張子がjpg、cssもしくはpngの場合のみキャッシュサーバーにデータを保存する、という設定が可能です。

キャッシュの対象範囲

CDNのデメリット

キャッシュ事故の可能性

「キャッシュの対象範囲」で触れた通り同じURLでも内容が変わり得るページなどはキャッシュ対象に推奨しないと述べましたが、その理由は単に内容の反映が遅れるからだけではなく、個人情報の漏洩にも繋がりかねません。

例えばキャッシューサーバーが空の状態で、あるユーザーが会員情報ページにアクセスしたとします。するとそのユーザーの会員情報が載っているHTMLをキャッシュサーバーが保存してしまい、別のユーザーが会員情報ページにアクセスした際に、URLが同じなのでキャッシュサーバーはオリジンサーバーに問い合わせずに前のユーザーの情報をそのまま返してしまうことになります。こうしてあるユーザーの会員情報が全てのユーザーから見えてしまうこととなるのです。

ファイル更新の時間差

「キャッシュの対象範囲」で、キャッシュの対象をHTTPメソッドやファイルの拡張子で指定できると述べましたが、他にもキャッシュの保持期間も設定できます。これで「頻繁には変更されないけど月に一回ぐらいは変更の可能性がある」というファイルも、キャッシュ時間を1週間にしておくことで最大1週間は反映が遅れるものの、キャッシュサーバーで効率的にファイルを配信しつつファイル更新にも対応できます。

キャッシュの保持時間は短くするとオリジンサーバーでの更新にほぼ遅延なくキャッシュ内容も更新されますが、オリジンサーバーへの負荷がCDN導入前とそこまで変わらなくなってしまうので、各ファイルの想定される更新時期を鑑みて適切な値を選ぶ必要があります。また、必要に応じてURLを指定して手動でキャッシュ削除をすることも可能です。

このような設定はほとんどのCDNサービスで利用可能ですが、キャッシュの削除時間(手動削除のリクエストを受けつけてから全てのキャッシュサーバーに削除のリクエストが反映されるまでの時間)、設定項目の細かさ、設定の容易さは各サービスで差があるので、その辺りを加味してどのサービスを利用するのかを検討する必要があります。

CDNによるセキュリティ対策

CDNの便利な面や使い方をこれまで解説しましたが、CDNにはセキュリティ対策の一面もあり、その中でもよく言われているのがDDoS攻撃の対策です。DDoS攻撃とは大量のマシンからある特定のサービスに大量のリクエストを送り高負荷をかける攻撃手法です。CDNがなぜDDoSの対策のなるのかというと、「トラフィックの分散」で述べた通り、一部のリクエストを大量にあるCDNのキャッシュサーバーが肩代わりしてくれるからです。このおかげで、自社のサーバーがDDoSの負荷に耐えられないスペックであったとしても、殆どの攻撃のリクエストはキャッシュサーバーまでしか届かないのでサービスがダウンするなどの問題を回避できます。

まとめ

CDNの利点、欠点や簡単な仕組みなどについてここまで説明してみました。一度仕組みや使い方を理解できると、CDNはオリジンサーバーを一切変更せずに負荷対策やサイトの高速化など様々な利点を享受することができます。上述したデメリットにも気を付けつつ、一度導入の検討をしてみてはいかがでしょうか。