Photos récentes


Pages

Liens

Mots-clés

Archives

Ce site…

Utiliser Apache comme mandataire inverse

March 22nd, 2012 at 4:11 pm by nono

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.

Tags: , , ,
Posted in geekeries


4 Comments

  • Biapy says:

    Bonjour,

    j’apporte mon grain de sel à cet article.

    Mon expérience avec ProxyPass m’a fait constater dans certaine conditions des problèmes (je ne m’en souviens plus, c’est vieux). Plutôt que ProxyPass, j’utilise RewriteRule:

    ProxyPassReverse /pwg http://gallery.glou.org
    RewriteRule ^/pwg(.*) http://gallery.glou.org$1 [P,L]

    Pour ce qui est de l’utilisation de l’entête X-Forwarded-For, j’utilise mod_rpaf qui fait le travail simplement:

    https://howto.biapy.com/fr/debian-gnu-linux/serveurs/http/obtenir-ladresse-ip-reelle-dun-visiteur-accedant-a-un-serveur-apache-2-a-travers-un-reverse-proxy

    Sincèrement,
    Pierre-Yves Landuré
    Biapy

  • nono says:

    Merci pour ces précisions. Je ne connaissais pas mod_rpaf, je garde ça sous le coude.

    Pour ce qui est de l’utilisation de mod_proxy à travers mod_rewrite plutôt que directement, jusqu’à présent, je n’ai pas eu de problèmes ; je touche du bois. Tout ce que je vois susceptible de marcher de travers, c’est des réécritures avec un / en trop ou en moins ; la syntaxe que j’utilise plus haut (avec un / à la fin de tous les arguments) fonctionne dans tous les cas, sauf erreur de ma part.

  • Biapy says:

    Bonjour,

    concernant les erreurs avec mod_proxy, il s’agit d’un genre de timeout, il me semble. En gros, 1 fois sur X, une page d’erreur s’affiche plutôt que le site derrière le mandataire inverse.

    L’utilisation de mod_rewrite permet d’éviter cela.

    Sincèrement,
    Pierre-Yves Landuré
    Biapy

  • nono says:

    Je n’ai jamais rencontré ce problème, mais je garde ça en tête pour la prochaine fois que je ferai ce genre de manip. 🙂

 




XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>