Installare Tomcat 9 su Debian 10 (Buster)

Apache Tomcat è un server web che funge da servlet container per fornire accesso ad applicazioni servlet, ovvero applicazioni Java lato server.

Sebbene Tomcat 9 sia già disponibile come pacchetto nei repository Debian, in questo articolo voglio mostrare come sia possibile installarlo tramite la distribuzione fornita dalla Apache Foundation, usando la JDK di Oracle invece di OpenJDK.

Oracle JDK

L’installazione del JDK è relativamente semplice; è sufficiente scaricare dal sito Oracle il pacchetto jdk-8u241-linux-x64.tar.gz, scompattarlo nella directory desiderata e poi valorizzare nel proprio profilo bash (o in quello di sistema) la variabile d’ambiente JAVA_HOME. Nel mio caso, ho scompattato il JDK nella directory /opt e successivamente ho creato il link simbolico /opt/jdk8 che punta alla directory /opt/jdk1.8.0_241. Alla variabile JAVA_HOME, definita nel file /root/.bashrc, ho quindi assegnato il valore /opt/jdk8.

Attenzione: per scaricare il JDK è necessario avere un account sul sito Oracle, oppure crearne uno nuovo.

Apache Tomcat 9

L’installazione di Tomcat sul sistema è praticamente identica a quella del JDK. Bisogna innanzitutto scaricare l’archivio contenente il software dal sito di Tomcat; il link diretto è il seguente: https://apache.panu.it/tomcat/tomcat-9/v9.0.33/bin/apache-tomcat-9.0.33.tar.gz

Anche in questo caso ho estratto l’archivio nella directory /opt e successivamente ho creato il link simbolico /opt/tomcat9 che punta a /opt/apache-tomcat-9.0.33.

Avviare/arrestare Tomcat manualmente

Per avviare Tomcat manualmente dalla riga di comando è sufficiente invocare lo script /opt/tomcat9/bin/startup.sh; per fermarlo, basta invocare /opt/tomcat9/bin/shutdown.sh.

/opt/tomcat9/bin# ./startup.sh
 Using CATALINA_BASE:   /opt/tomcat9
 Using CATALINA_HOME:   /opt/tomcat9
 Using CATALINA_TMPDIR: /opt/tomcat9/temp
 Using JRE_HOME:        /opt/jdk8
 Using CLASSPATH:       /opt/tomcat9/bin/bootstrap.jar:/opt/tomcat9/bin/tomcat-juli.jar
 Tomcat started.

In questo modo Tomcat viene avviato con la configurazione predefinita, e sarà accessibile via web all’indirizzo: http://<server_ip>:8080.

Come si vede, dato che Tomcat di default si mette in ascolto su una porta non privilegiata (8080/tcp), è un buon candidato ad essere eseguito con minori privilegi rispetto all’utente root. Nella unit systemd che avvia il servizio mostrerò come far eseguire il servizio con un utente di sistema non privilegiato.

Avviare/arrestare Tomcat con systemd

Per evitare di avviare ed arrestare il servizio Tomcat manualmente o tramite degli script custom poco flessibili, possiamo avvalerci di una service unit systemd dedicata. Sulla rete si trovano molti esempi che mostrano come configurare una tale service unit, definendo al suo interno tutte le variabili di cui necessita Tomcat, oltre ai nomi di utente e gruppo con cui eseguire il servizio.

Il posto più corretto dove mettere il file che costituisce la service unit è la directory /etc/systemd/system; qui dentro iniziamo a scrivere la nostra unit, che chiamiamo tomcat.service:

[Unit]
 Description=Tomcat Application Server
 After=syslog.target network.target
[Service]
 Type=forking
 Environment=JAVA_HOME=/opt/jdk8
 Environment=CATALINA_BASE=/opt/tomcat9
 Environment=CATALINA_HOME=/opt/tomcat9
 Environment=CATALINA_TMPDIR=/opt/tomcat9/temp
 Environment=CATALINA_PID=/opt/tomcat9/temp/tomcat.pid
 Environment=CLASSPATH=/opt/tomcat9/bin/bootstrap.jar:/opt/tomcat9/bin/tomcat-juli.jar
 ExecStart=/opt/tomcat9/bin/startup.sh
 ExecStop=/opt/tomcat9/bin/shutdown.sh
 User=tomcat
 Group=tomcat
[Install]
 WantedBy=multi-user.target

Ovviamente l’utente tomcat deve essere presente sul sistema. Se non c’è, possiamo crearlo:

adduser --system --home /opt/tomcat9 --no-create-home --group tomcat

Dopo aver creato questa service unit, aggiorniamo systemd e proviamo ad avviare Tomcat:

systemctl daemon-reload
systemctl start tomcat.service

Molto probabilmente si riscontreranno degli errori dovuti ai permessi sui file/directory. Sistemiamo questi permessi:

chown -R tomcat.tomcat /opt/tomcat9
rm /opt/tomcat9/logs/*

I permessi impostati nella maniera precedente non rappresentano la soluzione ottimale; per maggiori informazioni, potete cosultare il security-howto sul sito di Tomcat.

Quella appena definita è una service unit piuttosto semplificata, senza particolari customizzazioni. Un esempio più complesso che fa uso di service template per avviare istanze multiple di Tomcat lo trovate su GitHub a questo indirizzo: https://gist.github.com/drmalex07/e6e99dad070a78d5dab24ff3ae032ed1

Accesso a Tomcat Manager

Ora che possiamo accedere via web alla console di Tomcat, è il caso di vedere anche come poter gestire l’application server direttamente dal browser usando la “Manager App”. A tal fine è prima necessario modificare leggermente la configurazione di Tomcat definendo un utente al quale assegnare il ruolo manager-gui. Per farlo bisogna modificare il file /opt/tomcat9/conf/tomcat-users.xml aggiungendo almeno le seguenti righe prima del tag di chiusura del file:

<role rolename="manager-gui"/>
<user username="tomcat-manager" password="tomcat-password" roles="manager-gui"/>

Nome utente e password sono ovviamente arbitrari. Inoltre, siccome per impostazione predefinita l’accesso all’applicazione Manager è consentito soltanto dalla stessa macchina che esegue il servizio, qualora si volesse accedere da un host differente bisogna anche impostare un file che regola l’accesso da altre macchine; in questo caso il file da creare/modificare è /opt/tomcat9/conf/Catalina/localhost/manager.xml. Per consentire l’accesso da qualsiasi host, all’interno di questo file si può riportare il seguente contenuto:

<Context privileged="true" antiResourceLocking="false"           docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>

Attenzione! La configurazione precedente rappresenta una scelta non raccomandata, soprattutto se si accede alla Manager App da un host remoto senza utilizzare una connessione protetta da SSL. Usatela solo se sapete cosa state facendo!

Dopo la modifica, è necessario riavviare il servizio: systemctl restart tomcat.

Leave a Reply

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.