その他

【Apache】リバースプロキシの設定方法|3つの構成パターンを解説(ProxyPass)

Apacheでリバースプロキシを設定する場合は、ProxyPass と ProxyPassReverse を使用します。

しかし実際には

  • すべてのアクセスを1台へ転送したい
  • サブドメインごとに転送先を変えたい
  • URLパスごとに転送先を変えたい

など構成によって設定方法が異なります。

本記事では、Apacheの mod_proxy を利用した代表的な3つの構成パターンを設定例付きで解説します。

環境・前提条件

本記事では、以下の環境を前提に解説します。

  • OS:Linux
  • Webサーバー:Apache HTTP Server
  • モジュール:mod_proxy、mod_proxy_http

モジュールについて:
mod_proxy はリバースプロキシ機能を提供する基本モジュールです。
HTTP/HTTPSへの転送には mod_proxy_http を使用します。

記述する設定内容は、主に /etc/httpd/conf/httpd.conf(または conf.d/ 配下の任意の設定ファイル)に書き込むことを想定しています。

補足

利用するプロトコルによっては、mod_proxy_ajp や mod_proxy_wstunnel など別のモジュールが必要になる場合があります。

また、リバースプロキシの設定は

  • VirtualHostごとの設定ファイル
  • conf.d
  • sites-available(Debian系)

など様々な場所で設定することがあります。

パターン①:すべて同じサーバーへ転送する

もっともシンプルな構成で、受け取ったリクエストをすべて1台のサーバーへ転送します。

リバースプロキシのみをインターネットへ公開し、バックエンドサーバーはプライベートネットワーク内に配置する構成でよく利用されます。

リバースプロキシですべて同じサーバーへ転送する場合の図

設定例

ProxyPass / http://192.168.1.10/
ProxyPassReverse / http://192.168.1.10/

仕組み

アクセスされたドメイン名やURLパスに関係なく、すべてのリクエストを 192.168.1.10 へそのまま送ります。

メリットと利用例

Webサーバーの隠蔽: 本番Webサーバーを直接インターネットに晒さず、リバースプロキシの裏に隠すことでセキュリティを高められます。

入口の一本化: WAF(Webアプリケーションファイアウォール)やSSL証明書の設定をリバースプロキシ側に集約できます。

パターン②:ホスト名で分岐する

1台のリバースプロキシで、アクセスされたドメイン名(ホスト名)によって転送先のサーバーを切り替える方法です。

リバースプロキシでホスト名で分岐する場合の図

例:
portal.example.com → 192.168.1.10
admin.example.com → 192.168.1.20
このように、サブドメインによって転送先を変える場合に使用します。

設定例

<VirtualHost *:80>
    ServerName portal.example.com

    ProxyPass / http://192.168.1.10/
    ProxyPassReverse / http://192.168.1.10/
</VirtualHost>

<VirtualHost *:80>
    ServerName admin.example.com

    ProxyPass / http://192.168.1.20/
    ProxyPassReverse / http://192.168.1.20/
</VirtualHost>

仕組み

ユーザーがブラウザでリクエストしたホスト名(HTTPヘッダーのHost情報)を判定し、該当するVirtualHostブロックの設定に従って転送先を決定します。

メリットと利用例

  • グローバルIPの節約: パブリックIPアドレスが1つしかなくても、複数ドメインのWebサービスを公開できます。
  • 役割に応じたサーバー分散: 社員ポータル、管理画面、APIサーバーなどをサブドメイン単位で物理的に別々のサーバーへ分離できます。

パターン③:パスで分岐する

同じドメイン宛てのアクセスであっても、URLの「パス」によって転送先を別々のサーバーへ割り振る方法です。

例:
example.com/pdf/ ➔ 192.168.1.10/pdf/ (PDF生成サーバー)

example.com/api/ ➔ 192.168.1.30/api/ (API処理サーバー)

設定例

ProxyPass /pdf/ http://192.168.1.10/pdf/
ProxyPassReverse /pdf/ http://192.168.1.10/pdf/

ProxyPass /api/ http://192.168.1.30/api/
ProxyPassReverse /api/ http://192.168.1.30/api/
注意

転送元と転送先の末尾にある / は、必ず記述を一致させてください。片方だけスラッシュが抜けていると、example.com/pdfへのアクセスが 192.168.1.10/pdfpdf のような意図しないURLへ転送され、404エラーなどの原因になります。

仕組み

URLパス(例:/api/ や /pdf/)を判定して転送先を決定します。

メリットと利用例

1つのサイトに見えるシームレスな構成: ユーザーからは1つのWebサイト(ドメイン)に見えますが、裏側では機能ごとにサーバーを分離できます。

高負荷機能の分散: 画像処理やPDF出力、API通信など、負荷の高い特定の処理だけを別スペックのサーバーに逃がすことが可能です。

【必須】セキュリティ設定:オープンプロキシ化を防ぐ

リバースプロキシを設定する際は、意図せず外部からの踏み台攻撃に利用されないよう、オープンプロキシ化を防ぐ設定が必要です。
Apacheの設定で以下を指定します。

ProxyRequests Off

ProxyRequests On にしてしまうと、自サーバーが「フォワードプロキシ」として機能してしまい、悪意ある第三者にインターネットへのアクセス用プロキシとして悪用される危険があります。リバースプロキシとして運用する場合は、必ず ProxyRequests Off になっているか確認しましょう。

どれを選べばいい?

構成向いているケース
すべて同じサーバーへ転送Webサーバーを外部公開したくない場合
ホスト名で分岐サブドメインごとにサービスを分けたい場合
パスで分岐APIや画像処理など機能ごとにサーバーを分けたい場合

注意点

ProxyPass と ProxyPassReverse は基本的にセットで記述します。
ProxyPass はリクエストを転送し、ProxyPassReverse はサーバーから返るリダイレクト応答(Locationヘッダなど)のURLを書き換えるために必要 です。

パスの末尾の「/」の有無によって転送先が変わる場合があるため、設定例に合わせて記述しましょう。

設定変更後は 構文エラーがないことを確認しApache を再起動します。

#構文チェック
apachectl configtest

#再起動
systemctl reload httpd

まとめ

Apacheのリバースプロキシは、ProxyPass と ProxyPassReverse を利用することで柔軟に構成できます。

  • すべてのアクセスを1台へ転送
  • ホスト名ごとに転送
  • URLパスごとに転送

という3つの構成を理解しておくと、多くのシステム構成に対応できます。

設定後は configtest で構文を確認し、動作確認まで行うことをおすすめします。

TOP