Utiliser Apache comme mandataire inverse
March 22, 2012 by nonoCatégories geekeries - Mots-clés Apache Linux proxy système
Il y a quelques jours, j'ai dû (provisoirement) utiliser Apache comme mandataire inverse pour un de mes sites web. Vu que j'ai dû régler 2 ou 3 détails qui m'ont fait replonger dans la config d'Apache, un petit aide-mémoire.
Le cahier des charges : le site http://gallery.glou.org/ doit apparaître comme http://photos.glou.org/pwg/, sachant que http://photos.glou.org/ est déjà peuplé et se trouve sur une machine physique différente. Pourquoi ne pas utiliser simplement une redirection ? Simple : jusqu'à ce matin, la machine gallery.glou.org ne disposait pas d'une adresse IPv4 publique. Elle était par contre joignable normalement en IPv6. Ce problème étant résolu, la config décrite ici devrait disparaître dès que j'aurai un moment pour m'en occuper ; en attendant je la décris, elle pourrait resservir.
Travaillons d'abord sur photos.glou.org qui va jouer le rôle de mandataire. Il faut bien entendu y utiliser les modules Apache mod_proxy et mod_proxy_http pour la fonctionnalité de base ; ne pas oublier d'y ajouter mod_substitute pour réécrire les URL. Au final, la config (partielle) ressemble à ça :
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so LoadModule substitute_module /usr/lib/apache2/modules/mod_substitute.so <VirtualHost *> ServerName photos.glou.org .../... Redirect /pwg /pwg/ ProxyPass /pwg/ http://gallery.glou.org/ ProxyPassReverse /pwg/ http://gallery.glou.org/ <Location /pwg/> AddOutputFilterByType SUBSTITUTE text/html Substitute "s|http://gallery.glou.org|http://photos.glou.org/pwg|" </Location> </VirtualHost>
En l'état, ça marche mais les logs sur gallery.glou.org montreront toutes les requêtes comme provenant du mandataire. On va donc indiquer à Apache (sur gallery, donc, cette fois-ci) d'utiliser le format combined classique pour les requêtes directes et d'indiquer l'adresse d'origine véritable en plus de celle du mandataire pour les requêtes qu'il relaie. Ça se dit comme ça :
# Une copie du format combined standard, au cas ou. LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-std LogFormat "%{X-Forwarded-For}i (via %h) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined-proxy SetEnvIf X-Forwarded-For ".+" proxiedrequest CustomLog logs/proxy_log combined-std env=!proxiedrequest CustomLog logs/proxy_log combined-proxy env=proxiedrequest
Voilà, maintenant ça juste marche.