Mise à jour Tomcat 7 Ubuntu

De EjnTricks
Révision de 7 septembre 2016 à 22:57 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Sur une installation initiale, la commande suivante est suffisante.

#sudo apt-get install tomcat7


Cependant, dans le cadre de cette installation, une instance de Tomcat en version 6 était déjà en place et le paquet ne pouvait s'installer avec le message d'erreur suivant.

#apt-get install tomcat7
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Certains paquets ne peuvent être installés. Ceci peut signifier
que vous avez demandé l'impossible, ou bien, si vous utilisez
la distribution unstable, que certains paquets n'ont pas encore
été créés ou ne sont pas sortis d'Incoming.
L'information suivante devrait vous aider à résoudre la situation :

Les paquets suivants contiennent des dépendances non satisfaites :
 tomcat7 : Dépend: tomcat7-common (>= 7.0.56-2ubuntu0.1) mais ne sera pas installé
E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l'état ».


Cet article présente donc la procédure de mise à jour.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Save-icon.png Sauvegarde application

La mise à jour peut nécessité la suppression du paquet tomcat6 initial. Il est donc important d'effectuer une sauvegarde des applications déjà déployées. Dans le cadre de cette installation, les commandes suivantes sont réalisées, afin de conserver les informations suivantes :

  • Applications installées dans /var/lib/tomcat6/webapps.
  • Répertoire de travail des applications (Jenkins, Sonar, Nexus ...) dans /usr/share/tomcat6.
#sudo mkdir -p /var/opt/backups/tomcat
#sudo cp -p -R /var/lib/tomcat6/webapps /var/opt/backups/tomcat
#sudo mkdir /var/opt/backups/tomcat/share
#sudo cp -a -p -R /usr/share/tomcat6/. /var/opt/backups/tomcat/share/

A noter que le répertoire /usr/share/tomcat6 contient des répertoires cachés, d'où l'utilisation de l'argument -a et l'emplacement /usr/share/tomcat6/. pour effectuer la sauvegarde de ces répertoires. Cependant, la suppression des paquets n'entraîne pas la suppression des fichiers personnalisés.


Delete-file-icon.png Suppression paquets

La suppression du paquet tomcat6 n'est pas suffisante. La liste des paquets cibles est déterminée à l'aide de l'outil dpkg

#dkpg --get-selections | grep tomcat6
libtomcat6-java                                 install
tomcat6                                         install
tomcat6-admin                                   install
tomcat6-common                                  install

La suppression du paquet tomcat6-common entraîne la suppression de l'ensemble des paquets.

#sudo apt-get purge tomcat6-common
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java
  libservlet2.5-java libtomcat6-java
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets suivants seront ENLEVÉS :
  tomcat6* tomcat6-admin* tomcat6-common*
0 mis à jour, 0 nouvellement installés, 3 à enlever et 3 non mis à jour.
Après cette opération, 685 ko d'espace disque seront libérés.
Souhaitez-vous continuer ? [O/n] O

En fin d'exécution des messages avertissent que les fichiers personnalisés, applications / répertoires de travail, ne sont pas supprimés.

dpkg : avertissement : lors de la suppression de tomcat6, le répertoire « /var/lib/tomcat6/webapps » n'était pas vide, donc il n'a pas été supprimé
dpkg : avertissement : lors de la suppression de tomcat6, le répertoire « /var/lib/tomcat6/shared » n'était pas vide, donc il n'a pas été supprimé
Suppression de tomcat6-admin (6.0.41-1) ...
Purge des fichiers de configuration de tomcat6-admin (6.0.41-1) ...
dpkg : avertissement : lors de la suppression de tomcat6-admin, le répertoire « /etc/tomcat6/Catalina/localhost » n'était pas vide, donc il n'a pas été supprimé
Suppression de tomcat6-common (6.0.41-1) ...

Comme indiqué lors du démarrage de la suppression, des paquets complémentaires peuvent être supprimés, même si une partie sera réinstallée avec tomcat7.

#sudo apt-get purge authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java libservlet2.5-java libtomcat6-java


System-Install-icon.png Installation

Une fois la version précédente supprimée, le paquet tomcat7 peut être installé.

#sudo apt-get install tomcat7
Les paquets supplémentaires suivants seront installés : 
  authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java
  libservlet3.0-java libtomcat7-java tomcat7-common
Paquets suggérés :
  libcommons-collections3-java-doc libcommons-dbcp-java-doc ecj ant libecj-java-gcj
  tomcat7-docs tomcat7-admin tomcat7-examples tomcat7-user libtcnative-1
Les NOUVEAUX paquets suivants seront installés :
  authbind libcommons-collections3-java libcommons-dbcp-java libcommons-pool-java libecj-java
  libservlet3.0-java libtomcat7-java tomcat7 tomcat7-common
0 mis à jour, 9 nouvellement installés, 0 à enlever et 3 non mis à jour.
Il est nécessaire de prendre 6 505 ko dans les archives.
Après cette opération, 8 295 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] O


Backup-restore.png Restauration

L'instance Tomcat7 est alors disponible. Il suffit alors de reprendre les fichiers personnalisés, applications / répertoires de travail, préalablement sauvegardés ou depuis la précédente installation.

#sudo cp -p -R /var/lib/tomcat6/webapps* /var/lib/tomcat7/webapps
#sudo cp -a -p -R /usr/share/tomcat6/. /usr/share/tomcat7/

Dans le cadre de cette installation, des librairies avaient été rendues disponibles dans le répertoire lib de l'instance précédente, pour diverses applications.

#sudo ll /usr/share/tomcat6/lib/
total 8
drwxr-xr-x  2 root root 4096 août  17 23:47 ./
drwxr-xr-x 10 root root 4096 août  17 23:46 ../
lrwxrwxrwx  1 root root   29 déc.  12  2010 activation.jar -> ../../java/activation-1.1.jar
lrwxrwxrwx  1 root root   23 déc.  12  2010 mail.jar -> ../../java/mail-1.4.jar

Lors de la recopie, ces liens sont bien pris en compte.


Configuration-icon.png Paramétrages

Icon File Owner.png Permissions

Lors de l'installation avec apt-get, les permissions des fichiers peuvent être affectées au compte root. Il peut en résulter des problèmes lors de l'utilisation de produits. Il est donc nécessaire de modifier certains fichiers / répertoires.

#sudo chown tomcat7:tomcat7 /usr/share/tomcat7


Command-icon.png Script démarrage

Comme dans le cadre de la mise à jour de Ubuntu 12.04, le script de démarrage de Tomcat doit être modifié s'il est souhaité d'utiliser une JDK Oracle, et non pas OpenJDK. Par défaut, le lien /usr/lib/jvm/default-java est utilisé, pointant sur une instance OpenJDK.

#ll /usr/lib/jvm/
total 104
drwxr-xr-x   6 root root  4096 août   8 01:38 ./
drwxr-xr-x 114 root root 69632 août  17 23:50 ../
lrwxrwxrwx   1 root root    24 déc.  17  2013 default-java -> java-1.7.0-openjdk-amd64/
lrwxrwxrwx   1 root root    20 avril 13  2012 java-1.6.0-openjdk-amd64 -> java-6-openjdk-amd64/
-rw-r--r--   1 root root  2387 août   5 05:35 .java-1.6.0-openjdk-amd64.jinfo
lrwxrwxrwx   1 root root    20 déc.  20  2013 java-1.7.0-openjdk-amd64 -> java-7-openjdk-amd64/
-rw-r--r--   1 root root  2439 juil. 24 13:58 .java-1.7.0-openjdk-amd64.jinfo
drwxr-xr-x   5 root root  4096 mai    6  2012 java-6-openjdk-amd64/
drwxr-xr-x   3 root root  4096 mai    6  2012 java-6-openjdk-common/
drwxr-xr-x   5 root root  4096 déc.  21  2013 java-7-openjdk-amd64/
drwxr-xr-x   8 root root  4096 oct.  16  2014 java-7-oracle/
-rw-r--r--   1 root root  2543 oct.  16  2014 .java-7-oracle.jinfo

La modification mise en place spécifie explicitement la version à utiliser, une version 1.7 de Oracle, dans le script /etc/init.d/tomcat7. Cela n'est pas une solution autant paramétrable que le standard, mais convient parfaitement pour les besoins de cette installation.

# this is a work-around until there is a suitable runtime replacement
# for dpkg-architecture for arch:all packages
# this function sets the variable JDK_DIRS
find_jdks()
{
    for java_version in 9 8 7 6
    do
        for jvmdir in /usr/lib/jvm/java-${java_version}-openjdk-* \
                      /usr/lib/jvm/jdk-${java_version}-oracle-* \
                      /usr/lib/jvm/jre-${java_version}-oracle-*
        do
            if [ -d "${jvmdir}" -a "${jvmdir}" != "/usr/lib/jvm/java-${java_version}-openjdk-common" ]
            then
                JDK_DIRS="${JDK_DIRS} ${jvmdir}"
            fi
        done
    done

    # Add older non multi arch installations
    JDK_DIRS="${JDK_DIRS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-7-oracle"
}

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java"
# JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks


Le script modifié étant utilisé pour les services, les modifications doivent être pris en compte par le système Systemd. L'ensemble des services est donc rechargé.

#sudo systemctl daemon-reload

Dans le cadre de la montée de version de Java 1.8, la même modification est réalisée pour prendre en compte celle-ci. Le problème persiste avec le fait que c'est les version openjdk qui ont priorité. La modification apportée est la suivante.

# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not
# defined in $DEFAULT)
JDK_DIRS="/usr/lib/jvm/java-8-oracle /usr/lib/jvm/default-java"
#JDK_DIRS="/usr/lib/jvm/java-7-oracle /usr/lib/jvm/default-java"
# JDK_DIRS="/usr/lib/jvm/default-java"
find_jdks


Icon-Configuration-Settings.png Variables d'environnement

Dans le cadre de l'installation de Subsonic, un fichier setenv.sh avait été mis en place afin de configurer une variable d'environnement. Ce fichier avait été placé dans le répertoire /var/lib/tomcat6/bin et peut être copié telquel dans la nouvelle instance, soit dans le répertoire /var/lib/tomcat7/bin.

Dans le cadre de cette installation, tout le répertoire est recopié car il ne contenait que ce fichier.

#sudo cp -p -R /var/lib/tomcat6/bin /var/lib/tomcat7


Icon-Configuration-Settings.png Contexte ROOT

Il est constaté un avertissement dans le trace de l'instance, soit /var/log/tomcat7/catalina.out dans le cadre de cette installation, au démarrage du serveur. Celui-ci indique un paramétrage pas totalement conforme pour l'application ROOT

INFOS: Déploiement du répertoire /var/lib/tomcat7/webapps/ROOT de l'application web
janv. 16, 2016 2:00:25 PM org.apache.catalina.core.StandardContext setPath
AVERTISSEMENT: A context path must either be an empty string or start with a '/' and do not end with a '/'. The path [/] does not meet these criteria and has been changed to []

Cet avertissement n'est pas spécialement problématique et pourrait être ignoré. Cependant pour le corriger, il va suffire de modifier le fichier context.xml de l'application ROOT, se situant à l'emplacement /var/lib/tomcat7/webapps/ROOT/META-INF/context.xml dans le cadre de cette installation. Le contenu original est le suivant.

<Context path="/"
        antiResourceLocking="false" />

Il est modifié comme indiqué dans l'avertissement en supprimant la valeur / du paramètre path.

<Context path=""
        antiResourceLocking="false" />


Warning-icon.png Classpath

Sur une machine Ubuntu, les messages d'avertissement suivant étaient présent dans la trace de démarrage de Tomcat.

janv. 08, 2016 6:02:05 PM org.apache.coyote.AbstractProtocol stop
INFOS: Stopping ProtocolHandler ["http-bio-8080"]
janv. 08, 2016 6:02:06 PM org.apache.coyote.AbstractProtocol destroy
INFOS: Destroying ProtocolHandler ["http-bio-8080"]
janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/common/classes], exists: [false], isDirectory: [false], canRead: [false]
janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/common], exists: [false], isDirectory: [false], canRead: [false]
janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/server/classes], exists: [false], isDirectory: [false], canRead: [false]
janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/server], exists: [false], isDirectory: [false], canRead: [false]
janv. 08, 2016 6:02:15 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
AVERTISSEMENT: Problem with directory [/usr/share/tomcat7/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
janv. 08, 2016 6:02:17 PM org.apache.catalina.startup.VersionLoggerListener log
INFOS: Server version:        Apache Tomcat/7.0.64 (Ubuntu)

Ceux-ci ne posent aucun problème, il mentionne uniquement un avertissement concernant la configuration des classpaths. Pour rappel, l'instance Tomcat est déployée sous /var/lib/tomcat7, dont le contenu est le suivant.

#ll /var/lib/tomcat7
total 28
drwxr-xr-x  7 root    root    4096 sept. 11 15:07 ./
drwxr-xr-x 72 root    root    4096 déc.  30 14:25 ../
drwxr-xr-x  2 tomcat7 tomcat7 4096 sept. 10 09:32 bin/
drwxr-xr-x  3 tomcat7 tomcat7 4096 août  17 23:50 common/
lrwxrwxrwx  1 root    root      12 juin  19  2015 conf -> /etc/tomcat7/
lrwxrwxrwx  1 root    root      17 juin  19  2015 logs -> ../../log/tomcat7/
drwxr-xr-x  3 tomcat7 tomcat7 4096 août  17 23:50 server/
drwxr-xr-x  3 tomcat7 tomcat7 4096 août  17 23:50 shared/
drwxrwxr-x  7 tomcat7 tomcat7 4096 déc.  23 01:53 webapps/
lrwxrwxrwx  1 root    root      19 juin  19  2015 work -> ../../cache/tomcat7/

A noter le lien conf qui pointe sur le répertoire sous /etc/tomcat7. Celui-ci contient le fichier catalina.properties, dans lequel l'instance est configurée, et notament différents classpaths.

#
#
# List of comma-separated paths defining the contents of the "common"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank,the JVM system loader will be used as Catalina's "common"
# loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/common/classes,${catalina.home}/common/*.jar

#
# List of comma-separated paths defining the contents of the "server"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute.
# If left as blank, the "common" loader will be used as Catalina's "server"
# loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository
server.loader=${catalina.home}/server/classes,${catalina.home}/server/*.jar

#
# List of comma-separated paths defining the contents of the "shared"
# classloader. Prefixes should be used to define what is the repository type.
# Path may be relative to the CATALINA_BASE path or absolute. If left as blank,
# the "common" loader will be used as Catalina's "shared" loader.
# Examples:
#     "foo": Add this folder as a class repository
#     "foo/*.jar": Add all the JARs of the specified folder as class
#                  repositories
#     "foo/bar.jar": Add bar.jar as a class repository
# Please note that for single jars, e.g. bar.jar, you need the URL form
# starting with file:.
shared.loader=${catalina.home}/shared/classes,${catalina.home}/shared/*.jar

Les répertoires levant une alertes sont donc mentionnés dans les paramètres de configuration.

  • common.loader
  • server.loader
  • shared.loader

Ils sont configurés pour être dans l'arborescence définie par la variable d'environnement catalia.home. Or ceux-ci sont bien présents, mais sous /var/lib/tomcat7, correspond à la variable d'environnement catalina.base.

Par conséquent, deux solutions peuvent être implémentés afin de supprimer les avertissements.

  • Modifier le fichier catalina.properties en spécifiant un chemin correct. Cependant, l'instance ayant été installer avec un paquet, des conflits devront être résolus lors des mises à jour.
  • Créer l'arborescence cible. Cette solution est préférée et est mise en place à l'aide des commandes suivantes.
#sudo mkdir -p /usr/share/tomcat7/common/classes
#sudo mkdir -p /usr/share/tomcat7/server/classes
#sudo mkdir -p /usr/share/tomcat7/shared/classes

Afin d'être homogène avec l'ensemble des fichiers, les permissions sont accordés au compte tomcat7.

#sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/common
#sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/server
#sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7/shared

Les répertoires sous /var/lib/tomcat7 sont par défaut vides. Il n'y a donc aucun risque de reproduire cette arborescence dans le cadre de cette mise en place.


Logo-maven.png Configuration Maven

Lors de l'installation de Maven, les permissions sur le dépôt avaient été placées pour le compte tomcat6. Il est donc nécessaire de mettre jour ces permissions.

#sudo chown -R root:tomcat7 /usr/share/maven
#sudo chmod -R 775 /usr/share/maven/repository


Delete-file-icon.png Purge

Après avoir vérifier le bon fonctionne du serveur, les répertoires résiduels peuvent être supprimés.

#sudo rm -rf /usr/share/tomcat6
#sudo rm -rf /var/lib/tomcat6
#sudo rm -rf /etc/tomcat6


Strategy-icon.png Stratégies de Backup

Dans le cadre de cette machine, plusieurs applications ont été mises en place. Des scripts ont été écrits afin de sauvegarder les fichiers / répertoires qui sont parfois dans l'instance de Tomcat. Suite à cette mise à jour, les scripts doivent être repris afin de prendre en compte le nouvel emplacement.