CDNとリバースプロキシの仕組みを図解で説明 〜キャッシュでWebサイトが速くなる流れ〜
海外にあるWebサイトでも、すぐに表示されることが多いのはなぜだと思いますか?
その裏では、「CDN」や「リバースプロキシ」という仕組みが働いていることがあります。
どちらも、サーバの代わりに利用者に応える仕組みです。
CDNとリバースプロキシの仕組みについて、図を使って説明していきます。

プロキシとは?
プロキシは、「代理」という意味です。
通信の間に入って、誰かの代わりに通信をするサーバ をプロキシサーバと呼びます。
プロキシには、誰の代わりをするかで2種類あります。
フォワードプロキシ
フォワードプロキシは、利用者の代わりに、Webサイトへアクセスする プロキシです。
会社のネットワークの出口などに置かれます。
社員がWebサイトを見る時は、フォワードプロキシを通ってアクセスします。
見てはいけないサイトへのアクセスを止めたり、アクセスの記録を残したりするのに使います。
単に「プロキシ」と言う時は、こちらを指すことが多いです。
リバースプロキシ
リバースプロキシは、Webサーバの代わりに、利用者からの要求を受け取る プロキシです。
Webサーバの手前に置かれます。
利用者は、リバースプロキシを本物のWebサーバだと思ってアクセスします。
リバースプロキシは、受け取った要求を裏にあるWebサーバに渡し、返ってきた結果を利用者に返します。
リバースプロキシの役割
リバースプロキシを置くと、次のようなことができます。

- キャッシュ: 一度返したページや画像を覚えておき、同じ要求には裏のサーバに聞かずに返す
- 負荷分散: 要求を複数のWebサーバに振り分ける
- 暗号化の処理の肩代わり: HTTPSの暗号化と復号をリバースプロキシで行い、裏のサーバの負担を減らす
- 裏のサーバを隠す: 利用者からは、本物のWebサーバのIPアドレスや台数が見えない
リバースプロキシのソフトウェアとしては、nginx(エンジンエックス)がよく使われます。
CDNとは?
CDNは、Content Delivery Network(コンテンツ配信ネットワーク)の略です。
世界中に置いたサーバに、Webサイトの画像などのコピーを置いておき、利用者に近いサーバから届ける仕組み です。

もとのデータを持っているサーバを「オリジンサーバ」と呼びます。
利用者の近くに置かれたコピー用のサーバを「エッジサーバ」と呼びます。
日本の利用者は、日本にあるエッジサーバからデータを受け取ります。
海外のオリジンサーバまで毎回取りに行かないので、表示が速くなります。
CDNは、世界中に置いたリバースプロキシのキャッシュ、と考えるとイメージしやすいです。
代表的なサービスには、Akamai、Cloudflare、Amazon CloudFrontがあります。
キャッシュの流れ
エッジサーバに目的のデータがあるかどうかで、動きが変わります。

- キャッシュヒット: エッジサーバにデータがある。そのまま利用者に返すので速い
- キャッシュミス: エッジサーバにデータがない。オリジンサーバから取ってきて利用者に返し、エッジサーバにも保存しておく
一度キャッシュミスになったデータも、次からはキャッシュヒットになります。
キャッシュをどのくらいの時間持っておくかは、オリジンサーバが返す情報(Cache-Controlなど)や、CDNの設定で決めます。
CDNを使う時の注意点
CDNは便利ですが、次の点に注意が必要です。
- 更新がすぐに反映されないことがある: 古いキャッシュが残っている間は、古い内容が表示される。急ぐ時は、CDNのキャッシュを消す操作をする
- 利用者ごとに違うページは、キャッシュしないように設定する: マイページのように個人の情報が入ったページをキャッシュすると、別の人に見えてしまう。CDNが自動で見分けてくれるとは限らないので、Cache-Controlの指定(privateやno-store)やCDNの設定で、キャッシュの対象から外す
キャッシュしてよいのは、画像やCSSのように、誰が見ても同じ内容のデータです。
CDNとリバースプロキシの違い

リバースプロキシは、Webサーバと同じデータセンターなど、Webサーバのすぐ手前に置くことが多いです。
CDNは、事業者が世界中に用意した拠点を、サービスとして借りて使います。
まとめ
今回はCDNとリバースプロキシの仕組みについて説明しました。
リバースプロキシは、Webサーバの代わりに利用者からの要求を受け取るサーバで、キャッシュや負荷分散などを行います。
CDNは、世界中のエッジサーバにデータのコピーを置き、利用者に近い場所から届けて表示を速くする仕組みです。
「フォワードプロキシは利用者の代理、リバースプロキシはサーバの代理」と覚えておきましょう。
利用者が近いエッジサーバにつながる時には、DNSの仕組みが使われることがあります。DNSについては、DNSの仕組みを図解で説明の記事で説明しています。
HTTPSの暗号化については、SSL/TLS通信の仕組みを図解で説明の記事で説明しています。
要求を複数のWebサーバに振り分ける負荷分散については、ロードバランサーの仕組みを図解で説明の記事で説明しています。


