Tomcat

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Conteneur de servlets / serveur web Java
Éditeur Apache Software Foundation
Ports usuels 8080 (HTTP), 8443 (HTTPS), 8005 (shutdown), 8009 (AJP)
Voir aussi Tomcat (sécurisation) · Tomcat (SSL) · Script init.d Tomcat

Apache Tomcat est un conteneur de servlets et serveur web Java. Cette page décrit l'installation et la configuration d'une instance Tomcat (préparation du stockage, script d'init, utilisateurs, server.xml, journalisation, manager).

Préparation du stockage (LVM)

Ajouter un disque dédié, le préparer avec fdisk (type 8e, LVM) puis :

pvcreate /dev/sdb1
vgcreate vg_produits /dev/sdb1
lvcreate -n lv_tomcat -L 15G vg_produits
mkfs.ext4 /dev/vg_produits/lv_tomcat

# montage persistant
echo '/dev/mapper/vg_produits-lv_tomcat  /tomcat  ext4  defaults  1 2' >> /etc/fstab
mkdir -p /tomcat
mount -a
df -h

Installation

mkdir /var/log/tomcat
# copier la distribution Tomcat dans /tomcat/APP-NAME
chown -R APP-NAME:APP-NAME /tomcat/APP-NAME

# script d'init (voir Script init.d Tomcat)
vi /etc/init.d/tomcat_APP-NAME
chkconfig --add tomcat_APP-NAME

Voir Script init.d Tomcat pour le contenu du script.

Configuration des utilisateurs

Sauvegarder puis éditer conf/tomcat-users.xml (remplacer les mots de passe d'exemple par des valeurs robustes) :

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

Personnalisation de server.xml

Fichier conf/server.xml. Adapter les ports pour rester cohérent avec l'instance.

Directive Server (port et commande de shutdown) :

<Server port="8005" shutdown="SHUTDOWN">

Directive Service :

<Service name="TOMCAT">

Directive Connector HTTP avec options courantes :

<Connector port="8080" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           connectionTimeout="20000" disableUploadTimeout="true" />
maxHttpHeaderSize   : taille maximale de l'en-tête HTTP
maxThreads          : nombre maximum de threads acceptés
minSpareThreads     : threads créés au démarrage
maxSpareThreads     : threads inactifs maximum
enableLookups       : résolution du nom d'hôte client (false en prod)
redirectPort        : port du connecteur SSL pour les requêtes HTTPS
acceptCount         : requêtes en file d'attente
connectionTimeout   : délai de traitement d'une requête
disableUploadTimeout: délai d'upload de fichier

Connecteur HTTPS (à décommenter pour activer le SSL) :

<Connector port="8443" maxHttpHeaderSize="8192"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" disableUploadTimeout="true"
           acceptCount="100" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
/usr/bin/keytool -genkey -alias tomcat -keyalg RSA

Connecteur AJP :

<Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="8443" />

Authentification

Chiffrer les mots de passe du fichier utilisateurs :

export JRE_HOME=/usr/
bin/digest.sh -a sha256 MonMotDePasse

Activer le mode chiffré dans server.xml (attribut digest) :

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       resourceName="UserDatabase" digest="sha256" />

Authentification centralisée via un annuaire LDAP (exemple générique) :

<Realm className="monorg.realm.LdapRealm" debug="99" host="ldap.exemple.tld"
       initialContextFactory="com.sun.jndi.ldap.LdapCtxFactory" minCount="1" maxCount="3"
       loginTimeout="3" dataSourceName="jdbc/realm" baseDN="dc=exemple,dc=tld"
       searchFilter="(&amp;(objectclass=inetOrgPerson)(uid=#userName#))" />

Journalisation via syslog (log4j)

Vérifier la présence de log4j.jar dans lib/, puis configurer log4j.properties de la webapp (commenter les autres appenders) :

log4j.rootLogger=INFO, SYSLOG
log4j.logger.org.apache.catalina=INFO, SYSLOG
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.ConversionPattern=%p: %m
log4j.appender.SYSLOG.Facility=LOCAL1

Côté rsyslog de la machine :

# /etc/rsyslog.conf
local1.*   /var/log/tomcat/tomcat.log
# et exclure local1 de /var/log/messages
service rsyslog restart

Manager / Admin

  • Récupérer le paquet tomcat-admin correspondant à la version.
  • Copier admin.xml dans conf/Catalina/localhost/.
  • Copier l'application dans webapps/admin.
  • Vérifier la présence d'un rôle manager dans tomcat-users.xml, puis redémarrer.

Modifier la bannière

cd $CATALINA_HOME/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
# éditer ServerInfo.properties
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties

Configuration d'une ressource (datasource)

Dans conf/Catalina/localhost/services.xml, server.xml ou context.xml :

<Resource
    name="jdbc/ctr"
    auth="Container"
    type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    validationQuery="select 1 from dual"
    username="user"
    password="CHANGEME"
    url="jdbc:oracle:thin:@hostname.fqdn:1521:SID" />

Voir aussi