Zum Hauptinhalt springen

Verwalten von Tomcat 8 + 9 Instanzen

Tomcat ist ein Anwendungsserver zum Ausführen von Java-Anwendungen.

Mit unserem Tomcat Service erhalten Sie eine Tomcat 8 / 9 Installation, die direkt vom Benutzer www-data verwaltet werden kann. Das bedeutet mehr Flexibilität bei der Konfiguration der Instanzen.

Schritt-für-Schritt Anleitung

Sie können diesen Abschnitt überspringen, wenn Sie von einer Tomcat 6 Lösung migriert haben.

In diesem Abschnitt führen wir Sie durch den Prozess der Einrichtung Ihrer eigenen Tomcat-Instanz mit einem Reverse-Proxy.

Anforderungen

  • Ubuntu 16.04 (Xenial) oder 18.04 Bionic (tomcat9)
  • Tomcat 8 oder Tomcat 9 durch uns auf Ihrem Server installiert ()
  • nine-manage-vhosts auf dem Server installiert

Erstellen einer Tomcat-Instanz

Wir verwenden das Tool tomcat8-instance-create oder tomcat9-instance-create (offizielle tomcat8 Dokumentation) oder (offizielle tomcat9 Dokumentation), um Tomcat-Instanzen zu erstellen. Einige Parameter sollten übergeben werden:

  • HTTP-Port (standardmässig 8080)
  • Control Port (standardmässig 8005)

Mit dem folgenden Befehl wird eine Tomcat-Instanz im Ordner ~/test-server.ch auf dem Port 8081 mit dem Control-Port 8006 erstellt:

tomcat8-instance-create -p 8081 -c 8006 ~/test-server.ch
tomcat9-instance-create -p 8081 -c 8006 ~/test-server.ch

Wenn Sie mehrere Tomcat-Instanzen erstellen, müssen Sie sicherstellen, dass der HTTP-Port und der Control-Port eindeutig sind.

Tomcat-Instanz mit einem Reverse-Proxy für die Aussenwelt zugänglich machen

Tomcat hört standardmässig auf localhost. Es ist üblich, einen Reverse-Proxy vor Tomcat zu platzieren. Wir verwenden nine-manage-vhosts, um diesen Reverse-Proxy zu erstellen.

Mit dem folgenden Befehl wird ein Virtual Host namens 'test-server.ch' erstellt, der den gesamten Traffic an die Tomcat-Instanz auf Port 8081 weiterleitet:

sudo nine-manage-vhosts virtual-host create test-server.ch --template=proxy --template-variable PROXYPORT=8081

Das proxy-Template geht davon aus, dass sich alle Tomcat-Instanzen unter /home/www-data/<domain-name> befinden.

Wenn ein Let's Encrypt Zertifikat und https verwendet werden soll, sollte das Template proxy_letsencrypt_https verwendet werden.

Nur in Kombination mit Apache notwendig: Um automatisch von http nach https zu redirecten (mit Let's Encrypt Zertifikat), können Sie das Template proxy_letsencrypt_https_redirect verwenden.

Starten der Tomcat-Instanz beim Systemstart

Für das Starten/Stoppen der Tomcat-Instanzen stellen wir ein systemd-Template bereit.

Mit dem folgenden Befehl wird die Instanz als Dienst konfiguriert:

systemctl --user enable user-tomcat@test-server.ch

Die folgenden Befehle starten/stoppen die Tomcat-Instanz mit dem Namen test-server.ch:

systemctl --user start user-tomcat@test-server.ch
systemctl --user stop user-tomcat@test-server.ch

Um den aktuellen Status der Tomcat-Instanz zu überprüfen, können Sie den folgenden Befehl verwenden:

systemctl --user status user-tomcat@test-server.ch

Der erste Teil des Dienstnamens ist unverändert: "user-tomcat@". Nach dem @ wird jeweils der Name der Tomcat-Instanz übergeben.

Weitere Informationen zur Verwaltung von Diensten mit systemd finden Sie in diesem Artikel.

Zusammenfassung

Mit den folgenden Kommandos wird eine Tomcat-Installation unter http://test-server.ch eingerichtet:

# Tomcat-Instanz erstellen, erreichbar unter http://localhost:8081
tomcat8-instance-create -p 8081 -c 8006 ~/test-server.ch

# VHost mit Reverse-Proxy einrichten, damit die Instanz von aussen zugänglich ist
sudo nine-manage-vhosts virtual-host create test-server.ch --template=proxy --template-variable PROXYPORT=8081

# Applikation bereitstellen (siehe unten).
[...]

# Service für die Instanz erstellen
systemctl --user enable user-tomcat@test-server.ch

# Tomcat-Instanz starten
systemctl --user start user-tomcat@test-server.ch

Bereitstellen Ihrer Anwendung

In diesem Abschnitt werden Sie Ihre Java-Anwendung für die Tomcat-Instanz bereitstellen. Im Folgenden finden Sie ein paar Dinge, die Sie über den Deploymentprozess wissen sollten:

Anwendungsformat

Eine Anwendung hat in der Regel die Form einer .war oder .jar Datei.

Wo kommt die Anwendung hin?

Die Anwendung muss nach /home/www-data/ROOT kopiert werden.

Es gibt auch die Möglichkeit, mehrere Applikationen unter einem Virtual Host zu betreiben. Dazu muss jede Applikation in einem separaten Ordner unter /home/www-data/<Instanzname>/webapps/ abgelegt werden. Die Applikationen sind dann unter "http://servername.com/name_des_ordners_in_webapps/" zugänglich.

Deployment-Beispiel

Nehmen wir an, wir haben die gleiche Tomcat-Instanz wie zuvor: test-server.ch.

Wir wollen unsere Applikation test-application deployen, die wir derzeit als WAR-Datei haben: test-application.war.

cp test-application.war /home/www-data/test-server.ch/webapps/

# Tomcat extrahiert diese dann in den Ordner "test-application":
# /home/www-data/test-server.ch/webapps/test-application

Die Anwendung ist nun unter http://test-server.ch/test-application zugänglich. Die Log-Dateien befindet sich unter /home/www-data/test-server.ch/logs/catalina.out.

Logging

Wenn Ihre Anwendungen nach stdout loggen, wird nach /home/www-data/<Instanzname>/logs/catalina.out geschrieben.

Bitte denken Sie daran, dass Ihr catalina.out mit dieser Methode sehr schnell wächst und dass wir [empfehlen, ein Protokollierungsprogramm anstelle der Standardausgabe zu verwenden](https://wiki.apache.org/tomcat/FAQ / Protokollierung#Q5).

Falls Sie trotzdem STDOUT in Ihrer Anwendung für das Logging verwenden möchten, ist folgendes zu beachten:

  1. Deaktivieren Sie die Protokollrotation in Tomcat, da es die Protokolle nicht ordnungsgemäss rotiert. Dies kann durch Bearbeiten der Datei conf/logging.properties erfolgen, indem folgende Zeilen hinzugefügt werden:
1catalina.org.apache.juli.FileHandler.rotable = false
2localhost.org.apache.juli.FileHandler.rotable = false
  1. Konfigurieren Sie die Protokollrotation mit logrotate.

Zusätzliche Informationen

Weitere Informationen zum Deployment finden Sie in der offiziellen Dokumentation.

Erweiterte Konfiguration

Da die Tomcat-Instanzen von www-data verwaltet werden, können Sie die gesamte Konfiguration ohne Verwendung von sudo oder Hilfe von Nine vornehmen (siehe offizielle tomcat8 Dokumentation oder offizielle tomcat9 Dokumentation als Referenz).

Wir möchten an dieser Stelle einige Tipps für die Konfiguration mit Umgebungsvariablen zeigen.

Umgebungsvariablen

Einige Teile des Verhaltens von Tomcat können durch das Setzen von Umgebungsvariablen in der Datei ~/<Instanzname>/bin/setenv.sh gesteuert werden.

Im Folgenden finden Sie einige Beispiele dafür, was mit ihnen geändert werden kann:

Andere Java-Version auswählen

Fügen Sie der Datei setenv.sh folgendes hinzu und starten Sie die Instanz neu, um die Java-Version zu wechseln:

JAVA_HOME=/opt/java/production

Ändern der Protokolldatei

Fügen Sie der Datei setenv.sh folgendes hinzu und starten Sie die Instanz neu, um sich in einer anderen Datei anzumelden:

CATALINA_OUT=logs/custom.out

Ändern der maximalen Speichermenge

Das Skript tomcat8-instance-create setzt in setenv.sh einen Standardwert von 128MB für eine Instanz. Ersetzen Sie einfach die 128MB mit dem Wert Ihrer Wahl (muss ein Vielfaches von 1024 grösser als 2 MB).

So könnte beispielsweise die Instanz maximal 512 MB Arbeitsspeicher verwenden:

if [ -z "$JAVA_OPTS" ]; then
JAVA_OPTS="-Djava.awt.headless=true -Xmx512M"
fi

systemd-Einstellungen

Einige Parameter können nicht von Tomcat eingestellt werden, sondern müssen von systemd gesetzt werden. Diese Einstellungen können durch so genannte systemd drop-ins geändert werden.

Sie können entweder für alle Instanzen eines Benutzers oder für eine spezifische Instanz gesetzt werden.

Um die Konfiguration für alle Instanzen zu ändern, platzieren Sie die Datei in

~/.config/systemd/user/user-tomcat@.service.d

Um nur eine einzelne Instanz zu ändern, platzieren Sie die Datei in

~/.config/systemd/user/user-tomcat@<instance-name>.service.d

Um beispielsweise den Höchstwert Max Open Files festzulegen, legen Sie diese Datei in einen der oben genannten Ordner:

# nofiles.conf

[Service]
LimitNOFILE=2048