Apache/ReverseProxy

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Cette page est un peu en marge de Java car elle traite du serveur Apache Http Server, communément appelé Apache tout simplement, et de l’utilisation du mod_proxy en reverse proxy. Cependant, cette configuration en reverse proxy est largement utilisée dans une architecture où Apache est installé en frontal d’un ou plusieurs serveurs d’applications Java.

Toutes les informations consignées ci-dessous ont été testées avec Apache 2.2.

Apache mod_proxy

Le module mod_proxy peut fonctionner en proxy forward ou reverse. C’est cette seconde fonctionnalité qui nous intéresse ici.

Le mod_proxy permet de paramétrer des transferts de requêtes entre Apache et d’autres serveurs Web, comme Tomcat, JBoss ou Glassfish. Cependant, ce module ne prend pas en charge le transport pour lequel on doit associer des modules spécialisés : mod_proxy_http, mod_proxy_ftp,…​

La façon d’activer les modules peut dépendre de la distribution Linux qu’on utilise. Grossièrement, ça se passe dans le fichier httpd.conf, mais lorsqu’on installe Apache via les dépôts de la distribution, ce fichier est éclaté en plusieurs fichiers et répertoires.

mod_proxy_sous_openSUSE[mod_proxy sous openSUSE

J’ai testé la configuration du mod_proxy sous openSUSE 11.

Tout d’abord, il faut charger le module. Tous les chargements de modules se font dans le fichier /etc/apache2/sysconfig.d/loadmodule.conf. J’y ai donc ajouté le chargement du mod_proxy et du mod_proxy_http.

...
LoadModule proxy_module                   /usr/lib/apache2-itk/mod_proxy.so
LoadModule proxy_http_module              /usr/lib/apache2-itk/mod_proxy_http.so

Ensuite, il faut déclarer ces modules dans le fichier /etc/sysconfig/apache2.

APACHE_MODULES="... proxy proxy_http"

(…​ représente les modules déjà déclarés)

Enfin, on peut paramétrer le proxy en ajoutant un fichier de configuration dans le répertoire /etc/apache2/conf.d/. Ce paramétrage sera présenté ci-dessous, son contenu ne dépendant pas de la distribution.

Pour finir, les modifications seront prises en compte après le redémarrage d’Apache.

rcapache2 restart

mod_proxy_sous_Debian[mod_proxy sous Debian

Sous Debian, l’activation du mod_proxy et de se(s) module(s) de transport passe par la création de liens symbolique dans le répertoire mod_available de la configuration d’Apache : fichiers .load pour le chargement des modules et fichiers .conf pour leur configuration.

ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/

Le paramétrage se fait dans le fichier /etc/apache2/mods-enabled/proxy.conf.

Pour finir, les modifications seront prises en compte après le redémarrage d’Apache.

apache2ctl restart

Configuration en reverse proxy

Dans cet exemple, j’ai exposé l’application docs fournie dans Tomcat via Apache. Tomcat et Apache sont sur le même serveur. Pour adapter l’exemple à un autre déploiement, il suffit de modifier les adresses de serveurs et leurs ports.

Le premier niveau de configuration est d’indiquer que les requêtes du contexte /docs doivent être passées à Tomcat. L’URL dans la directive ProxyPass est sur le protocole http, ce qui nécessite le chargement du mod_proxy_http. L’autre protocole classique avec Tomcat est AJP, avec le mod_proxy_ajp.

<Location /docs>
       ProxyPass http://localhost:8080/docs
</Location>

Le problème dans cette configuration, c’est que les redirections sont mal traitées. Par exemple, avec une requête de type http://myserver/docs, la requête est transmise à Tomcat qui essaie de rediriger en ajoutant un "/" en fin d’URL, soit http://localhost:8080/docs. Lorsque le navigateur essaie de rediriger la requête vers cette adresse, il n’obtient évidemment pas de réponse, donc erreur 404. Pour traiter convenablement les demandes de redirection, il faut ajouter la directive ProxyPassReverse.

<Location /docs>
       ProxyPass http://localhost:8080/docs
       ProxyPassReverse http://localhost:8080/docs
</Location>

De plus, si on considère que l’application docs doit être l’application par défaut, il faut lui renvoyer les requêtes qui arrivent sur le contexte racine.

Redirect permanent / http://myserver/docs/