web-dev-qa-db-fra.com

Gestion de plusieurs proxys inverses pour un hôte virtuel dans Apache2

J'ai beaucoup de proxys inverses définis pour mon js-Host VirtualHost, comme ceci:

/ 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>

Le site js-Host agit en tant que configuration partagée pour tous les proxys inverses. Cela fonctionne , mais la gestion des proxies implique la modification de la configuration partagée et le redémarrage d'Apache2.

Existe-t-il un moyen de gérer des serveurs mandataires individuels avec a2ensite et a2dissite (ou une meilleure alternative)? Mon objectif principal est d'isoler chaque configuration de proxy en tant que fichier séparé et de le gérer via des commandes.

première tentative

J'ai essayé de créer des fichiers séparés avec leurs propres entrées VirtualHost pour chaque service:

/ 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>

Le problème est que Apache2 charge le premier VirtualHost pour un nom de serveur particulier et ignore le reste. Ils ne sont pas "fusionnés" d'une manière ou d'une autre, comme je l'espérais.

1
Chris Betti

Je suis venu avec une solution raisonnable à ce problème. Au lieu de mélanger la configuration principale js-host avec beaucoup de configuration de proxy inverse, j'ai séparé les deux. js-Host est maintenant un site autonome qui ignore tout des autres services. La clé de cette approche consiste à ajouter un proxy inverse pour '/' au site principal js-Host en dessous de toutes les autres configurations de proxy inverse.

Même s'il reste encore beaucoup de configurations de proxy inverse dans un fichier de configuration, le fichier de configuration ne concerne que la configuration de proxy inverse. Voici à quoi ça ressemble:

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

Vous devez donner au virtualhost agissant en tant que serveur proxy le nom d’hôte que vous souhaitez que vos utilisateurs utilisent. En outre, j'ai trouvé un moyen plus concis de configurer un proxy inverse à l'aide de 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>

Le site principal a maintenant ServerName js-Host-core.example.com. Toutes les autres configurations sont les mêmes.

Cette solution est acceptable parce que je peux ajouter ou supprimer des lignes RewriteRule facilement avec un script. Lorsque je redémarre cette instance d’Apache, elle redémarre très rapidement et , mon site principal reste opérationnel , je n'ai donc pas à m'inquiéter du temps de cycle, de la perte de mémoire cache ou de tout autre effet négatif lié au cycle du site.

1
Chris Betti