Aller au contenu

Apache en frontal de Tomcat

Placer Apache HTTP Server devant un palier Tomcat sur le Stack Harbor PaaS pour la réécriture d'URL, le délestage de contenu statique ou la distribution de charge entre backends Tomcat.

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