Wednesday, April 25, 2007

Java sur Dedibox 5: Installer Tomcat 5.5

Préambule

Apache Tomcat est un conteneur de Servlets (serveur pouvant exécuter les JSP / Servlets) libre développé par la Fondation Apache. Il est largement utilisé pour héberger des sites web de qualité commerciale, et fait partie de l'implémentation de référence des technologies JSP / Servlets. C'est un produit gratuit, fiable et rapide à mettre en place.

Tomcat est quand même limité en termes de performance, scalabilité et services (gestion de transactions, persistance, etc) et donc n'est pas un alternatif à un serveur d'application, tel que JBoss, WebSphere, ou GlassFish. Pour ceux qui s'intéresse néanmoins de passer sous un serveur d'application sous Ubuntu, je conseille un bref détour sur le site de Glassfish, qui fera partie de la prochaine version d' Ubuntu (Feisty).

Dans ce poste, je décrirai l'installation, contrôle et configuration initiale du serveur Tomcat 5.5sous Ubuntu 6.10 (Edgy) Serveur. Il existe bien une version plus récente de Tomcat (6.0), mais Tomcat 5.5 est la plus récente disponible sous forme de paquet pour Ubuntu, ce qui rend son installation et configuration presque automatique. Il existe toute de fois des erreurs dans l'instalation de base, que je décrirai éavec leurs solutions.

A la fin de ce poste je fournie également plusieurs liens vers des sources de documentation et d'aide en ligne fiables.

Installation

Note importante: L'installation de Tomcat 5.5 exige l'installation préalable de J2SE5.0 JDK (ou plus récent).

Tomcat 5.5 est disponible pour Ubuntu 6.10 (Edgy) sous forme d'un paquet nommé tomcat5.5 dans la catégorie universe du répositoire principal.

Avant de lancer l'installation de Tomcat, je doit absolument affecter et exporter le chemin du répertoire contenant le JDK à utiliser, par exemple:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

Pour trouver le répertoire des JDK's installé, j'utilise la commande update-java-alternatives -l. Il suffit ensuite de choisir un JDK version 5.0 ou plus récent. Je n'utilise surtout pas un JRE, qui ne fournit pas les outils de développement dont Tomcat a besoin.

Une fois la valeur de JAVA_HOME affecté, je lance l'installation par moyen d' apt-get:

$ sudo apt-get install tomcat5.5

apt-get télécharge le paquet tomcat5.5 ainsi que les paquets dont il dépende (y compris tomcat5.5-admin et tomcat5.5-webapps), les installe et les configure, le tout sans intervention. Si apt-get ne trouve pas le paquet tomcat5.5, il faut vérifier que la catégorie universe est autorisé dans la liste des sources de apt-get (cette liste est configurée dans le fichier /etc/apt/sources.list) et que la liste de paquets locale est à jour (apt-get update).

Les résultats de cette install sur mon Dédibox:

  • Le serveur Tomcat (binaire, configuration, etc) est installé dans /usr/share/tomcat5.5
    Le répertoire du serveur est connu symboliquement comme ${CATALINA_HOME}
  • La configuration d'une instance Tomcat (serveur en exécution) est installée dans /var/lib/tomcat5.5
    Le répertoire d'une instance Tomcat est connu symboliquement comme ${CATALINA_BASE}
  • Les valeurs par défaut de l'instance sont enregistrés dans le fichier /etc/default/tomcat5.5
  • L'installation crée un utilisateur tomcat5 qui sera utiliser pour démarrer l'instance de façon sécurisé (c-à-d pas en tant que root)
  • L'instance est démarrée comme un daemon sur le port 8180 (pas le 8080 comme dans les précédents versions de Tomcat)
  • L'installation configure le démarrage / arrêt de l'instance avec la machine.
  • Plusieurs webapps comprenant Admin, Manager et les exemples sont déployés sur l'instance.

Pour vérifier que mon installation a réussi, je pointe mon navigateur vers l'adresse IP de mon serveur, sur le port 8180. Si l'installation de Tomcat a réussie, je verrai la page d'accueil du serveur, comme dans le Figure 1. Vous pouvez également lancer des Servlets de test en suivant le lien Servlet Examples. Les exemples JSP risquent de ne pas fonctionner dû à un bug que j'adresserai immédiatement ci-dessous. Si cette page ne s'affiche pas (ce qui est improbable), consulter les logfiles dans ${CATALINA_BASE}/logs qui contiendront les messages des erreurs encontrées.

Figure 1: Page d'accueil de Tomcat, suite à une installation réussie

Bugs d'installation

L'installation automatique de Tomcat 5.5 sous Ubuntu est presque parfait. Il reste néanmoins deux petits hic's qu'il faut gérer manuellement.

  • L'instance Tomcat ne démarre pas au reboot

Quand j'ai rebooté mon système pour la première fois, je m'attendais que mon Tomcat soit redémarré automatiquement. Or ce n'était pas le cas. Le problème est lié à la variable JAVA_HOME dont Tomcat a besoin, mais qui n'est pas encore affecté au moment de démarrage des daemons par init. Il faut donc affecter une valeur à cette variable dans le fichier /etc/default/tomcat5.5. J'utilise le même valeur que lors de l'installation de Tomcat. En rebootant la machine, tout fonctionne parfaitement.

Je peux vérifier si Tomcat est bien démarré avec le script suivant (décrite en plus de détail ci-dessous):

$ sudo /etc/init.d/tomcat5.5 status
Tomcat 5 servlet engine is running with Java pid 2172

Si vous ne voulez pas que Tomcat démarre automatiquement au reboot, utilisez l'un des outils update-rc.d (déjà installé, voir sa page man) ou gcconf. Le dernier est plus facile à utiliser, mais moins puissant, et vous devez d'abord l'installer avec apt-get.

  • Les JSP ne compilent pas

La première fois que j'ai essayé d'ouvrir un JSP sur mon serveur, j'ai reçu un ClassNotFoundException. Vous pouvez vérifier si le même problème vous guette en ouvrant l'un des exemples JSP fournie avec Tomcat. Dans votre navigateur, suivez le lien JSP Examples à partir de la page d'accueil de votre installation de Tomcat.

Ceci est dû à un bug dans la distribution Tomcat 5.x pour Ubuntu. Certaines classes de la distribution ont été déplacées sans que l'un des fichiers de configuration soit mis à jour. Sa réparation est facile: Ouvrir le fichier suivant en tant que root ...

${CATALINA_BASE}/webapps/jsp-examples/WEB-INF/tagPlugins.xml

... et remplacer son contenu par le texte ci-dessous:

<tag-plugins>
  
 <tag-plugin>
    <tag-class>org.apache.taglibs.standard.tag.rt.core.IfTag</tag-class>
    <plugin-class>org.apache.jasper.tagplugins.jstl.core.If</plugin-class>
  </tag-plugin>
  <tag-plugin>

   <tag-class>org.apache.taglibs.standard.tag.common.core.ChooseTag</tag-class>
    <plugin-class>org.apache.jasper.tagplugins.jstl.core.Choose</plugin-class>
  </tag-plugin>
  <tag-plugin>
    <tag-class>org.apache.taglibs.standard.tag.rt.core.WhenTag</tag-class>

    <plugin-class>org.apache.jasper.tagplugins.jstl.core.When</plugin-class>
  </tag-plugin>
  <tag-plugin>
    <tag-class>org.apache.taglibs.standard.tag.common.core.OtherwiseTag</tag-class>
    <plugin-class>org.apache.jasper.tagplugins.jstl.core.Otherwise</plugin-class>

  </tag-plugin>
  <tag-plugin>
    <tag-class>org.apache.taglibs.standard.tag.rt.core.ForEachTag</tag-class>
    <plugin-class>org.apache.jasper.tagplugins.jstl.core.ForEach</plugin-class>
  </tag-plugin>

</tag-plugins>

La modification remplace le chemin du paquetage org.apache.jasper.tagplugins.jstl avec son nouveau chemin org.apache.jasper.tagplugins.jstl.core.

[ Source: http://forum.java.sun.com/thread.jspa?threadID=693082&messageID=9551651 ]

Demarrage / arrêt manuel et automatique de l'instance

L'installation fait tourner l'instance Tomcat sous forme de daemon, donc une fois démarré il ne s'arrête pas jusqu'au reboot de la machine. Ci-dessus nous avons vus que, hors un petit bug, cette fonctionnalité est activée automatiquement.

Je peux contrôler manuellement le daemon par l'intermédiaire du script /etc/int.d/tomcat5.5. Les actions possibles sont les suivants:

  • $ sudo /etc/init.d/tomcat5.5 start démarre le serveur si ce n'est pas déjà le cas;
  • $ sudo /etc/init.d/tomcat5.5 stop arrête le serveur s'il est est démarré;
  • $ sudo /etc/init.d/tomcat5.5 restart arrête et redémarre le serveur s'il est démarré
  • $ sudo /etc/init.d/tomcat5.5 status affiche l'état du serveur

Je peux aussi modifier les paramètres de démarrage / arrêt de l'instance avec la machine par l'intermédiaire de l'un des outils update-rc.d (déjà installé, voir sa page man) ou gcconf. Le premier est plus puissant et flexible; le dernier plus facile à utiliser. gcconf nécessite également une installation prélable avec apt-get.

S'il y a un problème avec le démarrage de l'instance (ce qui est improbable!), je trouve le plus souvent la cause (et ainsi la solution) en consultant les logfiles de l'instance qui se trouvent par défaut dans le répertoire ${CATALINA_BASE}/logs.

Configuration initiale du serveur

Les fichiers de configuration d'une instance Tomcat se trouvent dans le répertoire ${CATALINA_BASE}/conf. Les fichiers principaux sont server.xml et tomcat-users.xml, et je pourrai également y créer un fichier supplémentaire context.xml pour l'instance (voir la doc Tomact pour plus d'informations). Dans la suivante je ne présente pas la configuration en détail, juste comment choisir le port sur lequel écoute Tomcat, et comment créer des utilisateurs afin de pouvoir accéder aux webapps d'administration Manager et Admin.

  • Choisir le numéro de port

Je change le numéro de port sur lequel écoute une instance Tomcat en modifiant le fichier server.xml. J'identifie les lignes suivantes ...

<Service name="Catalina">
   ...
   <Connector
      port="8180"
      redirectPort="8443"
      minSpareThreads="25"
      ...

... et je remplace la valeur de la propriété port par le numéro du port que je préfère.

Noter que je ne peux pas (pour l'instant) choisir le port HTTP 80, ni un autre port de 1-1024. Cela est dû au fait que l'installation par défaut de Tomcat 5.5 sous Ubuntu est sécurisé, c-à-d que l'instance est lancée par le compte utilisateur non-priviligié tomcat5, et uniquement le root peut acquérir les ports de 1-1024. Je décrirai comment lancer une instance Tomcat sur un port réservé, de façon sécurisée, dans un poste ultérieur.

Pour que les changements effectuées à server.xml prennent effet, je dois redémarrer le serveur:

$ sudo /etc/init.d/tomcat5.5 restart

  • Activation des webapps Admin et Manager

Tomcat est livré avec deux webapps de gestion, Admin et Manager. Le premier permet de gérer le serveur (serveurs virtuels, sources de données, etc); le deuxième de déployer et contrôler les webapps. Les deux webapps sont accéssible à partir de la page de bienvenue du serveur, mais pour des raisons de sécurité sont innaccessibles par défaut.

Pour pouvoir accéder à ces webapps, il faut créer un ou plusieurs utilisateur(s) autorisé(s) dans le fichier tomcat-users.xml. Ce fichier définit des rôles et des utilisateurs, et les rôles que chaque utilisateur joue. Pour pouvoir accéder à la webapp Manager, un utilisateur doit jouer le rôle manager; pour accéder à la webapp Admin il doit jouer le rôle admin. Le fichier ci-dessous donne l'exemple; Il définit les deux rôles et un utilisateur qui joue les deux.

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
    <role rolename="manager"/>
    <role rolename="admin"/>
    <user username="myuser" password="mysecretpassword" roles="manager,admin"/>
</tomcat-users>

Il n'y a pas besoin de redémarrer l'instance Tomcat pour que les nouveaux utilisateurs soient pris en compte.

Quelque mots sur le lancement de plusieurs instances Tomcat ...

Les concepteurs de Tomcat ont prévu la possibilité de lancer plusieurs serveurs Tomcat sur une même machine, à partir d'un seul et même binaire. Ils font donc distinction entre

  • un serveur Tomcat - le binaire sur le disque; et
  • une instance Tomcat - une copie du binaire dans le mémoire vive qui héberge une collection de webapps sur un port local.

Cette distinction donne la possibilité d'éliminer toute dépendance entre les webapps d'instances différentes. Ce qu'il faut savoir c'est que si une webapp fait planter son instance Tomcat, toutes les autres webapps de la même 'instance deviendront également indisponible. Par contre, les webapps se trouvant dans d'autres instances ne seront pas affectées, d'où l'intérêt de leur indépendance.

Configurer et lancer plusieurs instances Tomcat n'est pas difficile. L'installation de base donne l'exemple:

  • ${CATALINA_HOME} contient tous les fichiers du serveur. Ceux-là comprennent les binaires et scripts, les ressources partagés par tous les instances, et les webapps Manager et Admin.
  • ${CATALINA_BASE} contient tous les fichiers d'une instance. Ceux-là comprends les fichiers de configuration de l'instance, le répertoire de logfiles, les ressources partagés par tous les webapps de l'instance, et les webapps elles-mêmes.

Créer une nouvelle instance consiste à:

  1. réproduire la structure de ${CATALINA_BASE} dans un autre répertoire,
  2. y copier les webapps à servir avec cette instance,
  3. à adapter le fichier de configuration server.xml aux besoins de l'instance, surtout les ports utilisés par l'instance (HTTP et AJP), qui doivent être mutuellement exclusive entre toutes les instances configurées.

Ensuite pour lancer l'instance, le plus simple est de copier et modifier le script de daemon de l'instance par défaut - /etc/init.d/tomcat5.5 - en mettant à jour les variables de configuration, surtout la valeur de CATALINA_BASE, qui doit naturellement pointer vers le répertoire cotenant les fichiers de l'instance.

La limitation de cette méthode est le fait que les instances doivent utiliser des ports différentes. Impossible donc, de faire écouter plusieurs instances sur le même port (je pense notamment au port 80). Pour atteindre une telle fonctionnement, il faudra installer Apache sur le port 80, les instances Tomcat sur n'importe quel autre port, et ensuite créer un connector entre Apache et chacune des instances. Il existe plusieurs tutoriels sur ce sujet sur le web; je m'y addresserai dans un poste futur.

Documentation et aide Tomcat en ligne

No comments: