mercredi 4 novembre 2009

Reverse proxy Apache avec changement d'url

J'utilise régulièrement sur des outils un peu expérimentaux : ils embarquent un serveur web, et on les lance en ligne de commande. Par exemple Fitnesse ou Rdiffweb. Ces outils marchent très bien, mais du fait qu'ils embarquent leur propre serveur web, c'est un peu pénible à intégrer dans une infrastructure existante.

Mettons que, par exemple, j'utilise un serveur apache pour exposer un serveur SVN (http://monserveur/svn) et un wiki (http://monserver/wiki). Je souhaiterais donc accèder à RdiffWeb via http://monserveur/rdiffweb. Mais celui ci est lancé séparément de Apache et accesssible via http://monserveur:8080...

Reverse proxy simple
La première chose à faire est d'exposer RdiffWeb via un reverse proxy en utilisant le module proxy apache. Pour cela on ajoute dans la config apache :

ProxyPass        /ridffweb http://localhost:8080
ProxyPassReverse /rdiffweb http://localhost:8080

Ainsi RdiffWeb est accessible par l'URL http://monserveur/rdiffweb.Le problème est que RdiffWeb écrit des liens hypertextes dans les pages HTML en commencant l'URL par /. De même les feuilles de style CSS dans la page sont référencées par /static/main.css, alors qu'à travers le reverse proxy, on peut y accèder par /rdiffweb/static/main.css. Or RdiffWeb n'a pas d'option de configuration pour spécifier l'URL racine (c'est un peu expérimental !). Dans des produits plus évolués, cette URL racine est configurable, et est appelée "base url" ou "root url".

Reverse proxy html
Pour régler ce problème, il existe un module apache pour réécrire les liens hypertextes, les css, les liens vers les javascripts : module proxy html. J'ai mis un certain temps pour le faire fonctionner, voila ma configuration finale :

SetOutputFilter proxy-html
ProxyHTMLURLMap / /rdiffweb/
ProxyHTMLExtended On
RequestHeader unset Accept-Encoding

La première ligne (SetOutputFilter proxy-html) sert à activer le module. La deuxième indique les réécriture à faire : ici remplacer / par /rdiffweb/. La directive ProxyHTMLExtended permet de réécrire non seulement les liens hypertextes, mais aussi les liens vers les CSS et les javascript. La dernière ligne, je ne sais pas trop à quoi ça sert, mais sans Firefox fait des erreurs étranges :-).
Enfin bref, avec cette configuration, RdiffWeb marche nickel derrière mon reverse proxy.

Les limitations
Tous n'est pas rose : modifier le HTML peut introduire des problèmes. Le module peut ne pas voir certaines URL à réécrire (dans des fichiers javascript par exemple). Donc cela ne marchera pas forcément à tous les coups. En général, cela marche bien avec les trucs un peu expérimentaux, car ils sont simples ....
Par ailleurs, cela peut consommer pas mal de temps CPU dans Apache.

Sur Ubuntu
Pour utiliser cela sur Ubuntu, il faut
- installer le module proxy_html (apt-get install libapache2-mod-proxy-html)
- activer les modules nécessaires (a2enmod proxy_html et a2enmod headers)
- parfois configurer le mod_proxy, en modifiant /etc/apache2/mod-available/proxy.conf, mettre un Allow from all dans la section

Aucun commentaire:

Enregistrer un commentaire