Académique Documents
Professionnel Documents
Culture Documents
1
Plan
Introduction Déploiement
d’application
Installation
Cluster
Configuration
Journalisation APR
Sécurité
JMX Monitoring
03/04/2014 2
Introduction
Moteur JSP/Servlet
Versions en cours
8.0.x : en mode maintenance, pas de nouveaux
développement
9.0.x : version actuelle
Version
Version Tomcat Version Servlet Version Java
JSP
http://tomcat.apache.org/download-70.cgi
http://tomcat.apache.org/download-80.cgi
http://tomcat.apache.org/download-90.cgi
Installation
Le site propose plusieurs types de ressources :
Core :
Des archives zip ou tar, décompressés fournissent
un dossier qui constitue le serveur TOMCAT
Des exécutables d’installation pour la plateforme
Windows
Debian et Ubuntu :
Installation : apt-get install tomcat9
Le démarrage de TOMCAT :
Windows : %CATALINA_HOME%/bin/startup.bat
Linux : $CATALINA_HOME/bin/startup.sh
Installation
Structure
conf : Fichiers de configuration
catalina.policy : les paramètres de sécurité JAVA appliqués en
remplacement du paramétrage java.policy
catalina.properties : Définition des différents classLoader
context.xml : indique l’emplacement par défaut du fichier
web.xml au niveau des application WEB
logging.properties : configuration par défaut de la
journalisation TOMCAT
server.xml : Fichier de configuration principale de TOMCAT
tomcat-users.xml : fichiers de configuration des droits d’accés
aux applications d’administration
web.xml : web.xml par défaut utilisé par toutes les
applications déployés
Identifie la servlet pour récupérer les documents statiques
Identifie la servlet responsable de la transformation de la JSP en
servlet
Identifie le timeout session
Installe les mime types pour les extensions standards
Installation
Structure
logs : journaux
<GlobalNamingResources>
<Environment name="serverType" type="java.lang.String"
value="DEV"/>
</GlobalNamingResources>
<Context>
<ResourceLink name="serverType" global="serverType"
type="java.lang.String"/>
</Context>
JNDI Ressources
Utilisation
<Context>
...
<Resource name="jdbc/EmployeeDB" auth="Container"
type="javax.sql.DataSource"
username="dbusername" password="dbpassword"
driverClassName="org.hsql.jdbcDriver"
url="jdbc:HypersonicSQL:database" maxActive="8" maxIdle="4"
defaultAutoCommit ="false" defaultTransactionIsolation =
"READ_COMMITTED" initialSize="5"
/>
...
</Context>
<resource-ref>
<res-ref-name> jdbc/EmployeeDB </res-ref-name>
<res-type> javax.sql.DataSource </res-type>
<res-auth> Container </res-auth>
</resource-ref>
JNDI Ressources
JAVA Mail Sessions
Journalisation
La journalisation au sein de TOMCAT est implémenté
grâce à l’API Apache Commons Logging.
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory =
${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.
Journalisation
logging.properties
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level
= INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handl
ers = 3manager.org.apache.juli.FileHandler
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log. "
suffix=".log"
pattern="%h %l %u %t "%r" %s %b" />
<Realm
className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority?us
er=dbuser&password=dbpass"
userTable="users" userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"/>
Sécurité
Identification des utilisateurs : <Realm>
<Realm
className="org.apache.catalina.realm.DataSourceR
ealm" dataSourceName="jdbc/authority"
userTable="users" userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles"
roleNameCol="role_name"/>
Sécurité
Identification des utilisateurs : <Realm>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
Sécurité
Identification des utilisateurs : <Realm>
<Realm className="org.apache.catalina.realm.JNDIRealm"
connectionName="cn=Manager,dc=mycompany,dc=com"
connectionPassword="secret"
connectionURL="ldap://localhost:389"
userPassword="userPassword"
userPattern="uid={0},ou=people,dc=mycompany,dc=co
m" roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn" roleSearch="(uniqueMember={0})" />
Sécurité
Identification des utilisateurs : <Realm>
<Realm
className="org.apache.catalina.realm.JAASRealm"
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"/>
Sécurité
Identification des utilisateurs : <Realm>
<Realm className="org.apache.catalina.realm.LockOutRealm"
failureCount="3" lockOutTime="300" >
<Realm
className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
Sécurité
Identification des utilisateurs : <Realm>
<Realm
className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority" userTable="users"
userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
Sécurité
Mode d’Authentification
Démonstration
Cluster & Load balancer
En production utiliser un seul serveur comporte des
risques élevés d’indisponibilité de notre application à
chaque fois que notre serveur rencontre des
problèmes.
Cluster & Load balancer
La solution est de mettre en place un groupe de
serveurs (cluster) qui se comporte alors en tant que
serveur de production,
chaque machine exécute la même application,
N’importe quel machine peut traiter les requêtes
clients
Si une machine tombe, une autre prends le relais.
Cluster & Load balancer
La solution est de mettre en place un groupe de
serveurs Cluster qui se comporte alors en tant que
serveur de production,
Chaque machine du groupe exécute la même
application,
N’importe quel machine peut traiter les requêtes
clients
Si une machine tombe, une autre du groupe prends le
relais.
Cluster & Load balancer
Se pose alors quelques problèmes :
Chaque machine du groupe possède sa propre adresse
IP
Chaque instance TOMCAT écoute sur son propre port
worker.list=balancer,stat
worker.tomcat1.type=ajp13
worker.tomcat1.port=8080
worker.tomcat1.host=192.168.5.10
worker.tomcat2.type=ajp13
worker.tomcat2.port=8090
worker.tomcat2.host=192.168.6.10
worker.tomcat3.type=ajp13
worker.tomcat3.port=8080
worker.tomcat3.host=192.168.7.10
worker.balancer.type=lb
worker.balancer.balance_workers=tomcat1,tomcat2,tomcat3
worker.stat.type=status
Cluster & Load balancer
Load Balancer (Apache HTTPD + mod_jk
connector)
<Proxy balancer://cluster>
BalancerMember ajp://app1.example.com:8009 loadfactor=1
BalancerMember ajp://app2.example.com:8009 loadfactor=2
ProxySet lbmethod=bytraffic
</Proxy>
<Valve> :
ReplicationValve : notifie le Cluster de la fin du traitement
d’une requête HTTP pour optimiser l’opération de
réplication des données
JvmRouteBinderValve : ajoute le jvmRoute au niveau de
l’id session pour que les requêtes suivantes de la même
session soient traités par le même membre.
<ClusterListner> :
ClusterSessionListener : utilisé si le gestionnaire de
session est DeltaManager.
JvmRouteSessionIDBinderListener : se charge de redéfinir
le jvmRoute de la requête si le serveur responsable est
KO.
Cluster & Load balancer
Cluster TOMCAT
Cluster & Load balancer
Cluster TOMCAT
Les objets déposés par les applications dans les sessions HTTP
doivent être sérialisable
Cluster & Load balancer
jvmRoute
worker.tomcat1.type=ajp13
worker.tomcat1.port=8080
worker.tomcat1.host=192.168.5.10
<Engine name="Catalina"
defaultHost="localhost“ jvmRoute=“tomcat1” >
Cluster & Load balancer
jvmRoute
<Proxy balancer://mycluster>
BalancerMember ajp://192.168.1.50:80 route=node1
BalancerMember ajp://192.168.1.51:80 route=node2
</Proxy>
<Engine name="Catalina"
defaultHost="localhost“ jvmRoute=“node1” >
Cluster & Load balancer
jvmRoute
Windows :
set CATALINA_BASE= /path/tomcat-instance1
cd $CATALINA_HOME/bin
./startup.bat
APR
INFO: The APR based Apache Tomcat Native library which allows
optimal performance in production environments was not found
on the java.library.path
Installation :
get-app install libapr1-dev libssl-dev
cp $TOMCAT_HOME/bin/tomcat-native.tar.gz /usr/local/src
cd /usr/local/src
tar -xvzf tomcat-native.tar.gz
cd tomcat-native-1.1.16-src/jni/native
./configure --with-apr=/usr/bin/apr-1-config
--with-java-home=$JAVA_HOME
--with-ssl=yes
--prefix=$CATALINA_HOME
make
make install
Redémarrer TOMCAT
APR
Utiliser les connecteurs
HTTPS
<Listener className="org.apache.catalina.core.AprLifecycleListener"
SSLEngine="on" />
export JAVA_OPTS="-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Djava.rmi.server.hostname=adressIPVotreServeur
-Dcom.sun.management.jmxremote.password.file=/path/jmx.password
-Dcom.sun.management.jmxremote.access.file=/path/jmx.access"
JMX Monitoring
Le fichier jmx.password contient les couples login/mot de
passe autorisés à accéder en JMX sous la forme
user1 password1
user2 password2
Le fichier jmx.access contient les autorisations de chaque
utilisateur
user1 readonly
user2 readwrite
L’accès au fichier jmx.password doit être limité à
l’utilisateur JAVA
sudo chown tomcat7:tomcat7 /path/jmx.*
sudo chmod 0600 /path/jmx.*
pour la plate forme Windows suivre le document suivant :
http://docs.oracle.com/javase/6/docs/technotes/guides/mana
gement/security-windows.html
JMX Monitoring
Si TOMCAT est dernière un firewall, il se peut qu’un
problème de communication advienne.
<Listener
className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="9090" rmiServerPortPlatform="9091" />