Contexte


Avec une installation standard de tomcat, nous déployons les applications dans un même et unique répertoire webapp. Bien qu'assez pratique, cette solution n'est pas sans inconvénients :

  • On ne peut pas gérer l'arrêt d'une application sans engendrer l'arrêt des autres services.
  • La mémoire allouée au tomcat est fonction des applications déployées. Pour le dire autrement, cela oblige à allouer d'un bloc plus de mémoire au tomcat. Si la mémoire arrive à saturation, nous constatons un arrêt de service sur toutes les applications déployées. D'autre part il est conseillé d'éviter d'allouer un montant trop important au niveau de la mémoire, car cela peut engendrer des "freeze" des applications lorsque le garbage collector s'active.

Un début de solution serait de se dire qu'il faut installer autant de tomcat que nous avons d'applications à déployées. Ainsi nous serions capables de tailler la JVM par applicatif sans que cela engendre des risques sur les autres applicatifs. L'inconvénient principal de cette architecture est de ne pas pouvoir faire évoluer facilement la version des binaires tomcat. Si on a dix applis installées il faudrait alors réinstaller 10 fois la nouvelle version de tomcat. La solution élégante est décrite dans la suite de ce billet avec une installation tomcat multi-instances :

Avantages du tomcat multi instances


La solution proposée par ce post est d'installer une seul binaire de tomcat puis de créer pour chaque applicatif une configuration distincte. Ce type de solution nous offre les avantages suivants :

  • 1 seul bianire tomcat (facilitant le travail de maintenance et de mise à jour de version)
  • Chaque application aurait sa propre JVM et sa propre configuration (taille JVM, ports etc ...)
  • Possibilité d'arrêter indépendamment chaque application.
  • Un crash mémoire sur une des applications n'entrainera pas de dysfonctionnement sur les autres applications.


Recette de cuisine pour configurer un tomcat multi-instances


  1. Téléchargez votre version de tomcat et installez là sur le disque (ex : /srv/java/tomcat/mon_binaire_tomcat )
  2. Mettre à jour une variable système pour y configurer l'endroit ou se trouve le binaire tomcat (ex : CATALINA_HOME= /srv/java/tomcat/mon_binaire_tomcat )
  3. Mettre à jour une deuxième variable système qui servira à définir l'endroit ou sont configurées les instances tomcat (ex : PRGDIR=~/tomcat)
  4. Recharger votre configuration d'environnement (source /.bashrc sous linux). En gros la commande "env" doit afficher les nouvelles variables. Téléchargez le template en pièce jointe et le décompresser dans $PRGDIR

Nous venons de désarchiver le fichier joint qui contient les instances. Ce fichier contient :

  • 1 fichier run.sh, à éditer/modifier pour les plus curieux. C'est ce script qui lancera et arrêtera les instances de tomcat.
  • 1 répertoire shared qui contient la configuration partagé et dans conf le fichier server.xml (modifié pour injecter les numéros de ports en fonction des instances)
  • 3 répertoires d'instances dans lesquels on placera dans chacun une applications (on peut ajouter ou supprimer autant d'instances que l'on souhaite ou encore les renommer). Dans ces répertoires, le fichier ./instance_monAppli{XX}/conf/catalina.properties permet de configurer les ports tomcat alloués à cette instance et seront injectés dans le fichier ./shared/conf/server.xml. Il y a de plus pour les options JVM, un second fichier ./instance_monAppli{XX}/bin/setenv.sh modifiable en fonction des besoins (Xms, Xmx et autres options de jvm)


Déploiement d'une application


  1. Editez le fichier ./instance_{nom_de_mon_instance}/conf/catalina.properties et configurez les ports attribués à tomcat
  2. Editez le fichier ./instance_{nom_de_mon_instance}/bin/setenv.sh et modifiez vos paramètres JVM
  3. Placez votre application dans le répertoire : ./instance_{nom_de_mon_instance}/webapps
  4. lancez l'instance tomcat via la commande : ./run.sh start nom_de_mon_instance
  5. Vérifier le démarrage de l'instance via le catalina.out (dans ./instance_{nom_de_mon_instance}/logs/catalina.out) + logs applicatifs
  6. Pour la forme vérifier le lancement du tomcat et les paramètres associés avec un "ps -ef | grep nom_de_mon_instance". On notera que nos settings sont bien pris en compte via le retour de la commande ps => -Dcatalina.base=/srv/java/tomcatMultiInstances/instance_monAppli1 -Dcatalina.home=/srv/java/apache-tomcat-6.0.20
  7. Pour arrêter l'instance, il suffit de taper la commande ./run.sh stop {nom_de_mon_instance}