Installation service Nexus : Différence entre versions
m |
(Aucune différence)
|
Version actuelle en date du 10 octobre 2018 à 13:03
L'installation de Nexus a toujours été réalisée sous la forme d'un war déployé dans un serveur d'application, tel Tomcat. Depuis la version 2.11.4, l'installation sous forme d'une application indépendante a été étudiée. La mise en place d'un service est décrite sur le site officiel, mais il existe quelques subtilités.
L'application sera alors disponible depuis l'URL http://<HOST>:8081/nexus
Sommaire
Votre avis
Nobody voted on this yet
|
|
Objectifs
L'installation de la distribution bundle, version 2.11.4, va être installée sur une plateforme Ubuntu avec les spécificités suivantes :
- Exécution avec un compte nexus;
- Configuration du fichier "PID" dans un répertoire sous
/run/nexus
; - Externalisation de fichiers en vue des mises à jour.
Etude
L'installation faite va mettre en place trois "répertoires", sous /var/opt/nexus
pour cet article, afin de séparer la version installée, les fichiers communs à toutes les versions (plugins, configuration) et un lien pour référencer la version active. Pour l'installation de la version 2.11.4, les répertoires sont les suivants.
-
/var/opt/nexus/2.11.4-01
: Contient les binaires de la version 2.11.4; -
/var/opt/nexus/common
: Contient tous les fichiers communs, comme les plugins utilisés; -
/var/opt/nexus/installed
: Lien vers la version utilisée, soit/var/opt/nexus/2.11.4-01
.
Compte de service
Cette installation ayant pour but d'être exécutée sous la forme d'un service, le compte root va être employé et ce n'est pas très sécurisé. Or il est possible de spécifier un compte utilisateur dans le script de démarrage de l'application. A l'instar d'application comme Tomcat, un compte technique est mis en place et sera exploité.
Attention le bash /bin/false
est généralement utilisé pour les comptes de service. Du fait de l'implémentation du script de démarrage, il est nécessaire que le bash associé au compte soit un "vrai" bash, dans ce cas /bin/bash
.
Le compte de service ne nécessite aucun répertoire home
, et un groupe de même nom est créé.
#sudo adduser --shell /bin/bash --system --no-create-home --group nexus Ajout de l'utilisateur système « nexus » (UID 116) ... Ajout du nouveau groupe « nexus » (GID 128) ... Ajout du nouvel utilisateur « nexus » (UID 116) avec pour groupe d'appartenance « nexus » ... Le répertoire personnel « /home/nexus » n'a pas été créé.
Téléchargement et installation
L'application est téléchargée et installée dans le répertoire /var/opt/nexus
préalablement créé.
#sudo mkdir /var/opt/nexus #sudo wget -O /tmp/nexus-2.11.4-01-bundle.tar.gz https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.4-01-bundle.tar.gz #sudo tar -C /var/opt/nexus -xzf /tmp/nexus-2.11.4-01-bundle.tar.gz #sudo mv /var/opt/nexus/nexus-2.11.4-01 /var/opt/nexus/2.11.4-01 #sudo chown -R nexus:nexus /var/opt/nexus #sudo chmod -R go-rwx /var/opt/nexus
La distribution est donc déployée dans le répertoire /var/opt/nexus/2.11.4-01
, qui représente la version mise en place.
Gestion des versions
Le déploiement de nouvelles versions doit être le plus simple possible. Les scripts de service ne doivent pas contenir l'emplacement de l'instance, qui dans le cas de l'article contient le numéro de version, mais plutôt un lien générique qui sera modifié. Ce lien est créé sous /var/opt/nexus/installed
.
#sudo ln -s /var/opt/nexus/2.11.4-01 /var/opt/nexus/installed #sudo chown -h nexus:nexus /var/opt/nexus/installed
Fichiers communs
Afin d'éviter la reprise des fichiers de paramétrages lors des montées de versions, les répertoires sont externalisés dans un répertoire /var/opt/nexus/common
dans lequel l’arborescence standard est reproduite pour plus de clarté :
-
bin/jsw/conf
contient les fichiers de configuration de démarrage; -
conf
contient les fichiers de configuration.
Dans un premier temps, les répertoires sont créés sous common
avec recopie des fichiers de l'instance.
#sudo mkdir -p /var/opt/nexus/common/bin/jsw/conf #sudo mkdir -p /var/opt/nexus/common/conf #sudo chown -R nexus:nexus /var/opt/nexus/common #sudo cp -p /var/opt/nexus/2.11.4-01/bin/jsw/conf/* /var/opt/nexus/common/bin/jsw/conf #sudo cp -p /var/opt/nexus/2.11.4-01/conf/* /var/opt/nexus/common/conf
Ces répertoires externalisés est ensuite liés dans la distribution.
#sudo rm -rf /var/opt/nexus/2.11.4-01/bin/jsw/conf #sudo ln -s /var/opt/nexus/common/bin/jsw/conf /var/opt/nexus/2.11.4-01/bin/jsw/conf #sudo chown -h nexus:nexus /var/opt/nexus/2.11.4-01/bin/jsw/conf #sudo rm -rf /var/opt/nexus/2.11.4-01/conf #sudo ln -s /var/opt/nexus/common/conf /var/opt/nexus/2.11.4-01/conf #sudo find /var/opt/nexus/common -type d -exec chmod 0700 {} \; #sudo find /var/opt/nexus/common -type f -exec chmod 0600 {} \; #sudo chown -h nexus:nexus /var/opt/nexus/2.11.4-01/conf
Les contenus des répertoires sont alors le suivant :
#sudo ll /var/opt/nexus/2.11.4-01 total 40 drwxr-xr-x 6 nexus nexus 4096 nov. 2 11:41 ./ drwxr-xr-x 5 nexus nexus 4096 nov. 1 12:15 ../ drwxr-xr-x 3 nexus nexus 4096 nov. 1 12:19 bin/ lrwxrwxrwx 1 nexus nexus 26 nov. 2 11:41 conf -> /var/opt/nexus/common/conf/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 lib/ -rw-r--r-- 1 nexus nexus 11006 sept. 17 21:33 LICENSE.txt lrwxrwxrwx 1 nexus nexus 14 nov. 1 12:26 logs -> /var/log/nexus/ drwxr-xr-x 4 nexus nexus 4096 nov. 1 12:10 nexus/ -rw-r--r-- 1 nexus nexus 782 sept. 17 21:33 NOTICE.txt drwxr-xr-x 4 nexus nexus 4096 nov. 2 11:31 tmp/ #sudo ll /var/opt/nexus/2.11.4-01/bin/jsw total 56 drwxr-xr-x 14 nexus nexus 4096 nov. 2 11:39 ./ drwxr-xr-x 3 nexus nexus 4096 nov. 1 12:19 ../ lrwxrwxrwx 1 nexus nexus 34 nov. 2 11:39 conf -> /var/opt/nexus/common/bin/jsw/conf/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 lib/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 license/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 linux-ppc-64/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 linux-x86-32/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 linux-x86-64/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 macosx-universal-32/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 macosx-universal-64/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 solaris-sparc-32/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 solaris-sparc-64/ drwxr-xr-x 3 nexus nexus 4096 nov. 1 12:10 solaris-x86-32/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 windows-x86-32/ drwxr-xr-x 2 nexus nexus 4096 nov. 1 12:10 windows-x86-64/
Fichiers log
Par défaut, les logs sont placés dans le répertoire logs
de l’instance Nexus :
- /var/opt/nexus/sonatype-work/nexus/logs/nexus.log
- /var/opt/nexus/sonatype-work/nexus/logs/request.log
- /var/opt/nexus/2.11.4-01/logs/wrapper.log
La définition de ces emplacements se situe dans différentes configurations.
- Fichier
/var/opt/nexus/2.11.4-01/conf/logback-access.xml
pour le fichier/var/opt/nexus/sonatype-work/nexus/logs/request.log
:
<appender name="request.logfile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${nexus-work}/logs/request.log</File>
<Append>true</Append>
<encoder class="org.sonatype.nexus.bootstrap.log.AccessPatternLayoutEncoder">
<pattern>%clientHost %l %user [%date] "%requestURL" %statusCode %bytesSent %elapsedTime</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${nexus-work}/logs/request-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
</appender>
<appender-ref ref="request.logfile"/>
- Fichier
/var/opt/nexus/2.11.4-01/bin/jsw/conf/wrapper.conf
pour le fichier/var/opt/nexus/2.11.4-01/logs/wrapper.log
:
# Set up JSW logging
wrapper.logfile=logs/wrapper.log
wrapper.logfile.format=PM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=10m
wrapper.logfile.maxfiles=10
Afin de centraliser les logs, les messages sont redirigés vers /var/log/nexus
en mettant en place des liens symboliques. Ceci permet de ne pas modifier les fichiers de configurations, limitant les modifications lors des futures montées de version.
#sudo mkdir -p /var/log/nexus #sudo chown nexus:adm /var/log/nexus #sudo rmdir /var/opt/nexus/2.11.4-01/logs #sudo ln -s /var/log/nexus /var/opt/nexus/2.11.4-01/logs #sudo chown -h nexus:nexus /var/opt/nexus/2.11.4-01/logs #sudo ln -s /var/log/nexus /var/opt/nexus/sonatype-work/nexus/logs #sudo chown -h nexus:nexus /var/opt/nexus/sonatype-work/nexus/logs
Variable système
L'application utilise une fonctionnalité propre à Java afin de stocker les préférences utilisateurs, ce qui s'effectue dans le répertoire Home de l'utilisateur. Comme le script est exécuté avec un compte technique, créé sans Home, le message d'erreur suivant est présent dans le fichier de log.
2015-07-28 14:54:11,192+0200 WARN [Timer-1] admin java.util.prefs - Could not lock User prefs. Unix error code 2. 2015-07-28 14:54:11,193+0200 WARN [Timer-1] admin java.util.prefs - Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
Un répertoire est alors créé pour être utilisé comme le home, sous /var/opt/nexus/sonatype-work
.
#sudo mkdir -p /var/opt/nexus/sonatype-work/home #sudo chown nexus:nexus /var/opt/nexus/sonatype-work/home
Puis, il faut modifier le fichier de paramétrage de l'application, qui a été externalisé sous /var/opt/nexus/common/bin/jsw/conf/wrapper.conf
, en ajoutant l’argument -Duser.home=/var/opt/nexus/sonatype-work/home
aux paramètres d'exécution.
# Additional JVM parameters (tune if needed, but match the sequence of numbers!)
wrapper.java.additional.1=-XX:MaxPermSize=192m
wrapper.java.additional.2=-Djava.io.tmpdir=./tmp
wrapper.java.additional.3=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.4=-Dcom.sun.jndi.ldap.connect.pool.protocol="plain ssl"
wrapper.java.additional.4.stripquotes=TRUE
#wrapper.java.additional.5=-Xdebug
#wrapper.java.additional.6=-Xnoagent
#wrapper.java.additional.7=-Djava.compiler=NONE
#wrapper.java.additional.8=-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#wrapper.java.additional.9=-XX:+HeapDumpOnOutOfMemoryError
wrapper.java.additional.5=-Duser.home=/var/opt/nexus/sonatype-work/home
Montées de version
Répertoire de travail
Nexus utilise le répertoire sonatype-work
pour son fonctionnement. Lors du déploiement sous Tomcat, celui-ci est placé dans le répertoire /usr/share/tomcat8/sonatype-work
. Le contenu est donc copié dans le nouvel emplacmeent, soit /var/opt/nexus/sonatype-work
, avec modification du propriétaire des fichiers.
#sudo cp -R /usr/share/tomcat8/sonatype-work/nexus/* /var/opt/nexus/sonatype-work/nexus/ #sudo chown -R nexus:nexus /var/opt/nexus/sonatype-work/nexus/*
Sécurisation / Configuration
Afin de sécuriser les accès, les permissions sur le répertoire de travail sont modifiées pour donner accès uniquement au compte d'exécution nexus
.
#sudo find /var/opt/nexus/sonatype-work -type f -exec chmod 0600 {} \; #sudo find /var/opt/nexus/sonatype-work -type d -exec chmod 0700 {} \;
Fichier logs
Les logs étaient créées avec le compte d'exécution de Tomcat, soit tomcat8
. L'exécution du service est exécuté à l'aide du compte nexus
et il est donc nécessaire de modifier les droits d'accès des fichiers.
#sudo chown -R nexus:nexus /var/log/nexus
Suppression anciens fichiers
Les précédentes installations étaient réalisées par un déploiement sous Tomcat. L'ancienne instance et l'espace de travail peuvent être supprimés suite à cette nouvelle organisation.
#sudo rm -rf /usr/share/tomcat8/sonatype-work #sudo rm -rf /var/lib/tomcat8/webapps/nexus #sudo rm -rf /var/lib/tomcat8/work/Catalina/localhost/nexus #sudo rm -rf /var/lib/tomcat8/work/Catalina/localhost/sonatype-work
Publication Apache
Les précédentes versions étaient déployées sur un serveur Tomcat et mis à disposition sous Apache. Or, l'instance étant déployée dans son propre serveur d'application, le numéro des port est spécifique, et historiquement placé à 8081
.
Dans le cadre de cette installation, l'instance est disponible sur cette machine avec la configuration Apache suivante.
ProxyPass /nexus http://localhost:8080/nexus
ProxyPassReverse /nexus http://localhost:8080/nexus
<Proxy http://localhost:8080/nexus>
Order allow,deny
Allow from all
</Proxy>
Or avec cette nouvelle installation, l'instance est à présente indépendante et la configuration Apache devient :
ProxyPass /nexus http://localhost:8081/nexus
ProxyPassReverse /nexus http://localhost:8081/nexus
<Proxy http://localhost:8081/nexus>
Order allow,deny
Allow from all
</Proxy>
Installation service
Service init.d
Historiquement, les services Linux sont déclarés dans le répertoire /etc/init.d
. Il suffit de créer le fichier /etc/init.d/nexus
pour référencer Nexus
en tant que service, avec le contenu suivant.
#!/bin/sh
#
# rc file for Nexus
#
# chkconfig: 345 96 10
# description: Nexus system (www.sonatype.org/nexus/)
#
### BEGIN INIT INFO
# Provides: nexus
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Nexus
# Description: Nexus system (www.sonatype.org/nexus/)
### END INIT INFO
/var/opt/nexus/installed/bin/nexus $*
exit $?
Le fichier doit être exécutable.
#sudo chmod 755 /etc/init.d/nexus
Le service est installé avec les paramètres par défaut.
#sudo update-rc.d nexus defaults
L’utilisation de systemd nécessite de recharger les configurations générées.
#sudo systemctl daemon-reload
Attention, en utilisant ce principe, il faut modifier le script de démarrage afin d'indiquer le compte d'exécution. De plus, une modification est réalisée pour s'assurer que le répertoire /run/nexus
est disponible lors du démarrage. Le fichier /var/opt/nexus/installed/bin/nexus
est modifié ainsi.
# NOTE - This will set the user which is used to run the Wrapper as well as
# the JVM and is not useful in situations where a privileged resource or
# port needs to be allocated prior to the user being changed.
#RUN_AS_USER=
RUN_AS_USER=nexus
# Application
APP_NAME="nexus"
APP_LONG_NAME="Nexus OSS"
# Priority at which to run the wrapper. See "man nice" for valid priorities.
# nice is only used if a priority is specified.
PRIORITY=
# Location of the pid file.
#PIDDIR="."
PIDDIR="/run/nexus"
if [ ! -d "$PIDDIR" ]; then
mkdir -p "$PIDDIR"
[ -z "$RUN_AS_USER" ] || chown "$RUN_AS_USER:$RUN_AS_USER" "$PIDDIR"
fi
Service systemd
Le système init.d
est progressivement remplacé par l’outil systemd qui utilise un autre système de configuration. Il suffit de créer le fichier /lib/systemd/system/nexus.service
avec le contenu suivant.
[Unit]
Description=Nexus
[Service]
RuntimeDirectory=nexus
Type=forking
User=nexus
Group=nexus
ExecStart=/var/opt/nexus/installed/bin/nexus start
ExecStop=/var/opt/nexus/installed/bin/nexus stop
ExecReload=/var/opt/nexus/installed/bin/nexus restart
PIDFile=/run/nexus/nexus.pid
Restart=always
[Install]
WantedBy=multi-user.target
Avec l'utilisation du Java Service Wrapper
, un sous processus est démarré. Le script nexus
se termine après exécution. Donc il est important de spécifier la valeur forking
dans le paramètre Type
. Ainsi systemd
ne considérera pas que le service s'est arrêté.
Avec le type forking
, il est généralement conseillé d'indiquer l'emplacement du fichier PID
, qui est configuré dans la variable PIDFile
. Attention, cet emplacement doit être en accord avec la configuration de PIDDIR
dans le script de démarrage.
Afin d'être homogène avec une plateforme Linux
, le répertoire pour le fichier PID
est spécifié à /run/nexus
dans le fichier /var/opt/nexus/installed/bin/nexus
.
# Location of the pid file.
#PIDDIR="."
PIDDIR="/run/nexus"
Contrairement à la méthode avec init.d
, il n'est pas nécessaire de s'assurer de l'existance du répertoire. En effet, la valeur nexus
de la variable RuntimeDirectory
, dans la configuration du service, indique à systemd
de s'en assurer.
Il est nécessaire de recharger les configurations générées.
#sudo systemctl daemon-reload
Puis le service doit être activé.
#sudo systemctl enable nexus Created symlink /etc/systemd/system/multi-user.target.wants/nexus.service → /lib/systemd/system/nexus.service.
Stratégie de Backup
La stratégie de backup est revue afin de prendre en compte la nouvelle organisation. Sur les précédentes versions, les répertoires et fichiers sauvegardés étaient les suivants:
-
/var/opt/nexus
-
/var/lib/tomcat7/webapps/nexus
-
/usr/share/tomcat7/sonatype-work
-
/etc/apache2/httpd.conf
Ils sont à présents moins nombreux :
-
/var/opt/nexus
-
/etc/apache2/httpd.conf
La mise en place de cette sauvegarde est explicitée ici.