Utiliser Apache comme mandataire inverse

March 22, 2012 by nono
Caté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.