Académique Documents
Professionnel Documents
Culture Documents
Apache Tomcat
Tomcat
Serveur d'applications
Web
Tout en un
Serveur Web
Conteneur de Servlets (Servlet container ou Servlet engine)
Services Web
Par l'intermédiaire de cadriciels (CXF, AXIS)
Serveur EJB3 avec le projet Lightweight conteneur
Projet de la fondation Apache
Apache Software Foundation (ASF)
Historique de Apache
Versions 3.x
1999
RI : Servlet 2.2 et JSP 1.1
Versions 4.x
2001
RI : Servlet 2.3 et JSP 1.2
Versions 6.x
2007
RI : Servlet 2.5 (JSR 154) et JSP 2.1 (JSR 245)
Licence
Apache License
La licence doit être inclue dans toute redistribution
Tout ajout de documentation doit être déclaré
Tout produit dérivé de Tomcat ne peut utiliser les
termes de Tomcat, Jakarta ou Apache
Tomcat n'a aucune garantie
Tomcat peut être utilisé dans des projets libres et
commerciaux
Les modifications ne nécessitent pas de libérer le
code source ou de rétrocession
Tomcat et serveurs Web
Vérification de la distribution
MD5
md5sum apache-tomcat-version.tar.gz
PGP
pgp -ka KEYS
pgp apache-version.zip
Tester le serveur
Exporter la variable CATALINA_HOME
Lancer : <TOMCAT_HOME>/bin/startup.sh ou bat
Installation simple
Modes de lancement
Manuel
Service
Vérification de l'installation
Navigateur
URL : http://localhost:8080
Accès à la page d'accueil de Tomcat
Processus de démarrage
bin/
startup.(sh|bat) shutdown.(sh|bat)
<start> <stop>
catalina.(sh|bat)
Structure après installation
Répertoire bin/
Ensemble de scripts
Démarrage et arrêt du serveur
Jamais utilisé au cours de l'exécution
Tous les autres répertoires sont configurables
Permet d'avoir plusieurs versions de Tomcat
Permet d'avoir plusieurs versions de JVM
Architecture générale
Répertoire conf/
Configuration et paramètres de Tomcat
Fichiers
catalina.policy, catalina.properties
logging.properties [ logs/ ]
context.xml
server.xml [ webapps/ – work/ ]
tomcat-users.xml
web.xml
Architecture générale
Répertoire lib/
Toutes les librairies nécessaires à Tomcat
Toutes les librairies partagées par les applications
Répertoire logs/
Journalisation des événements générés lors de
l'exécution de Tomcat
Répertoire temp/
Emplacement utilisé de façon temporaire
Architecture générale
Répertoire webapps/
Emplacement des applications
Archives WAR
Web Application ressource (WAR)
Tomcat déploie automatiquement toute archive WAR
copiée dans webapps/
Répertoire work/
Utilisé pour la compilation des pages JSP
Jasper regroupe les fonctionnalités de compilation
Utilise la brique logicielle Eclipse jdt
Variables d'environnement
catalina.(sh|bat)
<invocation> <invocation>
setclasspath.(sh|bat) setenv.(sh|bat)
Lancement JVM
Options d'environnement
Server
Service
Logger Realm
Engine Valve
Connector
Context
Wrapper
Wrapper Valve
Valve Realm
Architecture des composants
Server
Représente une instance du serveur d'application
Tomcat
Une seule instance par JVM
Séparation des instances
Permet la tolérance aux pannes
Interface Server
Classe d'implémentation StandardServer
Architecture des composants
Service
Un service regroupe un conteneur de type Engine
et un ensemble de connecteurs
Un service accepte les requêtes soumises par les
connecteurs et les route vers les Host
Un service possède un nom
Architecture des composants
Engine
Conteneur de plus haut niveau
Ne peut avoir de parent conteneur
Agrège des composants enfant
Représente le serveur de Servlets
Examine les entêtes HTTP pour déterminer le
serveur virtuel ou le contexte auquel adresser la
requête
Architecture des composants
Host
Enfant de Engine
Ressemble à la fonctionnalité Apache appelée
serveur virtuel (virtual host)
Plusieurs serveurs sur une même machine
Différenciés par leur adresse IP ou par leur nom
Avec Tomcat les multiples serveurs (host) sont
différenciés par leur nom
Ainsi www.exemple.com et www.exemple.net peuvent
résider sur une même instance de Tomcat
Architecture des composants
Context
Représente une seule application
Parent des Servlets et des Filters (StandardWrapper)
L'interface Context est implémentée par la classe
StandardContext
Configuration
Répertoire racine de l'application
Rechargement dynamique des classes modifiées de
l'application, pages d'erreur génériques
Paramètres d'initialisation, authentification
Architecture des composants
Connectors
Les connecteurs connectent les applications aux
clients
Ils représentent le point d'accès où les requêtes
des clients arrivent et où elles sont affectées à un
port sur le serveur
Le port HTTP par défaut est 8080
Le connecteur par défaut est Coyote qui implémente
HTTP 1.1
D'autres connecteurs sont disponibles
AJP (SSL), JServ, JK2
Architecture des composants
Realm
Gestion des authentifications et autorisations
Assisté par
Fichiers, annuaires LDAP, bases de données
Différentes portées
Engine, Host, Context
Chaque application peut écraser le comportement
général défini au niveau Engine ou Host
Architecture des composants
Valve
Composant qui permet à Tomcat d'intercepter une
requête et de la pré-traiter
Similaire au mécanisme de filtre des Filters mais à
un niveau plus élevé spécifique à Tomcat
Composants pouvant posséder des Valves
Engine, Host et Context
Fonctionnalités
Single Sign-on, journalisation, adresse IP des clients, pic
du trafic, bande passante, temps moyen d'une requête,
etc.
Architecture des composants
Loggers
Fournissent des rapports sur les composants
Niveaux Engine et Host
Avec un mécanisme d'héritage quand déclaré au niveau
Engine
Composant Connector
Serveur Web
Apache
APACHE
Module Connecteur
(mod_jk ou mod_proxy)
Connecteur
Tomcat
TOMCAT
Tomcat Servlet
conteneur
Cycle de vie des composants
<Listener className=''org.apache.catalina.core.AprLifecyleListener''
SSLEngine=''on'' />
<Service name=''Catalina''>
<Connector port=''8080'' protocol=''HTTP/1.1'' maxThreads=''150''
connectionTimeout=''20000'' redirectPort=''8443'' />
</Egine>
</Service>
</Server>
Exemple de Listener
if(Lifecycle.START_EVENT.equals(event.getType())) {
// démarrage du composant et action(s) dépendantes
}
if(Lifecycle.STOP_EVENT.equals(event.getType())) {
// arrêt du composant et action(s) dépendantes
}
}
}
Tomcat
Configuration
Les fichiers de configuration
Par défaut
Un unique service dans une unique instance de
serveur
Imbrication de définitions de composants
Server port=8085
Service name=''Catalina
Connector port=8080
Connector port=8009
Engine name=Catalina
Realm className=org.apache.catalina.realm...
Host name=localhost
Éléments de server.xml
$>sudo telnet -E
$>telnet>open -a localhost 8005
$>telnet>SHUTDOWN
<Service>
Représente un ensemble de connecteurs
<Listener>
Un écouteur du cycle de vie du serveur
Événements: start, stop, after start, after stop
<GlobalNamingResources>
Définition des ressources JNDI globales
Éléments de <Service>
Attributs
className
La classe Java utilisée
name
Le nom du service utilisé par
La journalisation, l'administration et la gestion
Le nom du service doit être différent de celui du serveur
Sous-éléments de <Service>
Connector
Composant extérieur qui gère les connexions des
clients et les route vers Engine
Un connecteur gère le nombre de threads allouées
à chaque traitement de requête
Engine
Le composant qui traite les requêtes
Élément <Engine>
Attributs
className
La classe Java pour Engine
backgroundProcessDelay
Délai en seconde avant le processus background
Exemle
Le test pour les changements dans les applications Web
Redéploiement à chaud
Élément <Engine>
Attributs
defaultHost
Permet de désigner un <Host> virtuel par défaut.
Utilisé seulement si le <Host> ne peut être trouvé
jvmRoute
Un identifiant pour l'équilibrage de charge
name
Le nom de <Engine>
Sous-élément de <Engine>
Host
Pour définir un host virtuel
Context
Représente une collection de propriétés
Leur portée est globale pour toutes les applications
Realm
Permet de définir un mode d'authentification basé
sur des utilisateurs et leurs rôles
Sous-élément de <Engine>
Valve
Filtre propre à Tomcat définit au niveau Engine
Listener
Pour associé un écouteur d'événements à Engine
Élément <Host>
Attributs
className
appBase
Définition du répertoire de déploiement des applications
autoDeploy
À la valeur true, les applications sont automatiquement
déployées
name
Le nom du <Host>
BackgroundProcessDelay
Élément <Host>
Attributs
deployOnStartup
Si valeur à true alors déploie les applications au
démarrage du <Host>
deployXML
Si valeur à false alors le contexte de chaque application
doit être placé sous
$CATALINA_HOME/conf/<engine>/<host>/<app>.xml
Sinon le fichier META-INF/context.xml de chaque
application est accepté
Élément <Host>
Attributs
errorReportValveClass
Déclare la classe Java qui implémente l'erreur
Par défaut org.apache.catalina.valves.ErrorReportValve
unpackWARs
Si la valeur est à false alors Tomcat ne défait pas
l'archive WAR pour exécuter l'application
workdir
Définition d'un répertoire de travail pour les JSP et
Servlets
Par défaut le répertoire work/
Sous-éléments de <Host>
Context
Permet de configurer un ensemble de propriétés
pour une application déployée dans le <Host>
DefaultContext
Configure un ensemble de propriétés pour une
application qui n'a pas son propre <Context> de
défini
Realm
Le fichier context.xml
Attributs
className
allowLinking
Permet le support des liens symboliques (Unix)
Par défaut à false
antiJARLocking
antiResourceLocking
backgroundProcessDelay
Élément <Context>
Attributs
cacheMaxSize
Permet de dimensionner la taille du cache en KB
Par défaut à 10240
cacheTTL
Temps de re-validation des objets dans le cache
Par déaut 5000 milli-secondes
Élément <Context>
Attributs
cachingAllowed
Détermine si les ressources statiques (images, pages)
peuvent être mises en cache
caseSensitive
cookies
Par défaut à true
crossContext
Par défaut à false. Positionner à true permet le partage
d'informations entre applications du même host virtuel
Élément <Context>
Attributs
docBase
Par défaut le nom de base de l'application est:
webapps/le nom de l'archive WAR
override
Permet d'indiquer si les arguments locaux écrasent les
arguments du contexte par défaut
path
Le chemin du contexte de base de l'application
Élément <Context>
Attributs
privileged
Par défaut à false, valeur true pour les applications de
type système (exemple: manager)
processTlds
Par défaut à true
reloadable
Par défaut à false. Détermine si Tomcat doit prendre en
compte les changements dans WEB-INF/classes et
WEB-INF/lib
Élément <Context>
Attributs
swallowOutput
Par défaut à false. Détermine si les sorties System.out et
System.err doivent être affichées dans les journaux
tldNamespaceAwaretldValidation
unloadDelay
Nombre de milli-secondes d'attente avant un unload
unpackWAR
Élément <Context>
Attributs
useNaming
Par défaut (true) crée et affecte un InitialContext à
l'application
workdir
wrapperClass
Déclare une classe Wrapper si nécessaire
Sous-éléments de <Context>
Loader
Configuration du class loader
Manager
Configure le gérant de session
Realm
Ressources
Le gérant de ressources
WatchedResource
Redéploiement si les ressources changent
Le fichier web.xml
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
Rôle du web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Servlet Invoker
<!--
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
-->
Servlet JspServlet
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
Invocation des Servlets
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
...
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Passage de paramètres
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
Collaboration server.xml,
context.xml et web.xml
Exemple
https://www.lecoz.com/cours/javaee/tomact6
https: Connecteur Coyote avec support SSL (server.xml)
Analysé par Service qui passe la requête à Engine
www.lecoz.com: nom de host virtuel (server.xml)
Analysé par Engine et par un de ses Host
cours: path de Context (context.xml)
javaee: servlet mapping avec URL pattern /javaee/*
Fichier web.xml de l'application
tomcat6: exécuté par la servlet
TOMCAT
Applications
Application Web JAVA EE
META-INF/ WEB-INF/
context.xml web.xml
classes/ lib/
Déploiement
...
<taskdef name=''deploy''
classname=''org.apache.catalina.ant.DeployTask''/>
...
Architecture d'une application
get | post
JSP JSP
SERVLET ACTION
HTML HTML
invocation forward
set get
FILTER
POJO SESSION
METIER
Que des SERVLETS
Sécurité
Sécurité d'une application
Section <auth-constraint>
Type de transmission des données entre client et
serveur
Sous-section <user-data-constraint>
Valeurs NONE, INTEGRAL, CONFIDENTIAL
Procédure d'authentification associée à la
section <security-constraint>
Section <login-config>
Sous-section <auth-method>
BASIC si page d'authentification fournie par TOMCAT
Exemple de web.xml
...
<security-constraint>
<web-resource-collection>
<web-resource-name>Professors</web-resource-name>
<url-pattern>/professors/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>professor</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<form-login-config>
</form-login-config>
</login-config>
<security-role>
<role-name>professor</role-name>
</security-role>
...
TOMCAT
Règle principale
Séparation des fichiers d'installation et des fichiers
applicatifs
Grâce à CATALINA_HOME et CATALINA_BASE
Avantages
Mise à jour de TOMCAT sans impacter les applications
Mise à jour de la JVM
Évaluation aisée des versions de TOMCAT et de JVM
Plusieurs versions de TOMCAT
CATALINA_HOME=/usr/local/apache-tomcat-6.0.18
CATALINA_BASE=/usr/local/tomcat-instance-01
JAVA_HOME=/usr/local/jdk1.6.0_10
JRE_HOME=$JAVA_HOME/jre
CATALINA_PID=$CATALINA_BASE/logs/tomcat.pid
TOMCAT
Environnement de production
TOMCAT en production
Règle principale
Séparation des fichiers d'installation et des fichiers
applicatifs
Grâce à CATALINA_HOME et CATALINA_BASE
Avantages
Mise à jour de TOMCAT sans impacter les applications
Retour aisé à une version antérieure en cas d'instabilité
Permet d'affecter des droits différents sur les répertoires
Exemple
Une équipe projet peut écrire dans webapps/ mais ne peut
pas écrire dans les autres répertoires
TOMCAT en production
Stratégie
Découpler l'installation de TOMCAT des instances
qui hébergent les applications.
Avantages
Chaque instance s'exécute dans sa propre JVM
Chaque instance démarre plus rapidement car elle ne
lance que les applications qui y sont déployées
Architecture de production
/usr/javaee/production/
apache-tomcat-6.0.18/
bin/
conf/
lib/
logs/
temp/
webapps/
work/
instance_1
conf/
logs/
temp/
webapps/
work/
instance_2
idem instance_1
shared/
conf/
run.sh
Détail de l'architecture
/usr/javaee/production/
apache-tomcat-6.0.18/
installation standard
instance_1
bin/
setenv.sh // autre version de TOMCAT, autre JVM
conf/
catalina.properties // propriétés de port (shutdown, http, jmx)
web.xml // copie de l'installation standard
logs/
temp/
webapps/
work/
instance_2
idem instance_1
shared/
conf/
logging.properties // copie de l'installation standard
server.xml // minimal avec substitution des variables du
fichier catalina.properties des instances
tomcat-users.xml
run.sh
Le script run.sh
Au démarrage, Tomcat lit sa configuration qui est lue depuis les fichiers server.xml,
logging.properties, etc. Chaque instance possédant ses propres paramètres (port
d'écoute, répertoire de log...), il pourrait être tentant de copier et modifier ces fichiers
manuellement.
Mais Tomcat propose une solution plus élégante : les placeholders, ou variables de
substitution. Il est alors possible de créer un modèle universel de configuration
possédant des portions dynamiques de la forme "${variable}", dont les valeurs
spécifiques sont redéfinies au niveau de chaque instance.
Dans notre exemple d'installation, les fichiers de configuration placés dans
CATALINA_HOME/conf sont les modèles, et les valeur spécifiques sont définies
dans les fichiers CATALINA_BASE/conf/catalina.properties des instances.
TOMCAT
TOMCAT et APACHE
TOMCAT et serveurs HTTP
/sbin/iptables -t nat \
-A PREROUTING -j REDIRECT -p tcp \
--destination-port 80:80 --to-ports 8080
Sécuriser Linux avec chroot
La commande chroot
Crée une racine virtuelle de système de fichiers
Tomcat avec chroot
Interdit aux applications qui s'exécutent sous TOMCAT
d'accéder à l'extérieur du chroot
Nécessite la copie des ressources nécessaires à la
JVM et à TOMCAT au sein du chroot
/bin, /lib, /usr/bin, /usr/lib , Java (JRE ou JDK)
/etc/passwd, /etc/group, /etc/hosts
Nécessite la création des répertoires
/dev, /dev/null, /dev/zero
TOMCAT
Création du fichier
/etc/logrotate.d/tomcat
Contenu du fichier pour une compression tout
les jours quand le fichier atteint 5M
/var/log/tomcat/catalina.out {
copytruncate
daily
rotate 7
compress
missingok
size 5M
}
Mise en œuvre