技術ノート ハードウェア Apache でリバース プロキシを設定する方法

Apache でリバース プロキシを設定する方法

Apache でリバース プロキシを設定する方法

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 という接頭辞が付いた命令を使用して構成されます。次にこれらを設定していきます。

Apache でリバース プロキシを設定する方法

プロキシ仮想ホストのセットアップ

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 ホストで終了し、内部サーバーにプロキシされます。

Apache でリバース プロキシを設定する方法

SSLの使用

上記の例では SSL が省略されています。実稼働ワークロードでは、 SSLCertificateFile および SSLCertificateKeyFile 設定を仮想ホストに 追加してこれを設定する ことをお勧めします。これらは、SSL 接続を検証するときに使用する SSL 証明書とキーを指定します。 Let’s Encrypt の certbot を使用してセットアップを自動化すること もできます。

この方法で SSL を構成すると、安全な接続が Apache ホストで終了することになります。 Apache とプロキシ ターゲット間の接続は、プレーン HTTP 経由で行われます。

プロキシ接続も保護する必要がある場合は、 mod_ssl によって提供される SSLProxy オプションを使用する必要があります。 Apache とプロキシ ターゲット サーバーの両方が同じ証明書にアクセスできる場合、 SSLProxyEngine = On 最も基本的な構成として機能します。このオプションは、SSL 情報がプロキシ接続を介して供給されるように指示します。

Apache でリバース プロキシを設定する方法

プロキシオプション

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 でリバース プロキシを設定する方法

ロードバランシング

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 各バックエンドが処理しているリクエストの数を追跡し、最も「ビジー」なバックエンドに新しいリクエストを割り当てます。

Apache でリバース プロキシを設定する方法

まとめ

mod_proxy モジュールは、Apache をリバース プロキシ ホストに変換し、名前ベースのルーティングを使用して複数の独立したサービスにアクセスできるようにします。負荷分散を追加して、サーバー フリート全体にリクエストを分散することで安定性と稼働時間を確保することもできます。

他のプロキシ フレーバーも利用できます。 mod_proxy と一緒に追加のアドオンをインストールすることで、特に FTP、WebSocket、HTTP2 接続をプロキシできます。 モジュールの完全なリストは、 Apache ドキュメントで入手できます。

「 Apache でリバース プロキシを設定する方法」に関するベスト動画選定!

【#20 Proxy 】プロキシ解説 セキュリティのお勉強
#015【Linux サーバー構築】Rocky Linux 9.2 上に Apache HTTPDで ロードバランサ―を立てる。リバースプロキシを負荷分散してみましょう。