Apache は多用途の Web サーバーであり、サポート機能を完全に提供しており、その一部は拡張機能を介しています。この記事では、
mod_proxy
モジュールを使用して、Apache をリバース プロキシ ロールに構成します。
Apache はリバース プロキシとしての最初の選択肢ではないかもしれませんが、NGINX などの最新の代替手段が注目を集める傾向にありますが、
mod_proxy
、すでに Apache を実行していて、トラフィックを別のサービスにルーティングする必要があるサーバーにとって便利です。 Apache 仮想ホストを設定して、特定のドメインへのリクエストを別の Web サーバーに渡すことができます。
このガイドでは、Debian ベースのシステムで Apache 2.4 を使用しています。また、トラフィックをプロキシしたいサーバーは、Apache ホストからすでにネットワーク アクセス可能であると仮定します。この記事では、一意の仮想ホストに基づいてプロキシを有効にすることに焦点を当てていますが、
mod_proxy
、Apache サーバー構成の一部として、またはディレクトリ レベルでグローバルに構成することもできます。
.htaccess
ファイル。
プロキシモジュールの有効化
mod_proxy
、デフォルトの Apache インストールに含まれています。使用
a2enmod
モジュールとその独立した HTTP コンポーネントを今すぐアクティブにするには、次のようにします。
sudo a2enmod プロキシ
sudo a2enmod proxy_http
これにより、他のホストへの HTTP 接続のプロキシをサポートするように Apache が設定されます。このモジュールは、Apache 構成ファイル内の
Proxy
という接頭辞が付いた命令を使用して構成されます。次にこれらを設定していきます。
プロキシ仮想ホストのセットアップ
example.com
を内部 IP アドレス
192.168.0.1
に転送する仮想ホストを設定してみましょう。 Apache ホストを指す
example.com
の DNS レコードを追加する必要があります。
このシナリオでプロキシを使用すると、訪問者は外部アドレスを介して内部 Web サーバーに透過的にアクセスできます。 Apache は、トラフィックを最終宛先にルーティングするゲートキーパーとして機能します。 Apache が実際には別のサーバー経由でリクエストを解決する場合でも、ユーザーには
example.com
が表示されます。
次の内容を含む新しい仮想ホスト ファイルを
/etc/apache2/sites-available
内に追加します。
<仮想ホスト *:80>
サーバー名 example.com
ProxyPass / http://192.168.0.1/ ノカノン
ProxyPassReverse / http://192.168.0.1/
</仮想ホスト>
ProxyPass
および
ProxyPassReverse
ディレクティブは、
example.com
へのトラフィックが
192.168.0.1
にプロキシされるように指定します。オプションの
nocanon
キーワードは、生の URL をリモート サーバーに渡すように Apache に指示します。このキーワードがないと、Apache は URL を自動的に正規化するため、一部のサーバーやフレームワークと互換性がなくなる可能性があります。
nocanon
を使用すると互換性が保証されますが、URL ベースのプロキシ攻撃に対する Apache の組み込み保護が無効になるため、
セキュリティ体制に影響を与える可能性があります
。
構成をリバース プロキシ セットアップとして区別するには、
ProxyPassReverse
指定する必要があります。 Apache は、提供された URL を使用して、バックエンドによって発行された
Location
、
Content-Location
、および
URI
応答ヘッダーを書き換えます。これにより、後続のリクエストは内部サーバーに直接到達しようとするのではなく、リバース プロキシに到達し続けることが保証されます。
この構成はすべてのリクエストをプロキシします。
ProxyPass
および
ProxyPassReverse
命令を調整することで、プロキシを
/media
などの特定のパスに制限できます。
プロキシパス /メディア http://192.168.0.1/
ProxyPassReverse /media http://192.168.0.1/
複数の
ProxyPass
ルールを追加すると、1 つの仮想ホストを使用して複数のターゲット間でリクエストをルーティングできます。ルールは、記述された順序で照合されます。より複雑なルーティング動作が必要な場合は、代わりに
ProxyPassMatch
ディレクティブを使用してください。これは
ProxyPass
と同等ですが、受信 URL を正規表現と照合します。
ProxyPassMatch ^/client/(.*)/images$ http://192.168.0.1/
仮想ホスト ファイルを保存し、
a2ensite
コマンドを使用して有効にします。これは、
sites-available
ディレクトリを基準としたファイルのベース名を取得します。
sudo a2ensite example-proxy-vhost
Apache を再起動して、変更を適用します。
sudoサービスapache2の再起動
これで、単純なプロキシが動作できるようになります。
example.com
にアクセスしてみてください。192.168.0.1
192.168.0.1
提供されるコンテンツが表示されるはずです。リクエストは Apache ホストで終了し、内部サーバーにプロキシされます。
SSLの使用
上記の例では SSL が省略されています。実稼働ワークロードでは、
SSLCertificateFile
および
SSLCertificateKeyFile
設定を仮想ホストに
追加してこれを設定する
ことをお勧めします。これらは、SSL 接続を検証するときに使用する SSL 証明書とキーを指定します。 Let’s Encrypt の
certbot を使用してセットアップを自動化すること
もできます。
この方法で SSL を構成すると、安全な接続が Apache ホストで終了することになります。 Apache とプロキシ ターゲット間の接続は、プレーン HTTP 経由で行われます。
プロキシ接続も保護する必要がある場合は、
mod_ssl
によって提供される
SSLProxy
オプションを使用する必要があります。 Apache とプロキシ ターゲット サーバーの両方が同じ証明書にアクセスできる場合、
SSLProxyEngine = On
最も基本的な構成として機能します。このオプションは、SSL 情報がプロキシ接続を介して供給されるように指示します。
プロキシオプション
Apache リバース プロキシには、転送動作を調整するために使用できる オプションのディレクティブが いくつかあります。よく使用されるオプションをいくつか示します。
-
ProxyAddHeaders– Apache は、デフォルトでX-Forwarded-Host、XForwarded-For、およびX-Forwarded-Serverヘッダーをバックエンド サーバーに渡します。これらにより、リクエストが Apache 経由でプロキシされたことをバックエンドが識別できるようになります。このヘッダーをOffに設定すると、Apache がこれらのヘッダーを追加できなくなります。 -
ProxyErrorOverride– 指示がない限り、Apache はバックエンド サーバーから送信される応答を妨げません。バックエンドが 400、404、500、またはその他のエラー コードを提供する場合、ユーザーはそのコンテンツをそのまま受け取ります。ProxyErrorOverrideを設定するとこれが変更され、Apache がエラー ページのコンテンツを 設定されたErrorDocumentに置き換えるようになります。これは、プロキシ ホストに集中した構成ですべてのバックエンドからのエラーを均一に処理する必要がある場合に望ましい場合があります。 -
ProxyPassReverseCookieDomain– これは、必須の (リバース プロキシ用)ProxyPassReverseディレクティブと同様に機能します。Set-Cookieヘッダー内のドメインを書き換えて、仮想ホストの送信元のバックエンド サーバーのホスト名ではなく、仮想ホストの名前を参照します。 -
ProxyPreserveHost– Apache は通常、独自のホスト名をHostヘッダーの値としてバックエンド サーバーに送信します。このディレクティブを設定すると、代わりに元のHostヘッダーが送信されることになります。これは、バックエンド ソフトウェアが独自のホスト名ベースのルーティングを実行する場合に必要になる場合があります。 -
ProxyTimeout– このディレクティブを使用して、バックエンド サーバーがプロキシされたリクエストを処理する間に Apache が待機する時間を調整します。タイムアウトを超えると、Apache はリクエストを中止し、クライアントにエラー コードを返します。デフォルトはサーバーレベルのTimeout値です。
これらのディレクティブを仮想ホスト ファイルの追加行として設定できます。変更を適用するたびに、必ず Apache サービスを再起動してください。
ロードバランシング
Apache のリバース プロキシ実装は、複数の異なるバックエンド間の負荷分散もサポートしています。これにより、
example.com
へのリクエストがバランシング プール内のサーバーのいずれかにヒットできるようになります。
<プロキシ バランサー://example-balancer>
バランサーメンバー http://192.168.0.1
バランサーメンバー http://192.168.0.2
ProxySet lbmethod=bytraffic
</プロキシ>
ProxyPass / バランサー://example-balancer
ProxyPassReverse / バランサー://example-balancer
この例では、リクエストを
example-balancer
プール内の 2 つのサーバーの 1 つにルーティングします。
負荷分散アルゴリズムは、
lbmethod
設定によって定義されます。ここで使用される
bytraffic
値は、各サーバーが同じ量のトラフィックを処理することを保証しようとします。
代替の
byrequests balancing method
、各バックエンドに受信リクエストの均等なシェアを与える bytraffic のより単純なバージョンです。
bybusyness balancer
各バックエンドが処理しているリクエストの数を追跡し、最も「ビジー」なバックエンドに新しいリクエストを割り当てます。
まとめ
mod_proxy
モジュールは、Apache をリバース プロキシ ホストに変換し、名前ベースのルーティングを使用して複数の独立したサービスにアクセスできるようにします。負荷分散を追加して、サーバー フリート全体にリクエストを分散することで安定性と稼働時間を確保することもできます。
他のプロキシ フレーバーも利用できます。
mod_proxy
と一緒に追加のアドオンをインストールすることで、特に FTP、WebSocket、HTTP2 接続をプロキシできます。
モジュールの完全なリストは、
Apache ドキュメントで入手できます。





