web-dev-qa-db-ja.com

Apache2で1つの仮想ホストの複数のリバースプロキシを管理する

私のjs-Host VirtualHostには、次のような多くのリバースプロキシが定義されています。

/ etc/Apache2/sites-available/js-Host

<VirtualHost *:80>
ServerName js-Host.example.com
[...]
ProxyPreserveHost On
ProxyPass        /serviceA http://192.168.100.50/
ProxyPassReverse /serviceA http://192.168.100.50/
ProxyPass        /serviceB http://192.168.100.51/
ProxyPassReverse /serviceB http://192.168.100.51/
[...]
ProxyPass        /serviceZ http://192.168.100.75/
ProxyPassReverse /serviceZ http://192.168.100.75/
</VirtualHost>

Js-Hostサイトは、すべてのリバースプロキシの共有構成として機能しています。 これは機能しますが、プロキシの管理には共有設定の編集とApache2の再起動が含まれます。

a2ensiteおよびa2dissite(またはより良い代替)を使用して個々のプロキシを管理する方法はありますか?私の主な目的は、各プロキシ設定を個別のファイルとして分離し、コマンドで管理することです。

最初の試行

サービスごとに独自のVirtualHostエントリを持つ個別のファイルを作成してみました。

/ etc/Apache2/sites-available/js-Host-serviceA

<VirtualHost *:80>
ServerName js-Host.example.com
[...]
ProxyPass        /serviceA http://192.168.100.50/
ProxyPassReverse /serviceA http://192.168.100.50/
</VirtualHost>

/ etc/Apache2/sites-available/js-Host-serviceB

<VirtualHost *:80>
ServerName js-Host.example.com
[...]
ProxyPass        /serviceB http://192.168.100.51/
ProxyPassReverse /serviceB http://192.168.100.51/
</VirtualHost>

これに関する問題は、Apache2が特定のServerNameの最初のVirtualHostをロードし、残りを無視することです。私が望んでいたように、それらは何とか「マージ」されません。

1
Chris Betti

この問題に対する合理的な解決策を思いつきました。コアjs-Host構成を多くのリバースプロキシ構成と混合する代わりに、2つを分離しました。 js-Hostは現在、他のサービスについて何も知らないスタンドアロンサイトです。このアプローチの鍵は、他のすべてのリバースプロキシ設定の下にあるコアjs-Hostサイトに「/」のリバースプロキシを追加することです。

1つの構成ファイルにまだ多くのリバースプロキシ構成がありますが、構成ファイルはリバースプロキシ構成専用です。これは次のようなものです。

/ etc/Apache2/sites-available/js-Host

プロキシサーバーとして機能する仮想ホストに、ユーザーが使用するホスト名を指定する必要があります。また、 RewriteRule を使用してリバースプロキシを設定するより簡潔な方法を見つけました。

LoadModule proxy_module lib/httpd/mod_proxy.so
LoadModule proxy_http_module lib/httpd/mod_proxy_http.so

ProxyRequests off
<Proxy *>
    Order allow,deny
    Allow from all
</Proxy>

<VirtualHost *:80>
    ServerName    js-Host.example.com
    RewriteEngine on

    # Create reverse proxies via RewriteRule with the 'P' flag.
    RewriteRule ^/serviceA/(.*)$ http://192.168.100.50/$1 [P]
    RewriteRule ^/serviceB/(.*)$ http://192.168.100.51/$1 [P]
    [...]
    RewriteRule ^/serviceZ/(.*)$ http://192.168.100.75/$1 [P]

    # This links '/*' (anything not handled above) to js-Host-core.
    # '/' must come last, otherwise the reverse proxies above are ignored.
    ProxyPass        /  http://js-Host-core.example.com:2000/
    ProxyPassReverse /  http://js-Host-core.example.com:2000/
</VirtualHost>

コアサイトにはServerName js-Host-core.example.comが追加されました。他のすべての構成は同じです。

このソリューションが問題ない理由は、スクリプトを使用してRewriteRule行を簡単に追加または削除でき、Apacheのこのインスタンスを再起動すると、非常に迅速に再起動し、私のコアサイトが稼働し続けるためですので、サイクルタイム、キャッシュの損失、またはサイトサイクリングに関連するその他の悪影響について心配する必要はありません。

1
Chris Betti