外部からの要求を受けて内部のサーバへ振り分ける中継サーバ。
リバースプロキシとは、外部からの要求を受けて内部のサーバへ振り分ける中継サーバです。サーバ側に配置され、外部の利用者にとっての「窓口」として働きます。
外部の利用者(クライアント)は、本来の内部サーバを直接知る必要がありません。すべての要求をまずリバースプロキシが受け取り、適切な内部サーバへ取り次ぎます。外部からはリバースプロキシだけが見え、その後ろにあるサーバの数や構成は隠れます。
身近な例で考えると、大きなホテルのフロントに似ています。来客はまずフロントに用件を伝え、フロントが空いている担当者や部屋へ案内します。来客がホテルの内部構造を知らなくても、フロントが正しく取り次いでくれるのと同じ働きです。
プロキシには大きく2種類あり、中継の向きが反対です。混同しやすいので、誰の代理かをセットで覚えると整理できます。
| 項目 | フォワードプロキシ | リバースプロキシ |
|---|---|---|
| 誰の代理か | 内部の端末(クライアント) | 内部のサーバ |
| 中継の向き | 内部 → 外部 | 外部 → 内部 |
| 配置場所 | クライアント側 | サーバ側 |
| 隠れるもの | 内部端末の身元 | サーバの構成 |
ふつう「プロキシサーバ」とだけ言うときはフォワードプロキシを指し、社内の端末が外部へアクセスする代理を務めます。一方リバースプロキシは「逆(リバース)」の名のとおり、外から来る要求をサーバ側で受け止めるのが役目です。
リバースプロキシは、多くの利用者からアクセスされるWebサービスの入口として使われます。窓口を一本化することで、いくつもの便利な役割を担えるからです。
代表的な用途は次のとおりです。
・負荷分散(ロードバランシング):同じ役割の内部サーバが複数あるとき、要求を空いているサーバへ振り分けて1台に集中させない
・SSL終端:暗号化通信(=盗み見を防ぐために通信内容を暗号化すること)の復号をまとめて行い、内部サーバの負荷を軽くする
・構成の隠蔽:外部から内部サーバの数や住所が見えないようにし、攻撃を受けにくくする
・キャッシュ:よく要求されるコンテンツを保存しておき、内部サーバへ届く前に素早く返す
身近な例で考えると、人気店の整理係に似ています。行列を見て空いているレジへ客を案内し(負荷分散)、混雑時にも全体がスムーズに回るように整える──こうした調整役を、Webサービスの入口で担うのがリバースプロキシです。
リバースプロキシを通るときに、通信は3つのステップで処理されます。この流れを理解すると、「なぜリバースプロキシが間に入るのか」がよく分かります。
・① 要求を受け取る:利用者(クライアント)からの要求をリバースプロキシだけが受け取る。内部サーバはこの段階では何も知らない
・② 振り分け先を選ぶ:現在どのサーバが空いているかを確認し、ふさわしい内部サーバを1台選ぶ
・③ 転送して返す:選んだサーバへ要求を届け、処理結果をリバースプロキシが受け取って利用者へ返す
なぜこの流れにするのか。利用者とサーバが直接やりとりしてしまうと、内部サーバのIPアドレス(=ネットワーク上の住所)が外部に見えてしまい、攻撃を受けやすくなります。リバースプロキシが間に入ることで、内部の構成を隠しながら柔軟に処理を振り分けられます。まるで受付担当者がすべての来客を取り次ぐことで、各部署の電話番号を外部に知られずに済むのと同じ仕組みです。
SSL終端(SSLターミネーション)とは、暗号化された通信の復号(=暗号を解いて元のデータに戻す処理)をリバースプロキシでまとめて引き受ける仕組みです。
なぜリバースプロキシにまとめるのか。暗号の復号は計算負荷が高い処理です。内部サーバが10台あれば、それぞれが個別に復号処理を行う必要があります。リバースプロキシに一本化すれば、復号は1か所だけで済み、各内部サーバはその重い処理から解放されます。
・利用者 → リバースプロキシ:暗号化された通信(HTTPS=盗み見を防ぐためのWeb通信)
・リバースプロキシ → 内部サーバ:復号済みの通常の通信(内部ネットワークは信頼できるため)
身近な例で考えると、外国語の手紙を全部まとめて翻訳してから各担当に渡す通訳係のようなものです。各担当が自分で翻訳するより、通訳が一括で処理した方が全体の効率が上がります。
キャッシュ(=一時保存)とは、リバースプロキシがよく要求されるコンテンツ(Webページや画像など)を手元に保存しておき、同じ要求が来たとき内部サーバへ届かせずに即座に返す仕組みです。
なぜこれで速くなるのか。通常は「利用者→リバースプロキシ→内部サーバ→リバースプロキシ→利用者」という往復が必要です。内部サーバへのアクセスにはデータベース(=情報を管理する仕組み)への問い合わせなど重い処理が伴うことが多く、時間がかかります。キャッシュがあれば内部サーバへ問い合わせるステップを省けるため、応答が速くなります。
・キャッシュHIT:保存済みの内容があれば即座に返す。内部サーバへの問い合わせゼロ
・キャッシュMISS:保存がなければ通常通り内部サーバへ問い合わせ、結果を保存してから返す
身近な例で考えると、よく聞かれる質問の回答を手帳にメモしておく窓口担当者のようなものです。同じ質問が来るたびに奥の部署へ確認しに行かなくて済むので、来客への対応がずっと速くなります。