インフラ

リバースプロキシとは?仕組み・フォワードプロキシとの違いと導入判断を実装目線で解説

リバースプロキシは、クライアントとWebサーバーの間に置き、リクエストを受け取って背後のサーバー群へ転送する中継サーバーです。同じ「プロキシ」でもフォワードプロキシとは代理する対象が逆で、負荷分散・SSL/TLS終端・キャッシュ・IP秘匿といった役割を1台に集約できます。この記事では、リクエストの流れとフォワードプロキシとの違い、担う4つの機能、nginxでの最小構築設定、そしてロードバランサーやAPIゲートウェイとの使い分け・採用しない判断までを、実装者の視点で整理します。

目次

まとめ:リバースプロキシの役割と導入判断の要点

リバースプロキシは、公開サーバーの手前に立ち、受け取ったHTTP/HTTPSリクエストを内部のアプリケーションサーバーへ振り分ける役割を担います。クライアントから見える窓口を1つにまとめ、その裏で複数サーバーへの分散、証明書の一元管理、静的コンテンツのキャッシュ、内部IPの秘匿をまとめて処理できる点が導入の動機になります。

フォワードプロキシが「クライアント側の代理」であるのに対し、リバースプロキシは「サーバー側の代理」です。この一点を押さえると、社内からの外部アクセス制御はフォワード、外部からの受け口の集約はリバース、と用途が明確に分かれます。

実装ではnginxやApache、HAProxy、EnvoyといったソフトウェアやAWS ALBなどのマネージドサービスが選択肢になります。単一ドメインの受け口統一とSSL終端だけならリバースプロキシ1台で足り、L7の細かなルーティングや認証・レート制限まで求めるならAPIゲートウェイ、L4を含む大規模分散ならロードバランサーへ広げる、という順で判断すると過剰投資を避けられます。

リバースプロキシの動作原理とフォワードプロキシとの根本的な違い

「プロキシ」は代理を意味し、通信を誰かの代わりに中継する仕組みを指します。違いは、その代理が守る相手がクライアント側かサーバー側かにあります。まず押さえるべきはリクエストの流れです。

クライアントから背後のアプリサーバーへリクエストを転送する流れ

ユーザーのブラウザは、公開ドメイン(例:example.com)へアクセスすると、名前解決の結果としてリバースプロキシのIPアドレスに到達します。ブラウザはその先に何台のサーバーがあるかを知りません。

リバースプロキシはリクエストのHostヘッダやパスを見て、あらかじめ定義したルールに従い背後のアプリケーションサーバー(例:127.0.0.1:8080)へ転送します。応答を受け取ったら、それをクライアントへ返します。この間、クライアントとの接続はプロキシが終端し、背後サーバーとは別の接続を張り直すため、通信は前段と後段の2区間に分かれる構造です。この分離があるからこそ、後段の構成を自由に組み替えられます。

フォワードプロキシとリバースプロキシの設置場所と代理対象の違い

フォワードプロキシは社内ネットワークなどクライアント側に置き、利用者の代わりに外部サイトへアクセスします。守るのは発信元であるクライアントで、外部から見えるのはプロキシのIPになります。企業のWebフィルタリングや社外接続の記録がこの用途です。フォワードプロキシ側の詳細はプロキシサーバーとは何かを整理した解説記事で扱っているため、社内アクセス制御の観点はそちらを参照してください。

リバースプロキシは公開サーバー側に置き、サービス提供者の代わりにリクエストを受けます。守るのは背後のサーバー群で、外部から内部構成が見えません。両者を1枚の表で対比します。

観点 フォワードプロキシ リバースプロキシ
設置場所 クライアント側(社内LAN等) サーバー側(公開側)
代理する対象 利用者(発信元) サービス提供者(受信側)
隠す情報 クライアントのIP 背後サーバーの構成・IP
代表的な用途 社外アクセス制御・記録 負荷分散・SSL終端・受け口集約
クライアントの認識 プロキシ経由を設定で認識 直接サーバーに見え意識しない

設定の観点でも差が出ます。フォワードプロキシは利用者側でプロキシ設定を行う必要があり、リバースプロキシは利用者側の設定が要りません。窓口のドメインを引けば透過的に経由する仕組みです。

リバースプロキシが担う負荷分散・SSL終端・キャッシュ・秘匿の4機能

リバースプロキシを入れる実利は、複数の機能を前段1か所に集約できる点にあります。ここでは実務で効きやすい順に4つを扱います。すべてを同時に使う必要はなく、要件に応じて取捨選択する前提です。

複数のアプリサーバーへの負荷分散とヘルスチェックによる可用性確保

受けたリクエストを複数のアプリケーションサーバーへ振り分けると、1台あたりの処理量が下がり、水平スケールが可能になります。振り分け方式はラウンドロビン、最少接続数、IPハッシュなどが基本で、nginxならupstreamブロックで定義します。

あわせてヘルスチェックを設定し、応答しないサーバーを振り分け対象から自動で外すと、1台の障害がサービス全体の停止に波及しません。振り分けアルゴリズムや冗長化の設計を突き詰める段階では、専用機であるロードバランサーの仕組みと振り分け方式を実装目線で解説した記事で扱う内容と重なります。役割の境界は後半の判断章で整理します。

SSL/TLS終端による証明書の一元管理と後段通信の平文化の判断

クライアントとのHTTPS接続をリバースプロキシで終端すると、TLSの復号を前段に集約できます。証明書の配置・更新をプロキシ1か所で済ませられるため、背後にアプリケーションサーバーが10台あっても証明書を10か所に配る手間が消えます。

終端後、後段への通信は平文HTTPにするか、内部でも再暗号化するかを選びます。同一ホスト内や閉じた内部ネットワークなら平文で負荷を下げ、ゼロトラスト方針なら内部も暗号化する、という判断になります。Let’s Encryptの証明書は有効期限が90日のため、自動更新の仕組みを前段にまとめられる利点も見逃せません。

静的コンテンツのキャッシュと圧縮による背後サーバーの負荷削減効果

画像やCSS、JavaScriptなど更新頻度の低いレスポンスをリバースプロキシでキャッシュすると、背後のアプリケーションサーバーへ届く前に応答を返せます。動的処理を走らせずに済むぶん、サーバーのCPU負荷と応答時間を下げられます。

gzipやBrotliによる圧縮も前段でまとめて処理でき、転送量の削減につながります。キャッシュはヒットすれば効果が大きい一方、更新の反映遅延という副作用を伴うため、キャッシュ対象と保持時間(Cache-Control)の設計が実務の勘所になります。

背後サーバーのIP秘匿とWAF連携による受け口のセキュリティ強化

背後サーバーのIPアドレスやポート構成が外部から見えないため、攻撃者が直接サーバーを狙う経路を減らせます。公開する接点をプロキシ1台に絞ることで、監視やアクセス制御の対象も一元化できます。

前段にWAF(Web Application Firewall)を組み合わせると、SQLインジェクションや不正パスへのアクセスを受け口で遮断できます。受け口を1か所にまとめる設計は、ログ集約とインシデント調査の面でも運用を軽くします。ただし、この1台が単一障害点になり得る点は、後述の冗長化で補う前提です。

nginxで構築するリバースプロキシの最小設定と転送ヘッダの要点

リバースプロキシの代表的な実装がnginxです。設定ファイルの記述量は少なく、最小構成なら十数行で動きます。ここでは基本のproxy_passと、転送時に落としてはいけないヘッダを押さえます。

proxy_passとX-Forwarded系ヘッダを渡す基本設定

公開ポート80で受けたリクエストを、同一ホストのポート8080で動くアプリへ転送する最小構成を考えます。serverブロックでlisten 80;server_nameを宣言し、その内側のlocationブロックですべてのパス(/)を受ける形です。転送先はproxy_passにhttpスキームでバックエンドのアドレス(127.0.0.1:8080)を指定します。

ここでの勘所はproxy_set_headerです。プロキシが接続を張り直す構造上、これを省くと背後のアプリには送信元がすべてプロキシのIPに見え、本来のクライアントIPやアクセスプロトコルを取得できません。Host $hostで元のホスト名を、X-Real-IP $remote_addrX-Forwarded-For $proxy_add_x_forwarded_forで発信元IPを、X-Forwarded-Proto $schemeで元のプロトコルを渡し、アプリ側でこれらを信頼する設定にして初めて、正しいログとリダイレクト判定が成立します。

タイムアウト・バッファリング・WebSocket転送の調整ポイント

デフォルト設定のまま本番に出すと、応答の遅いAPIで504 Gateway Timeoutが出ることがあります。proxy_read_timeoutを処理時間に合わせて延ばし、大きなレスポンスではproxy_bufferingの挙動を確認します。

チャットや通知などWebSocketを使うアプリを背後に置く場合は、UpgradeConnectionヘッダを明示的に転送しないと接続が確立しません。proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";を加える必要があります。この転送漏れは、リバースプロキシ導入時に最も踏みやすい失敗の一つです。

ロードバランサー・APIゲートウェイとの使い分けと採用判断の基準

リバースプロキシは負荷分散もルーティングもこなすため、ロードバランサーやAPIゲートウェイと機能が重なります。境界を役割で整理し、どこまでをリバースプロキシで担うかの判断基準を示します。

ロードバランサーとの機能の重なりとL4/L7での役割分担の境界

ロードバランサーは「複数サーバーへの振り分け」に特化した装置で、L4(TCP/UDP)レベルの分散を含めて高スループットで捌くことに強みがあります。リバースプロキシはL7(HTTP)で内容を見た振り分けやSSL終端、キャッシュまで担う点が違いです。

小〜中規模で「HTTPの受け口統一+数台への分散」が要件なら、nginx1台がリバースプロキシ兼ロードバランサーを兼ねられます。トラフィックが増え、L4分散や専用機の可用性が要る段階で専用のロードバランサーへ切り出すのが過剰投資を避ける定石です。両者の内部の仕組みの違いはロードバランサーの種類と振り分け方式の記事で詳しく比較しています。

APIゲートウェイを選ぶべき場面とリバースプロキシとの機能差

APIゲートウェイは、リバースプロキシの転送機能を土台にしつつ、認証・認可、レート制限、APIキー管理、リクエスト変換といったAPI運用に特化した機能を上乗せした製品です。マイクロサービスの前段で複数APIを束ね、共通の認証やスロットリングをかけたい場合はこちらが向きます。

単にWebサイトの受け口を集約してSSL終端したいだけなら、APIゲートウェイは過剰です。境界と選定基準はAPIゲートウェイとリバースプロキシ/サービスメッシュの違いを解説した記事で判断材料を整理しています。認証やレート制限が要件に入った時点でAPIゲートウェイを検討する、という線引きが実務的です。

リバースプロキシを単段で導入しない方がよい場面と冗長化の必要性

すべての構成に前段プロキシが要るわけではありません。静的サイトを1台で配信するだけ、あるいはCDNが既にSSL終端と負荷分散を担っている構成では、自前のリバースプロキシは運用対象を増やすだけで見合いません。まず要件を数えることを勧めます。

導入する場合も、単段で組むと前段が単一障害点になります。プロキシを1台だけ立て、その裏でアプリを冗長化しても、プロキシが落ちれば全滅します。本番では前段自体を2台以上で冗長化するか、マネージドサービスに寄せる設計が前提です。可用性を織り込んだ本番インフラの設計・構築を外部と進めるなら、AWS/GCP/Azureのインフラ構築支援で冗長化を含む前段設計から相談できます。要件が「受け口統一とSSL終端」に収まるうちは、リバースプロキシ1系統で始め、認証・大規模分散が必要になった段階で専用製品へ広げるのが堅実です。

よくある質問

導入検討時に問い合わせの多い論点を、実装の判断基準とあわせて5つ挙げます。

リバースプロキシとロードバランサーは何が違いますか?

リバースプロキシはL7で内容を見た転送やSSL終端・キャッシュまで担う汎用の中継、ロードバランサーはL4を含む振り分けに特化した専用機、という役割の違いです。小規模ではnginx1台が両方を兼ねられ、L4分散や高可用が要る規模で専用のロードバランサーへ切り出します。機能が重なるため、要件の規模で使い分けるのが実務的な判断になります。

フォワードプロキシとリバースプロキシはどちらを使うべきですか?

目的で決まります。社内から外部への接続を制御・記録したいならフォワードプロキシ、外部からの受け口を集約して負荷分散やSSL終端を行いたいならリバースプロキシです。守る対象がクライアント側かサーバー側かで用途は明確に分かれ、両方を同時に使う構成もあります。

nginxでリバースプロキシを組むと処理は遅くなりませんか?

1区間の中継が挟まるぶんのわずかな遅延は生じますが、キャッシュや圧縮、SSL終端の集約による効果がそれを上回る場面が多くあります。proxy_read_timeoutやバッファリングを要件に合わせて調整すれば、体感の遅延はほぼ問題になりません。むしろ静的配信のキャッシュヒットで応答が速くなるケースも目立ちます。

リバースプロキシはセキュリティ対策として有効ですか?

背後サーバーのIPと構成を隠し、公開接点を1か所に絞れるため、直接攻撃の経路を減らす効果があります。前段にWAFを組み合わせれば不正リクエストを受け口で遮断できます。ただしプロキシ自体が攻撃対象になるため、脆弱性対応と冗長化を怠らないことが前提です。

クラウドのロードバランサーがあればリバースプロキシは不要ですか?

AWS ALBなどのL7ロードバランサーはリバースプロキシに近い機能を持ち、SSL終端やパスベースのルーティングを担えます。要件がそれで収まるなら自前のプロキシは不要です。細かなヘッダ書き換えや独自のキャッシュ制御など、マネージド側で表現しきれない要件がある場合に自前のリバースプロキシを併用します。

関連記事

資料請求

RELATED POSTS 関連記事