Tomcat : Mise en place d'un serveur Tomcat
Contents
Software version | 5.5/6/7 |
---|---|
Operating System | Debian 6 |
Website | Tomcat Website |
Last Update | 17/06/2013 |
Others |
1 Introduction
Apache Tomcat est un conteneur de servlet J2EE. Issu du projet Jakarta, Tomcat est désormais un projet principal de la fondation Apache. Tomcat implémente les spécifications des servlets et des JSP de Sun Microsystems. Il inclut des outils pour la configuration et la gestion, mais peut également être configuré en éditant des fichiers de configuration XML. Comme Tomcat inclut un serveur HTTP interne, il est aussi considéré comme un serveur HTTP. Tomcat est également considéré comme un serveur d'applications.
2 Installation
Comme d'h'abitude, sous Debian, c'est over simple :
aptitude |
aptitude install tomcat5.5 |
Si vous avez un message du genre :
Des erreurs ont été rencontrées pendant l'exécution : tomcat5.5 E: Sub-process /usr/bin/dpkg returned an error code (1) Échec de l'installation d'un paquet. Tentative de réparation : Paramétrage de tomcat5.5 (5.5.20-2) ... Starting Tomcat servlet engine: tomcat5.5invoke-rc.d: initscript tomcat5.5, action "start" failed. dpkg : erreur de traitement de tomcat5.5 (--configure) : le sous-processus post-installation script a retourné une erreur de sortie d'état 1 Des erreurs ont été rencontrées pendant l'exécution : tomcat5.5 Appuyez sur Entrée pour continuer.
Alors il va falloir analyser les logs :
Là, je pense que c'est suffisament clair. Nous allons éditer le fichier /etc/default/tomcat5.5 pour remplacer :
/etc/default/tomcat5.5 |
TOMCAT5_SECURITY=yes |
par
/etc/default/tomcat5.5 |
TOMCAT5_SECURITY=no |
Mais ceci comporte évidemment quelques risques (ne me demandez pas lesquels, j'avoue que je n'en sais rien et n'ai pas eu le temps de me pencher sur le problème). Il ne reste plus qu'à relancer l'install :
aptitude |
apt-get install tomcat5.5 |
Et pour ceux qui souhaitent installer les outils d'admin :
aptitude |
apt-get install tomcat5.5-admin |
3 Configuration
Tomcat est assez complexe dans sa configuration. C'est pourquoi de bonnes explications ne sont pas toujours de trop[1].
3.1 Modifier les variables d'environnement de Tomcat
Vous avez peut être besoin de toucher au Xmx ou Xms de Tomcat, éditez le fichier /etc/default/tomcat5.5 :
Par soucis de sécurité, décommentez comme plus haut la ligne TOMCAT5_USER.
3.2 Rediriger les logs
Pour rediriger les logs de Tomcat, je vous invite à suivre cette documentation.
3.3 Donner accès aux interfaces d'administration
Pour avoir accès à l'interface de manager et d'admin, il va falloir éditer le fichier de configuration des utilisateurs :
Adaptez en fonction des logins et mot de passe que vous souhaitez.
Vous pouvez ensuite accéder via les liens suivants (en adaptant selon vos besoins) :
- manager : http://localhost:8180/manager/html
- admin : http://localhost:8180/admin
3.4 Changer la version de java
Pour changer la version de java par défaut (la 6 ici) :
update-java-alternatives |
update-java-alternatives -s java-6-sun |
Vérifiez à bien avoir cette ligne dans le fichier de default tomcat :
/etc/default/tomcat5.5 |
... JAVA_HOME=/usr/lib/jvm/java-6-sun ... |
3.5 mod_jk
Il est parfois intéressant de pouvoir rediriger un Apache vers un Tomcat afin de simplifier l'URL pour l'utilisateur finale et permettre au Tomcat de ne pas gérer les connexions. Il est également possible d'utiliser mod_proxy (qui est d'ailleurs de plus en plus utilisé au détriment de mod_jk).
Installez Apache et mod_jk :
aptitude |
aptitude install apache2 libapache2-mod-jk |
Editez ensuite le fichier workers.properties :
Ici j'ai donc ajouter ajp13 avec les informations du connecteur. Nous allons maintenant dé-commenter celui ci dans la configuration de Tomcat :
/etc/tomcat6/server.xml |
[...] <!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> [...] |
Vous pouvez redémarrer Tomcat pour que cette configuration soit prise en compte. Maintenant, nous allons nous attaquer à Apache :
a2enmod mod_jk touch /etc/apache2/mods-available/jk.conf cd /etc/apache2/mods-enabled/ ln -s /etc/apache2/mods-available/jk.conf . |
Puis nous allons éditez ce fichier de configuration pour lui indiquer le fichier workers.properties :
<ifmodule mod_jk.c> JkWorkersFile /etc/libapache2-mod-jk/workers.properties JkShmFile /var/log/apache2/mod_jk.shm JkLogFile /var/log/apache2/mod_jk.log JkLogLevel info </ifmodule> |
Et pour finir nous allons modifier le VirtualHost pour lui indiquer que nous voulons utiliser mod_jk :
Maintenant vous pouvez accéder à :
- Votre documentation Tomcat via Apache http://server/docs/
- Au status : http://server/jk-status/
- Au manager : http://server/jk-manager/
Vous avez également accès au status en lecture seule et au manager. J'ai laissé des lignes commentées au cas ou vous ne souhaiteriez pas utiliser les Locations d'Apache.
4 Configuration avancée
4.1 Load Balancing
Il est indispensable de bien maitriser le mod_jk avant de continuer. Le load balancing permet de faire de la distribution de charge en Round Robin sur plusieurs serveurs Tomcat.
Pour faire ceci, il vous faut donc 2 serveurs Tomcat. Sur chacun d'entre eux, éditez le fichier server.xml et ajoutez la directive jvmRoute :
/etc/tomcat6/server.xml |
<Engine name="Catalina" defaultHost="localhost" jvmRoute="worker1"> |
J'ai donc mis worker1 sur mon serveur 1 et worker2 sur mon serveur 2. Ensuite éditez ce fichier pour configurer les workers et le load balancer :
Il ne nous reste plus qu'à configurer Apache pour lui dire d'aller taper sur le bon Worker qui est en fait le load balancer :
/etc/apache2/sites-enabled/000-default |
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www JkMountCopy On JkMount /demo/* loadbalancer |
Redémarrez Apache et Tomcat.
Téléchargez ce fichier, décompressez le et ajoutez le à vos 2 instances Tomcat. Maintenant la page de démo est accessible en mode load balancé sur http://server-apache/demo/jsp/test.jsp. Vous obtiendrez quelque chose comme ceci :
date du jour: Tue Nov 06 13:46:19 CET 2012 param message: null session ID: C706F51B9ACAB96A10CCDACCADEA9026 node: /var/lib/tomcat6 objet List en session:
Essayez de couper un Tomcat, vous verrez qu'il basculera sur l'autre :-).
Nous allons utiliser l'interface du manager pour voir l'état de vos serveurs : http://server-apache/jk-manager/ :
Vous voyez ici que les tomcat sont activés et fonctionnels. Dans le cas ou l'un d'eux viendrait à tomber, il sera en erreur 'ERR'. Il faudra alors cliquer sur l'hyperlink 'R' pour reseter son état. Le load balancer acceptera de nouveau d'envoyer des requêtes dessus. Vous avez également un autre menu qui vous permet de sortir proprement un noeud Tomcat en cliquant sur 'Edit this attribute for all members: Activation' :
Mettez à jour ensuite les états en cliquant sur le bouton 'Update balancer'.
4.2 Clustering
Pour faire du clustering[2], vous allez normalement avoir besoin du Load Balancing. Avec le clustering, vous allez pouvoir partager les sessions de vos applicatifs à travers Tomcat. L'avantage est que si vous perdez une machines, les sessions seront présentes sur les autres machines et l'utilisateur n'aura rien vu. Il faut bien entendu que les applications en questions soient développées pour gérer ce genre de mécanismes.
Pour pouvoir tester la réplications de sessions, ajoutez cette petite application qui vous permettra de tester les sessions, téléchargez ce fichier.
Pour mettre en place du cluster, éditez le fichier suivant et rajoutez cette ligne juste avant la fin :
/etc/tomcat6/web.xml |
[...] <distributable /></web-app> |
Ensuite nous allons éditer la partie serveur et rajouter un bloc cluster dans la partie Engine :
Au niveau du nom de l'engine, mettez des noms différents suivant les nœuds du cluster. Je ne détaillerais pas ici toutes les options mais vous laisse regarder les ressources de cette page ou bien le site officiel. Sachez juste que cette configuration permet de mettre plusieurs nœuds et réplique les sessions sur tous les noeuds (DeltaManager). Il est possible de faire simple un simple backup en changeant la className du manager.
Redémarrez ensuite vos serveurs Tomcat, ils se synchroniseront entre eux via multicast. Pour tester, utilisez votre load balancer pour ouvrir cette URL : http://tomcat-lb/clustertest/jsp/myjsp.jsp. Et ensuite ? Et bien c'est simple, vous allez voir quelque chose comme ceci :
date du jour: Sat Nov 17 21:33:58 CET 2012 param message: null session ID: E7FFB32D3EDEF512C118ACDCC7FB4255.worker2 node: /var/www/tomcat7 objet List en session:
Faites un SIGKILL (kill -9) sur l'instance worker2. Le load balancer fera son taf de basculer toutes les connexions sur un autre worker et le numéro de session (session ID) sera identique. Il n'aura pas changé même en ayant basculé de serveur :-).
4.3 Créer un context
Quel est l'utilité de créer un contexte ? Et bien par exemple, pour se connecter à une base MySQL via le connecteur JDBC. Pour faire un contexte sur une base de donnée :
5 Monitoring
Nous allons voir 2 solution pour monitorer votre Tomcat. Une via l'URL et une autre par ouverture d'un port.
5.1 JMXproxy
Pour cette solution, il suffit de donner le droit à un utilisateur de requêter via les URL en JMX :
[...] <role rolename="manager-jmx"/> <user username="tomcat" password="tomcat" roles="tomcat,admin,manager,manager-jmx"/> [...] |
Maintenant, l'utilisateur tomcat peut requêter comme ceci : http://tomcat:18080/manager/jmxproxy/?qry=*:*
Ce qui va me donner une tonne de lignes :
OK - Number of results: 170 Name: Catalina:j2eeType=Servlet,name=HelloWorldExample,WebModule=//localhost/demo,J2EEApplication=none,J2EEServer=none modelerType: org.apache.catalina.mbeans.ContainerMBean minTime: 9223372036854775807 countAllocated: 0 eventProvider: false statisticsProvider: false objectName: Catalina:j2eeType=Servlet,name=HelloWorldExample,WebModule=//localhost/demo,J2EEApplication=none,J2EEServer=none processingTime: 0 errorCount: 0 maxTime: 0 available: 0 asyncSupported: false backgroundProcessorDelay: -1 loadOnStartup: -1 maxInstances: 20 stateName: STARTED [...]
Vous pouvez affiner la requête au niveau de l'URL pour éviter d'avoir des pages et des pages d'informations.
5.2 JMX
Pour cette solution, nous allons dire à Tomcat d'écouter sur un port en particulier pour pouvoir le requêter par JMX :
Si vous avez un firewall entre vos équipements, il faudra peut être que vous avez a ajouter cette configuration :
/etc/tomcat6/server.xml |
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> |
Nous mettons un fichier avec la liste des utilisateurs et leurs mots de passe :
/etc/tomcat6/jmxremote.password |
[user] [password] |
Et un autre pour les autorisation :
/etc/tomcat6/jmxremote.access |
[user] readwrite [user] readonly |
Et enfin nous mettons les bons droits :
chmod 600 /etc/tomcat6/jmxremote.access chmod 600 /etc/tomcat6/jmxremote.password chown tomcat6:tomcat6 /etc/tomcat6/jmxremote.access chown tomcat6:tomcat6 /etc/tomcat6/jmxremote.password |
Redémarrez ensuite Tomcat pour que les changements prennent effets. Vous pouvez maintenant vous connecter via VisualVM par exemple pour monitorer ou profiler votre Tomcat.
6 FAQ
6.1 Problème de stop sur un vserver
Tomcat peut poser des problèmes sur un stop dans un vserver. Etant donné que je n'ai pas trouvé la solution, je met le service en dernier au boot et à l'arrêt pour éviter qu'il bloque la fermeture des autres services :
update-rc.d |
update-rc.d -f tomcat5.5 remove update-rc.d tomcat5.5 defaults 99 |