Tomcat est assez rapide pour servir le trafic directement, mais placer Apache HTTP Server devant lui ajoute trois patrons difficiles à faire avec Tomcat seul — la réécriture d’URL à travers plusieurs backends, le délestage de contenu statique, et la distribution de charge HTTP entre plusieurs nœuds Tomcat.
Cette page parcourt les trois patrons avec mod_proxy et mod_rewrite. La topologie suppose un ou plusieurs environnements Tomcat exécutant vos applications Java, et un environnement Apache jouant le rôle de frontal.
Les noms d’hôtes des exemples (env-tomcat.example.com, env-apache.example.com) sont des espaces réservés — remplacez par les noms d’hôtes que la plateforme a assignés à vos environnements.
Patron 1 — Réécriture d’URL
Supposons deux applications Java hébergées sur deux environnements Tomcat séparés :
https://env-tomcat.example.com/app1/https://second-tomcat.example.com/app2/
Vous voulez qu’elles apparaissent comme deux chemins sur un seul nom d’hôte :
http://env-apache.example.com/application1/http://env-apache.example.com/application2/
Sur l’environnement Apache, cliquez Config à côté du nœud Apache, ouvrez /etc/httpd/conf/httpd.conf et ajoutez :
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/webroot/ROOT
ServerName env-apache.example.com
RewriteEngine On
RewriteRule ^/application1/(.*) http://env-tomcat.example.com/app1/$1 [P]
ProxyPassReverse /application1/ http://env-tomcat.example.com/app1/
RewriteRule ^/application2/(.*) http://second-tomcat.example.com/app2/$1 [P]
ProxyPassReverse /application2/ http://second-tomcat.example.com/app2/
ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>
RewriteRule … [P] proxifie la requête vers le backend ; ProxyPassReverse réécrit les en-têtes de réponse Location, Content-Location et URI pour que les redirections côté client restent sur le domaine frontal.
Sauvegardez et cliquez Restart Nodes sur le nœud Apache.
Patron 2 — Délestage de contenu statique
Laissez Tomcat servir l’application et Apache servir tout le reste. Sur le nœud Apache, placez vos actifs statiques sous /var/www/webroot/ROOT/static/ et ajoutez un VirtualHost :
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/webroot/ROOT
ServerName env-apache.example.com
ProxyPass /static !
ProxyPass / http://env-tomcat.example.com/app1/
ProxyPassReverse / http://env-tomcat.example.com/app1/
ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>
ProxyPass /static ! indique à Apache de ne pas proxifier les requêtes commençant par /static — elles sont servies depuis la racine documentaire locale. Tout le reste est proxifié vers Tomcat. Sauvegardez et redémarrez le nœud Apache.
Patron 3 — Distribution de charge entre plusieurs backends Tomcat
Provisionnez deux environnements Tomcat ou plus exécutant la même application sous le même contexte. Sur le nœud Apache, créez /etc/httpd/conf.d/server_list avec :
servers env1.example.com|env2.example.com
Puis dans /etc/httpd/conf/httpd.conf :
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/webroot/ROOT
ServerName env-apache.example.com
RewriteEngine On
RewriteMap lb "rnd:/etc/httpd/conf.d/server_list"
RewriteRule ^/(.*) http://${lb:servers}/app1/$1 [P,L]
ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>
RewriteMap … rnd: choisit pseudo-aléatoirement un backend par requête. Pour des sessions persistantes, une affinité par en-tête ou des sondes de santé, le répartiteur NGINX ou HAProxy de la plateforme est mieux adapté que mod_rewrite d’Apache.
Sauvegardez et redémarrez le nœud Apache.
Voir aussi
- Serveur applicatif Tomcat
- Répartiteur NGINX et options HAProxy de la plateforme
- Gestion des modules Apache