Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !


JBoss Application Server (JBoss AS – ou plus simplement JBoss) est un serveur d'application Java très populaire dans le monde Linux/Unix. Cette popularité tient tant au fait que ce soit un logiciel libre, qu'à la fiabilité et la souplesse de cet outil.

Nous allons voir dans cet article comment installer JBoss AS 5 en environnement Linux. Les manipulations décrites ici ont été testées sur une distribution Debian/Lenny – mais le tout devrait pouvoir s'adapter quasiment sans modification à une autre distribution Linux – ou à un autre système Unix-like.

Installation de base

L'installation de base de JBoss est en fait des plus simples: il suffit de télécharger l'archive ZIP à partir du site de JBoss (http://www.jboss.org/jbossas/downloads/), puis de l'extraire. Il est possible d'installer JBoss n'importe où sur votre système – y compris dans votre répertoire personnel. Néanmoins, cette dernière solution est à réserver à votre machine de développement personnelle. C'est pourquoi nous allons ici plutôt installer JBoss dans la répertoire /opt:

Les utilisateurs qui accèdent au logiciel au travers du lien symbolique auront automatiquement accès à la nouvelle version lors d'une mise à jour du lien.
Mais les utilisateurs qui le désirent peuvent aussi accéder directement à une version particulière.
sh# cd /opt
sh# unzip /path/to/jboss-5.1.0.GA-jdk6.zip
sh# ln -s jboss-5.1.0.GA jboss
sh# ls -ld jboss*
lrwxrwxrwx 1 root root   14 2009-08-24 21:45 jboss -> jboss-5.1.0.GA
drwxr-xr-x 8 root root 4096 2009-05-23 17:59 jboss-5.1.0.GA

Remarque:

Comme toujours, j'ai créé un lien symbolique. Ce niveau d'indirection me permet de facilement basculer d'une version de JBoss à l'autre.

Il serait possible de s'arrêter là: en effet, dès maintenant, vous pouvez lancer et arrêter JBoss à l'aide des scripts contenus dans /opt/jboss/bin:

sh# /opt/jboss/bin/run.sh # Démarre JBoss
[...]
14:10:13,983 INFO  [ServerImpl] JBoss (Microcontainer) 
[5.1.0.GA (build: SVNTag=JBoss_5_1_0_GA date=200905221634)] 
Started in 2m:38s:855ms
sh# /opt/jboss/bin/shutdown.sh -S # Arrête JBoss
[...]
14:29:37,773 INFO  [ServerImpl] Shutdown complete
Shutdown complete
Halting VM

Si dézipper l'archive suffit pour pouvoir démarrer JBoss à l'aide des scripts standards, une installation sur une machine de production nécessite de pouvoir démarrer automatiquement JBoss au démarrage de la machine. Et c'est ce que nous allons mettre en place maintenant.

Démarrage automatique

Utilisateur et groupe

Pour commencer, nous allons créer l'utilisateur jboss. C'est sous cette identité que tournera le serveur:

sh# useradd --system -b /opt jboss

Ensuite, nous allons créer le groupe jboss-admin. Ce sera le groupe des utilisateurs autorisés à déployer des applications et à configurer le serveur:

sh# groupadd jboss-admin
sh# adduser jboss jboss-admin   # jboss doit appartenir à ce groupe
sh# adduser sylvain jboss-admin # ainsi que les utilisateurs intervenants sur le serveur d'application
sh# chgrp -R jboss-admin /opt/jboss/server/
sh# chmod -R g+w /opt/jboss/server/

Script de démarrage

Maintenant, reste à écrire le script de démarrage. Créez le fichier /etc/init.d/local-jboss

Pourquoi local-jboss?

Il y a de fortes chances que votre distribution installe des scripts de démarrage dans /etc/init.d. C'est une bonne habitude de préfixer vos scripts personnels par local-, ainsi il est plus facile de distinguer vos fichiers de ceux gérés par le système de package.

#!/bin/sh
 
##
## Début de la configuration
##
 
JBOSS_USER=jboss
JBOSS_CONSOLE=/dev/null
 
##
## Fin de la configuration
##
 
start(){
        CMD='echo Starting JBoss with:'
 
        # Si votre système/votre su(1) n'utilise pas PAM(7), vous devrez charger
        # le fichier /etc/environment manuellement. Si c'est le cas, enlevez
        # le commentaire de la ligne suivante:
        # CMD="${CMD};"'[ -r /etc/environment ] && . /etc/environment'
 
        # Valeur par défaut et affichage de JBOSS_HOME
        CMD="${CMD};"'[ -z "${JBOSS_HOME}" ] && JBOSS_HOME=/opt/jboss'
        CMD="${CMD};"'echo JBOSS_HOME=${JBOSS_HOME}'
 
        # Valeur par défaut et affichage de JBOSS_CONF
        CMD="${CMD};"'[ -z "${JBOSS_CONF}" ] && JBOSS_CONF=default'
        CMD="${CMD};"'echo JBOSS_CONF=${JBOSS_CONF}'
 
        # run.sh
        CMD="${CMD};"'${JBOSS_HOME}/bin/run.sh -c ${JBOSS_CONF}'
 
        # Execute ${CMD} dans un environnement contrôlé
        env - su -l ${JBOSS_USER} -s /bin/sh -c "${CMD} > ${JBOSS_CONSOLE} 2>&1 &"
}
 
stop(){
        # Si votre système/votre su(1) n'utilise pas PAM(7), vous devrez charger
        # le fichier /etc/environment manuellement. Si c'est le cas, enlevez
        # le commentaire de la ligne suivante:
        # CMD="${CMD};"'[ -r /etc/environment ] && . /etc/environment'
 
        # Valeur par défaut et affichage de JBOSS_HOME
        CMD='[ -z "${JBOSS_HOME}" ] && JBOSS_HOME=/opt/jboss'
 
        CMD="${CMD};"'${JBOSS_HOME}/bin/shutdown.sh -S'
        echo "Stopping JBoss..."
 
        env - su -l ${JBOSS_USER} -s /bin/sh -c "${CMD}"
}
 
restart(){
        stop
        sleep 60 # Ajustez éventuellement le délai en fonction de votre configuration 
        su ${JBOSS_USER} -s /bin/sh -c "killall java"
        start
}
 
case "$1" in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                restart
        ;;
        *)
                echo "Usage: local-jboss {start|stop|restart}"
                exit 1
esac
exit 0

Le script ci-dessus est un peu plus long que celui proposé sur le site de JBoss. Pour deux raisons:

  1. Tout d'abord, à cause de l'utilisation de variables pour paramètrer le démarrage du serveur. La manière dont j'utilise JBOSS_USER et JBOSS_CONSOLE ne pose sans doute aucun problème à comprendre. Mais JBOSS_HOME et JBOSS_CONF sont certainement plus mystérieuses. En fait, je m'en sers de telle sorte qu'elles puissent être initialisées dans le fichier /etc/environment, sans qu'il soit nécessaire de modifier le script de démarrage en lui même.
  2. Ensuite, je me donne beaucoup de mal pour lancer JBoss dans un environnement contrôlé. En particulier remarquez que j'utilise la commande env(1) pour partir d'un environnement vide, puis que j'enchaîne avec su(1) avec l'option -l pour lancer JBoss avec l'identité et l'environnement de l'utilisateur jboss. Enfin, je donne une valeur par défaut aux variables JBOSS_HOME et JBOSS_CONF si elles n'ont pas été initialisées – juste avant de lancer JBoss à proprement parler. Non seulement cela me permet de démarrer JBoss dans un environnement propre. Mais en plus, cela m'assure que JBoss démarre avec le même environnement qu'il soit lancé automatiquement au démarrage de la machine – ou que ce script soit invoqué manuellement pour relancer le serveur d'application.

Si l'environnement est vraiment nettoyé, par quel miracle JBOSS_HOME et JBOSS_CONF pourraient quand même être initialisées?

La réponse est PAM ( Pluggable Authentication Modules – Un mécanisme flexible pour gérer l'authentification des utilisateurs en environnement Unix-like. Plus... ) . Sans rentrer dans les détails, su(1) utilise PAM(7) pour authentifier les utilisateurs. Or le chargement du module PAM entraîne la lecture du fichier /etc/environment. Si vous avez défini des variables d'environnement dans ce fichier, elles sont donc chargées dans su et leur valeur est héritée par tous les processus lancés par ce su. Y compris le shell (/bin/sh) qui servira à exécuter le script de démarrage de JBoss.

Ainsi, si vous voulez démarrer JBoss en configuration minimale, il suffira de définir JBOSS_CONF=minimal dans le fichier /etc/environment:

# Pour démarrer JBoss avec la configuration "minimal":
sh# sed -i '/^JBOSS_CONF=/d;$a JBOSS_CONF=minimal' /etc/environment

Ou pour utiliser une version particulière de JBoss:

# Utiliser JBoss-5.0.0.GA":
sh# sed -i '/^JBOSS_HOME=/d;$a JBOSS_HOME=jboss-5.0.0.GA' /etc/environment

Enfin, publier les valeurs de JBOSS_HOME et JBOSS_CONF dans /etc/environment permet de les définir en un seul point, tout en les rendant accessibles aux autres processus et en les intégrant automatiquement à l'environnement des utilisateurs de la machine. Pratique par exemple pour vos scripts de déploiement, ou pour simplifier la vie des administrateurs de JBoss.

N'oubliez pas non plus de rendre ce script exécutable:

sh# chmod +x /etc/init.d/local-jboss

Vous pouvez tout de suite tester votre script:

sh# /etc/init.d/local-jboss start
Starting JBoss with:
JBOSS_HOME=/opt/jboss
JBOSS_CONF=default

Et quelques secondes (minutes?) après le démarrage, vous pourrez vous connecter à votre serveur JBoss à l'adresse http://localhost:8080. Vous pourrez aussi vérifier qu'il est possible d'arrêter le serveur:

sh# /etc/init.d/jboss stop
Stopping jboss...
Shutdown message has been posted to the server.
Server shutdown may take a while - check logfiles for completion

Remarque:

Vous pouvez suivre les messages du serveur dans le fichier ${JBOSS_HOME}/server/${JBOSS_CONF}/log/server.log:

sh# tail -f /opt/jboss/server/default/log/server.log

Lancer JBoss au démarrage

Maintenant que tout est en place, reste juste à configurer votre machine pour lancer JBoss au démarrage. Sur un système qui utilise des scripts d'initialisation système V comme Debian, cela se fait en ajoutant les liens symboliques vers le script de démarrage dans les répertoires /etc/rc?.d correspondants aux différents niveaux d'exécution (runlevels).

Piège:

D'un système à l'autre – et d'une distribution à l'autre – le nombre et la signification des runlevels varient. Les exemples ci-dessous sont pour Linux/Debian. Et sans doute à adapter si vous utilisez un autre système. Référez-vous au manuel de votre système ou à la page wikipedia:runlevel pour vérifier.

Créons d'abord les liens pour démarrer JBoss:

sh# ln -s /etc/init.d/local-jboss /etc/rc2.d/S35local-jboss
sh# ln -s /etc/init.d/local-jboss /etc/rc3.d/S35local-jboss
sh# ln -s /etc/init.d/local-jboss /etc/rc4.d/S35local-jboss
sh# ln -s /etc/init.d/local-jboss /etc/rc5.d/S35local-jboss

Puis ceux pour l'arrêter:

sh# ln -s /etc/init.d/local-jboss /etc/rc6.d/K44local-jboss # Stop on reboot
sh# ln -s /etc/init.d/local-jboss /etc/rc0.d/K44local-jboss # Stop on halt
sh# ln -s /etc/init.d/local-jboss /etc/rc1.d/K44local-jboss # Stop on enter single user

Et voilà: au prochain reboot de votre machine, JBoss démarrera automatiquement (et s'arrêtera à l'extinction).

Remarque:

Accessoirement, sous Debian, vous pouvez utiliser l'utilitaire update-rc.d pour créer ces liens:

sh#  update-rc.d local-jboss defaults
update-rc.d: warning: /etc/init.d/local-jboss missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/local-jboss ...
   /etc/rc0.d/K20local-jboss -> ../init.d/local-jboss
   /etc/rc1.d/K20local-jboss -> ../init.d/local-jboss
   /etc/rc6.d/K20local-jboss -> ../init.d/local-jboss
   /etc/rc2.d/S20local-jboss -> ../init.d/local-jboss
   /etc/rc3.d/S20local-jboss -> ../init.d/local-jboss
   /etc/rc4.d/S20local-jboss -> ../init.d/local-jboss
   /etc/rc5.d/S20local-jboss -> ../init.d/local-jboss

Références