Apache/ReverseProxy

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

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

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/

Configuration en load balancer