Installation und Einrichtung von
Tomcat
Tomcat aus Linux Distributionen
Da die Versionsnummern des Tomcat nicht immer zu SuperX passen, können Sie einen eigenen Tomcat bzw. den im SuperX Kernmodul mitgelieferten Tomcat nutzen. Auch wenn Sie mehrere Tomcats auf einem Server betreiben kann es sinnvoll sein, Tomcat manuell zu installieren.
Der Betrieb von Tomcat aus der jew. Linux Distribution hat jedoch den Vorteil, dass man
- benötigte Drittsoftware direkt mitinstallieren kann
- die Apache Integration erfahrungsgemäß einfacher ist
- Regelmäßige Bugfixes automatisch beziehen kann
- Tomcat wird i.d.R.automatisch für systemd als Dienst konfiguriert, mit einer speziellen Kennung für den Systemuser.
Wir empfehlen daher die Distribution.
Tomcat aus der Ubuntu-Distribution
Im folgenden wird das Vorgehen für Ubuntu Linux beschrieben. Hier wird das Kernmodul 5.0 mit Tomcat9 unter Ubuntu 22.04 eingerichtet. Zunächst wechseln sie in die root-Shell mit
sudo -i
- Java 11 und Tomcat9 installieren:
apt-get install openjdk-11-jdk tomcat9
und direkt stoppen mit
systemctl stop tomcat9.service
Zur Sicherheit alte kompilierte Klassen löschen: rm -r /var/lib/tomcat9/work/*
- Dann die superx-webapp kopieren nach /var/lib/tomcat9/webapps, und den user tomcat zum Eigentümer machen:
chown -R tomcat:tomcat /var/lib/tomcat9/webapps/
In der Datei
/etc/tomcat9/server.xml
beim jew. Connector port="...." das Attribut
URIEncoding="UTF-8"
ergänzen, also z.B.
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
Wenn Sie den Apache über mod_jk anbinden, müssen Sie den Konnektor "AJP1.3" einschalten:
<Connector protocol="AJP/1.3"
secretRequired="true"
secret="anfang12"
port="8009"
redirectPort="8443" URIEncoding="UTF-8" />
Das Attribut secret wird im Apache-seitig in der workers.properties gesetzt.
Dann in der /etc/default/tomcat die Zeilen
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 JAVA_OPTS="-Djava.awt.headless=true -DSuperX-DB-PROPERTIES-SET=true -Xmx3700M"
eintragen (der letzte RAM Parameter ist nur ein Beispiel).
Dann in der Datei
/usr/lib/systemd/system/tomcat9.service
die Zeile
EnvironmentFile=/etc/default/tomcat9
ergänzen Dann führen Sie aus:
systemctl daemon-reload
und starten Tomcat mit:
systemctl start tomcat9.service
Danach können Sie den Zugriff im Browser testen, beim Port 8080 z.B.
Wenn Sie Tomcat jeden morgen automatisch neu starten wollen können Sie für den User root einen cronjob einrichten:
30 4 * * * /bin/systemctl try-restart tomcat9
Tomcat unter SuSE Linux
Sie installieren Tomcat aus der Distribution mit
zypper -n in -l tomcat
Bei Suse Linux wird der interne Tomcat unter /usr/share/java/tomcat installiert, die Konfiguration liegt in /etc/tomcat Wenn Sie diesen Tomcat nutzen möchten, sollten Sie die komplette SuperX Installation unter dem Tomcat Benutzer welcher von Suse angelegt wurde (tomcat) durchführen. Zuerst muss der Tomcatuser Shell-Rechte bekommen. Dazu editieren Sie als root die /etc/passwd und geben in der Zeile vom Tomcatuser am Ende /bin/bash ein. Danach können Sie ggf. das Verzeichnis /usr/share/tomcat/superx anlegen und dort die Dateien des alten $SUPERX_DIR hinkopieren. Dementsprechend auch in der SQL_ENV das $SUPERX_DIR auf /usr/share/tomcat/superx setzen. Die Dateirechte müssen dem Tomcatuser zugeteilt werden. Es ist auch sinnvoll für den Tomcatuser die Dateien wie .bashrc und .profile und Ordner .ssh anzulegen und rechte auf tomcat:tomcat zu geben. Damit können Sie dann aliases wie ll vergeben und auch bei login automatisch die SQL_ENV laden. Jetzt melden Sie sich mit der TomcatKennung an. Nun müssen wir die SuperX-Webanwendung in den Suse-Tomcat integrieren, d.h. der im Kernmodul mitgelieferte Tomcat wird gar nicht benutzt, aber den webapps-Ordner darin schon. Wenn SuperX nun unter /usr/share/tomcat/superx liegt, und das Kernmodul hier entpackt wird, liegt die Webanwendung in /usr/share/tomcat/superx/webserver/tomcat/webapps. Diesen Pfad tragen Sie in der /etc/tomcat/server.xml ein:
<Host name="localhost" appBase="/usr/share/tomcat/superx/webserver/tomcat/webapps"
unpackWARs="true" autoDeploy="true">
Weiter oben setzen Sie bei Betrieb in UTF-8 noch das URIEncoding="UTF-8":
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
und ggf. auch
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
Damit ist der UbuntuTomcat in SuperX integriert. Beispiel-Befehle für Tomcat: Starten:
rctomcat start
Stoppen:
rctomcat stop
Neustarten:
rctomcat restart
Und die Logdateien liegen hier: /var/log/tomcat/* Damit der Server beim Booten hochfährt, geben Sie ein:
chkconfig --set tomcat on
Variablen wie CATALINA_OPTS setzen Sie hier: /etc/sysconfig/tomcat z.B.
CATALINA_OPTS="-DSuperX-DB-PROPERTIES-SET=true -Xmx4700M -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false "
Tomcat aus der Distribution mit abweichender Userkennung oder anderem webapps-Verzeichnis
Wenn Sie Tomcat aus der Distribution nutzen, läuft der Dienst unter der Kennung "tomcat", und das webapps-Verzeichnis liegt in /var/lib/tomcat9.
![]() |
Standardmäßig hat der User des Tomcat-Dienstes keine Login-Shell. Dies ist eine Sicherheitsvorkehrung, die vom BSI empfohlen wird. |
Sie können das Verzeichnis der Webanwendung/en auch verschieben, indem sie in der Datei /etc/tomcat9/server.xml beim Element "host" das Attribut "appBase" anpassen. Die Auslieferung ist
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false">
stattdessen könnten Sie z.B. schreiben
<Host name="localhost" appBase=" /home/superx/webserver/tomcat/webapps"
unpackWARs="true" autoDeploy="false">
Achtung: Der Tomcat-Dienst der Distribution muss unter der Kennung "tomcat" laufen. Wenn Sie für SuperX z.B. mit der Kennung "superx" arbeiten und den webapps-Ordner z.B. in /home/superx/webserver/tomcat/webapps nutzen, müssen Sie
- Den User superx der Gruppe tomcat hinzufügen:
usermod -G tomcat -a superx
- Die Eigentümerschaft des webapps-Ordner auf die Gruppe "tomcat" ändern:
chown -R superx:tomcat /home/superx/webserver/tomcat/webapps
- Speziell im Ordner WEB-INF/logs benötigt die Gruppe tomcat auch Schreibrecht:
chmod -R g+rw /home/superx/webserver/tomcat/webapps/superx/WEB-INF/logs
Wenn Sie als User superx neue Dateien anlegen müssen Sie die obigen Kommandos wiederholen, damit Tomcat Schreibrecht bekommt. Ggf. automatisieren Sie dies mit einem Cronjob. Alternativ tragen Sie in der Shell (z.B. in der Datei ~/.bashrc) das Kommando ein:
#Full access to user and group, none for others: umask u=rwx,g=rwx,o=
Damit haben neue Dateien direkt die Gruppenrechte, die Tomcat benötigt.
Beachten Sie bitte auch die Hinweise für Tomcat und Kettle.
Tomcat und Kettle
Sie sollten im Homeverzeichnis des Users, der den Tomcat startet, den Ordner ".kettle" anlegen, mit der Datei "kettle.properties". Diese Datei kann auch leer sein. Als root z.B. für Ubuntu 2022.04:
mkdir /var/lib/tomcat9/.kettle chown tomcat:tomcat /var/lib/tomcat9/.kettle touch /var/lib/tomcat9/.kettle/kettle.properties chown tomcat:tomcat /var/lib/tomcat9/.kettle/kettle.properties
![]() |
Das Homeverzeichnis des Users "tomcat" liegt bei Ubuntu 2020.04 standardmäßig in "/", das sollten Sie in der /etc/passwd ändern nach /var/lib/tomcat9. In Ubuntu Linux 2022.04 ist das Problem behoben. |
Tomcat manuell installieren
Sie können auch spezielle Versionen von Tomcat herunterladen und installieren. Oder sie laden das SuperX-Kernmodul Paket herunter, da ist ein aktueller Tomcat bereits enthalten. Speicherort wäre z.B. in /home/superx/webserver/tomcat.
Tomcat als Dienst
Damit Tomcat bei Systemstart automatisch hochfährt, und beim Herunterfahren kontrolliert gestoppt wird, muss man einen Dienst anlegen. In modernen Linuxen geht das mit dem Tool "systemd", was wiederum kontrolliert wird durch den Kommandozeilen Befehl "systemctl".
Damit dieser als Dienst läuft, muss man Linux wie folgt konfigurieren: Nehmen wir als Beispiel, dass das Kernmodul unter /home/superx liegt und Tomcat vom User superx gestartet wird.
Service-Scripte
Zunächst legen wir als User superx im Verzeichnis tomcat/bin zwei Dateien an:
startup_service.x
# # Startup script for Apache Tomcat with systemd # set -e # Load the service settings . /home/superx/db/bin/SQL_ENV CATALINA_BASE=/home/superx/webserver/tomcat CATALINA_HOME=/home/superx/webserver/tomcat CATALINA_TMPDIR=/home/superx/webserver/tomcat/temp # Start Tomcat cd $CATALINA_BASE && exec $CATALINA_HOME/bin/catalina.sh run
und shutdown_service.x:
# Shutdown script for Apache Tomcat with systemd # set -e # Load the service settings . /home/superx/db/bin/SQL_ENV CATALINA_BASE=/home/superx/webserver/tomcat CATALINA_HOME=/home/superx/webserver/tomcat CATALINA_TMPDIR=/home/superx/webserver/tomcat/temp # Stop Tomcat cd $CATALINA_BASE && exec $CATALINA_HOME/bin/catalina.sh stop
In der Datei SQL_ENV muss dann noch der Ordner /usr/bin in den PATH aufgenommen werden. Daher am besten am Anfang die Zeilen
PATH=$PATH:/usr/bin export PATH
setzen. Außerdem muss im Kopf der SQL_ENV
#!/bin/bash
stehen, damit die Bash genommen wird.
Dienst einrichten
Legen Sie als User root die Datei /etc/systemd/system/tomcat_superx.service an, mit dem Inhalt:
[Unit] Description=Tomcat SuperX After=syslog.target After=network.target After=postgresql.service [Service] RestartSec=2s Type=simple User=superx Group=users WorkingDirectory=/home/superx/webserver/tomcat/bin ExecStart=/bin/bash /home/superx/webserver/tomcat/bin/startup_service.x ExecStop=/bin/bash /home/superx/webserver/tomcat/bin/shutdown_service.x EnvironmentFile=/home/superx/db/bin/SQL_ENV [Install] WantedBy=multi-user.target
Den Dienst aktivieren Sie dann mit
systemctl enable tomcat_superx
und starten ihn dann mit
systemctl start tomcat_superx
Bei Problemen kann man die Fehlerausgabe anzeigen:
journalctl -xe
Für die Logmeldungen nur des einen Dienstes (und diese dann "rückwärts" lesen) geben Sie ein:
journalctl -u tomcat_superx -r
Wenn man die .service-Datei ändert, muss man die Dienste neu laden:
systemctl daemon-reload
Alle Dienste anzeigen können Sie mit
service --status-all
Den Dienst deaktivieren Sie mit
systemctl disable tomcat_superx
![]() |
Ein Fallstrick: ein Dienst kann Probleme machen, wenn die SQL_ENV zu komplexe Bash-Kommandos enthält. In diesem Falle müssen Sie eine abgespeckte TOMCAT_ENV erstellen, die nur die Variablen zuweist. |
Wenn Sie Tomcat jeden Morgen automatisch neu starten wollen können Sie einen Cronjob des Users root einrichten:
30 4 * * * /bin/systemctl try-restart tomcat_superx
Tomcat Logging
Tomcat Logging mit systemd
Normalerweise loggt Tomcat in das Verzeichnis
$CATALINA_BASE/logs/catalina.out
Ab Tomcat 9 aus der Linux Distribtion mit systemd als Service-Script gibt es diese Datei nicht mehr, die Logausgabe geht direkt ins Systemprotokoll. Dies müsssen Sie mit dem Kommando
journalctl
Das Kommando kann auch auf Fehler filtern:
journalctl -xe
Sie können die Logmeldungen auch auf den Dienst tomcat9 einschränken, und dabei "rückwärts" lesen:
journalctl -u tomcat9 -r
Mit folgendem Kommando können Sie die Logdatei rückwärts abfragen und Zeiträume eingrenzen, z.B.:
journalctl -rb --since="today" --until="2020-08-19 10:00:00"
Weitere Details siehe manpage.
![]() |
Wir finden das unpraktisch. Ab SuperX 5.1 bzw. HISinOne-BI 2023.12 wird die Logausgabe nicht mehr in system-log geschrieben, sondern in die Datei CATALINA_BASE/logs/superx.log |
Apache Anbindung
In Systemumgebungen, in denen bereits ein Webserver wie Apache läuft, bietet es sich an, den SuperX-Tomcat mit dem Webserver zu verbinden. Der Webserver kann so konfiguriert werden, dass Aufrufe zu http://<<Servername>>/superx direkt an Tomcat weitergeleitet werden können. Dies hat auch den Vorteil, dass die ungewöhnlichen Ports von Tomcat (8080 bzw. 8443) nicht in der Firewall freigegeben werden müssen. Außerdem kann die Verschlüsselung vom Apache durchgeführt werden, und es kann ein Load-Balaning eingeführt werden (Lastausgleich zwischen 2 Tomcat-Servern, gesteuert vom Apache). Wir empfehlen daher generell die Anbindung von Tomcat an den Apache für einen Produktivbetrieb. Für die Anbindung gibt es zwei Apache-Module bzw. Möglichkeiten:
- ProxyPass
- Mod-JK
ProxyPass
Unter Red Hat kann es mit der bisherigen empfohlenen Anbindungsmethode ‘mod_jk’ schwierigkeiten geben. Mit ProxPass hat es gut funktioniert und die Konfiguration war wesentlich einfacher. Das Modul ‘ProxyPass’ muss installiert und im Apache aktiviert / geladen werden. Danach muss in der Apache Konfiguration folgende Zeile für den AJP Konnector ergänzt werden : ProxyPass "/superx" "ajp://<<TOMCAT_IP>>:8009/superx" Falls die Verbindung zu dem Tomcat über den Standard-Port laufen soll wird folgende Zeile benötigt: ProxyPass "/superx" "https://<<TOMCAT_IP>>:8443/superx" Das war schon alles. Eine Empfehlung können wir mangels fehlender Erfahrung noch nicht geben.
Mod-JK
Das Apache Modul mod_jk ist schon sehr lange im Einsatz und über die jew. Linux Distribution relativ leicht installierbar. Man kann es aber auch manuell installieren. "JK" steht übrigens für "Jakarta", das ist der ursprüngliche Name des Apache-Produkts für Java-basierte Webanwendungen, also gewissermaßen der Vorläufer von Tomcat. Im folgenden beschreiben wir die Installation, und danach die Einrichtung.
Mod-JK unter Ubuntu Linux
Bei Debian / Ubuntu wird das Paket installiert mit
apt-get install libapache2-mod-jk
Danach muss man es noch aktivieren mit
a2enmod jk
Danach ist das Modul im Apache verfügbar.
Mod-JK unter SuSE Linux
Bei Suse wird das Paket installiert mit
zypper -n in -l apache2-mod_jk
Die Konfiguration kann man in /etc/tomcat/conf.d ablegen, also z.B. die Datei superx_mod_jk.conf.(s.u.).
Einrichtung Mod-JK im mit SuperX ausgelieferten Tomcat
Nun kann die Konfiguration des Mod-JK beginnen, was im folgenden Kapitel beschrieben ist. In der SuperX-Distribution sind die Tomcat-spezifischen Dateien für die Anbindung an den Apache via mod_jk bereits enthalten, es müssen lediglich ein paar Anpassungen gemacht werden:
- Teil der SuperX-Distribution ist ein Konfigurationsbeispiel mit dem Namen $SUPERX_DIR/webserver/tomcat/conf/superx_mod_jk.conf.sam. dieses können Sie umbenennen nach superx_mod_jk.conf, und in der Datei den Pfad für das mod_jk-Modul (mod_jk.so) anpassen. Ausserdem kann der Logging-Level festgelegt werden (Werte: "debug", "warning", "error", im Echtbetrieb empfehlen wir "error").
* Bei manchen mod_jk- oder Apache Versionen muss man noch die Zeile JkMountCopy All
hinzufügen, siehe Hyperlink.
- In der Datei $SUPERX_DIR/webserver/tomcat/conf/workers.properties muss der Parameter
workers.tomcat_home
auf den richtigen Pfad gesetzt werden. Ausserdem muss der richtige Pfad für workers.java_home gesetzt werden, sowie der Pfad-Demiliter ps für das Betriebssystem ("/" für Unix, "\" für Win, ":" für Mac)
- Wenn Sie den Apache auf einem separaten Rechner betreiben, dann müssen Sie beim Parameter worker.ajp13.host nicht "localhost", sondern den Rechnernamen / IP-Nr. des Tomcat-Servers eintragen.
- Danach fügen Sie am Ende der Apache-Konfigurationsdatei (unter SuSE Linux z.B. /etc/httpd/httpd.conf) die Zeile
Include /home/superx/webserver/tomcat/conf/superx_mod_jk.conf
ein (oder stellen das Script nach /etc/apache2/conf.d dann wird es automatisch gelesen). Außerdem müssen Sie ggf. die Umgebungsvariable DirectoryIndex auf index.htm setzen (nicht nur index.html), da die Startseite in den Verzeichnissen immer index.htm heißt.
- Es wird empfohlen, einen 10 Min-Timeout zu setzen, dazu in der worker.properties
worker.ajp13.connection_pool_timeout=600
und in tomcat/conf/server.xml bei 8009 Konnektor connectionTimeout="60000" (http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html)
- Wenn eine Firewall zwischen den Rechnern liegt, könnte diese möglicherweise Verbindungen kappen, dann ist es gut, wenn man
worker.ajp13.session_keepalive=1
setzt. (http://tomcat.apache.org/connectors-doc/generic_howto/timeouts.html Firewall Connection Dropping)
- Danach starten Sie Apache neu (apachectl restart).
- In der Datei tomcat/conf/server.xml auf dem Tomcat-Rechner kann dann der http-Connector 8080 auskommentiert werden, und der Apache-Connector ajp13 kann benutzt werden; standardmäßig geht dieser über den Port 8009. Dieser Connector ist bei Auslieferung von SuperX aktiviert.
- Dann starten Sie zuerst Tomcat neu, und dann den Apache. Danach müsste auf dem Webserver das Verzeichnis superx gemounted sein, und alle Anfragen mit der Endung *.jsp bzw. in das servlet-Verzeichnis gehen zu Tomcat.
- Sobald Tomcat so an den Apache angebunden ist, kann auch die Verschlüsselung über den Apache laufen. Wenn das Apache-Modul mod_ssl installiert und konfiguriert ist, dann werden auch automatisch anhand des Präfixes http://.. und https://... Anfragen an Tomcat weitergeleitet.
Einrichtung Mod-JK unter Suse Linux
Das folgende Vorgehen wurde getestet unter SUSE Linux Enterprise Server 12 SP3 (x86_64), d.h. Apache 2.4 und Tomcat 8:
Wenn Sie den in Suse Linux eingebauten Apache und Tomcat nutzen, gehen Sie wie folgt vor (Beispielwebanwendung liegt in /usr/share/tomcat/superx/webserver/tomcat/webapps/superx): Kopieren Sie die Dateien superx_mod_jk.conf.sam und workers.properties.sam nach /etc/tomcat/conf.d/superx_mod_jk.conf bzw. workers.properties. Setzen Sie in der Datei superx_mod_jk.conf:
LoadModule jk_module /usr/lib64/apache2/mod_jk.so JkWorkersFile /etc/tomcat/conf.d/workers.properties JkLogFile /var/log/tomcat/mod_jk.log JkLogLevel error JkMountCopy All JkMount /*.jsp ajp13 JkMount /servlet/* ajp13 Alias /superx "/usr/share/tomcat/superx/webserver/tomcat/webapps/superx" <Directory "/usr/share/tomcat/superx/webserver/tomcat/webapps/superx"> Options Indexes FollowSymLinks </Directory> JkMount /superx/servlet/* ajp13 JkMount /superx/* ajp13 <Location "/superx/WEB-INF/"> AllowOverride None Require all denied </Location> <Location "/superx/META-INF/"> AllowOverride None Require all denied </Location>
Setzen Sie in der Datei workers.properties:
workers.tomcat_home=/usr/share/tomcat workers.java_home=/usr/lib64/jvm ps=/ worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13 worker.ajp13.lbfactor=1
Dann binden Sie die Dateien in den Apache ein, indem Sie in der Datei /etc/sysconfig/apache2 die Zeile
APACHE_CONF_INCLUDE_FILES="/etc/tomcat/conf.d/superx_mod_jk.conf"
ergänzen. Danach starten Sie den Apache mit
rcapache2 restart
Logmeldungen des mod_jk liegen in /var/log/tomcat/mod_jk.log. Damit der Apache Server beim Booten hochfährt, geben Sie ein: chkconfig --set apache2 on
Einrichtung Mod-JK unter Ubuntu Linux
Das folgende Vorgehen wurde getestet unter Ubuntu Linux Server 22.04 (x86_64), d.h. Apache 2.4 und Tomcat 9: Installieren Sie Java OpenJDK 11, Tomcat 9, Apache 2.4 und mod_jk:
apt-get update apt-get install -y openjdk-11-jdk apt-get install -y tomcat9 apt-get install -y apache2 libapache2-mod-jk
Das mod_jk wird automatisch aktiviert, die Konfiguration landet defaultmäßig in der Datei
/etc/apache2/mods-available/mod_jk.conf
Entfernen Sie dann die <location>-Elemente jk-manager und jk-status. Wenn Sie den in Ubuntu Linux eingebauten Apache und Tomcat nutzen, gehen Sie wie folgt vor (Beispielwebanwendung liegt in /var/lib/tomcat9/webapps/superx):
Alias /superx "/var/lib/tomcat8/webapps/superx" <Directory "/var/lib/tomcat8/webapps/superx"> Options Indexes FollowSymLinks </Directory> JkMount /superx/servlet/* ajp13 JkMount /superx/* ajp13 <Location "/superx/WEB-INF/"> AllowOverride None deny from all </Location> <Location "/superx/META-INF/"> AllowOverride None deny from all </Location> JkMountCopy All
Setzen Sie in der Datei /etc/libapache2-mod-jk/workers.properties
workers.tomcat_home=/var/lib/tomcat9 workers.java_home=/usr/lib/jvm/java-11-openjdk-amd64 ps=/ worker.list=ajp13 worker.ajp13.port=8009 worker.ajp13.host=localhost worker.ajp13.type=ajp13 worker.ajp13.lbfactor=1 worker.ajp13.secret=geheim
Danach starten Sie den Apache mit
/etc/init.d/apache2 start
Logmeldungen des mod_jk liegen in
/var/log/apache2/mod_jk.log.
Einrichtung Mod-JK Load Balancing
Mit dem eingerichteten mod_jk lässt sich recht einfach ein Lastausgleich zwischen mehreren Tomcats oder eine Trennung von Apache und Tomcat auf zwei Server implementieren. Die Konfiguration findet statt im Apache-Konfigurationsverzeichnis in der Datei workers.properties. Hier wird ein zweiter Worker eingerichtet, z.B. für einen anderen Tomcat Server "miles":
worker.list=loadbalancer worker.worker1.port=8009 worker.worker1.host=localhost worker.worker1.type=ajp13 worker.worker1.lbfactor=1 worker.worker2.port=8010 worker.worker2.host=miles worker.worker2.type=ajp13 # # Specifies the load balance factor when used with # a load balancing worker. # Note: # ----> lbfactor must be > 0 # ----> Low lbfactor means less work done by the worker. worker.worker2.lbfactor=1 worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=worker1,worker2
Zunächst muss in der server.xml auf dem Rechner, auf dem der erste Tomcat läuft, ein AJP-Connector eingerichtet werden, z.B. am Port 8009.
Auszug aus der server.xml des ersten Tomcat-Rechners
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector protocol="AJP/1.3"
port="8009" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
Der AJP-Connector am Port 8010 muss dann auf dem zweiten Tomcat-Server in der server.xml eingetragen werden (nur dieser, nicht der 8009er).
<!-- Define an AJP 1.3 Connector on port 8010 -->
<Connector protocol="AJP/1.3"
port="8010" minProcessors="5" maxProcessors="75"
acceptCount="10" debug="0"/>
Danach kann in der mod_jk-Konfigurationsdatei ein Lastausgleich eingerichtet werden:
JkMount /superx/servlet/* loadbalancer JkMount /superx/* loadbalancer
Mod-JK und Tomcat Sicherheit
Mit Tomcat 8.5 wurden die Defaulteinstellungen für die Mod-JK Anbindung verschärft:
- Der Tomcat Konnektor für Mod-JK erlaubt nur auf "localhost" eine Verbindung mit dem Apache. Um das zu ändern müssen Sie das Attribut "adress=...ip des Tomcat servers... angeben. Wenn Sie ohne Einschränkung freigeben wollen geben Sie address="0.0.0.0" an.
- Der Tomcat Konnektor für Mod-JK (typischerweise 8009) wird mit einem Passwort ("secret") gestartet
- Dieses Passwort muss Apache-seitig in der workers.properties eingetragen werden.
Hier ein Beispiel:
- Tomcat server.xml:
<Connector protocol="AJP/1.3"
secretRequired="true"
secret="geheim"
port="8009"
redirectPort="8443" URIEncoding="UTF-8" />
- Apache workers.properties:
worker.list=superx_tomcat worker.superx_tomcat.port=8009 worker.superx_tomcat.host=localhost worker.superx_tomcat.type=ajp13 worker.superx_tomcat.secret=geheim
Wenn Sie nur auf localhost arbeiten und den Port 8009 nicht nach außen freigeben, können Sie in der server.xml auch
secretRequired="false"
setzen. Damit entfällt die Notwendigkeit eines Passworts.
Weitere Tipps zur Tomcat Sicherheit siehe https://tomcat.apache.org/tomcat-9.0-doc/security-howto.html
Einrichtung SSL
SSL Varianten
Sie können Tomcat selbst SSL verschlüsseln lassen, aber normalerweise wird die Verschlüsselung im Webserver eingerichtet.
SSL im Webserver
Einrichten von SSL beim Apache 2.x unter SuSE Linux
Das Modul ssl ist im Apache 2.x nicht mehr separat zu installieren, sondern bereits im Lieferumfang enthalten, das Modul muss nur in den entsprechenden LoadModule und Include-Abschnitten geladen werden.
Wir führen alle Schritte als user root durch, und gehen z.B. davon aus, dass wir uns im Verzeichnis /root befinden.
Zunächst muss ein Zertifikat erzeugt werden. Das öffentliche CA-Zertifikat liegt z.B. in /root/demoCA/cacert.pem und der private Schlüssel liegt in /root/demoCA/private/cakey.pem..
Nun werden die Schlüssel dem Apache2 bekannt gemacht. Die einzelnen Konfigurationsparameter werden bei SuSE Linux über die Sysconfig gesetzt:
SuSE-typisch wird die Konfiguration in einer Datei im Verzeichnis /etc/sysconfig abgelegt, nämlich in apache2. Dort setzen Sie in der Direktive
APACHE_CONF_INCLUDE_FILES="/home/superx/webserver/tomcat/conf/superx_mod_jk.conf /etc/apache2/vhosts.d/myhost-ssl.conf"
die Tomcat-Anbindung und den Virtuellen SSL-Host. Letzteren konfigurieren Sie am besten, indem Sie die Vorlage /etc/apache2/vhosts.d/vhost-ssl.template kopieren, z.b. wie oben nach myhost-ssl.conf. Weiter unten in /etc/sysconfig/apache2 setzen Sie die Direktive
APACHE_SERVER_FLAGS="SSL"
Damit werden in verschiedenen anderen conf-Dateien die Abfragen <ifDefine SSL> positiv aufgelöst und die jeweiligen Direktiven darin werden aktiviert. Nach dem Ändern der Datei /etc/sysconfig/apache2 müssen Sie als User root das Script SuSEconfig ausführen.
Bei anderen Linux-Distributionen entfällt die sysconfig. Auch unabhängig von der Distribution wird beim Apache2 nicht mehr die gesamte Konfiguration in einer großen httpd.conf gesammelt, sondern in separaten conf-Dateien. Bei virtuellen Hosts zum Beispiel befinden sich die Konfigurationen in Dateien mit der Endung *.conf im Verzeichnis vhosts.d. Der Startpunkt ist aber immer die httpd.conf (standardmäßig in /etc/apache2).
Wenn Sie keine Virtual Hosts nutzen, dann können Sie den Abschnitt, der im Konfigurationsbeispiel /etc/apache2/vhosts.d/vhost-ssl.template beschrieben ist auch in der Datei /etc/apache2/default-server.conf einfügen:
/etc/apache2/default-server.conf
## ## SSL Virtual Host Context ## <VirtualHost _default_:443> # General setup for the virtual host DocumentRoot "/srv/www/htdocs" ServerName 192.168.0.108:443 #ServerAdmin webmaster@example.com ErrorLog /var/log/apache2/error_log TransferLog /var/log/apache2/access_log # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on # SSL Cipher Suite: # List the ciphers that the client is permitted to negotiate. # See the mod_ssl documentation for a complete list. SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL # Server Certificate: # Point SSLCertificateFile at a PEM encoded certificate. If # the certificate is encrypted, then you will be prompted for a # pass phrase. Note that a kill -HUP will prompt again. Keep # in mind that if you have both an RSA and a DSA certificate you # can configure both in parallel (to also allow the use of DSA # ciphers, etc.) SSLCertificateFile /root/demoCA/cacert.pem #SSLCertificateFile /etc/apache2/ssl.crt/server.crt #SSLCertificateFile /etc/apache2/ssl.crt/server-dsa.crt # Server Private Key: # If the key is not combined with the certificate, use this # directive to point at the key file. Keep in mind that if # you've both a RSA and a DSA private key you can configure # both in parallel (to also allow the use of DSA ciphers, etc.) SSLCertificateKeyFile /root/demoCA/private/cakey.pem #SSLCertificateKeyFile /etc/apache2/ssl.key/server.key #SSLCertificateKeyFile /etc/apache2/ssl.key/server-dsa.key ...
Danach müssen Sie in /etc/sysconfig/apache2 die Systemvariable HTTPD_START_TIMEOUT auf einen sinnvollen Wert setzen, z.B. 10. Danach wie immer SuSEconfig ausführen.
Sie haben dann beim Start des Apache 10 Sek. Zeit, dass CA-Passwort einzugeben.
Wenn sie wünschen, dass der Apache beim Booten ohne Passwort-Abfrage startet, dann müssen Sie das CA-Passwort löschen und die Leserechte für den privaten Schlüssel ändern (nur root und der Apache-Daemon haben Leserecht)[1]. Dies ist allerdings ein Sicherheitsrisiko; der Server wird leichter kompromittierbar, wenn ein Hacker auf den Rechner kommt und die Datei lesen kann, kann er den Schlüssel missbrauchen. Unserer Erfahrung nach ist aber nur dieser Weg gangbar, denn bei einem Reboot nach Stromausfall würde der gesamte Webserver sonst nicht laufen!
Wir geben als root im Verzeichnis /root/demoCA/private ein:
openssl rsa -in cakey.pem -out cakey2.pem
(1x mit der Passphrase bestätigen).
Dann wird ein Schlüssel ohne Passphrase erzeugt. Wenn wir diesen dann wiederum in /etc/httpd/httpd.conf eintragen:
#SSLCertificateKeyFile /root/demoCA/private/cakey.pem SSLCertificateKeyFile /root/demoCA/private/cakey2.pem
Dann startet der Apache ohne Passwortabfrage. In diesem Fall kann man auch die Variable HTTPD_START_TIMEOUT auf 1 zurücksetzen.
Wenn Sie Ihr Zertifikat bei einer Zertifizierungstelle signieren lassen möchten, müssen eine outline|Zertifizierungsanfrage erstellen.
Mit dem oben erstellten CA-Zertifikat können Sie Ihr http-Zertifikat folgendermaßen selbst signieren:
/usr/share/ssl/misc/CA.sh -sign
Es wird eine Datei newcert.pem erzeugt. Nachdem Sie nun ein signiertes Zertifikat für Ihre Anwendung erstellt haben, müssen Sie dieses nur noch in das entsprechende Verzeichnis kopieren und in der Konfigurationsdatei eintragen. Der Apache erwartet den privaten Schlüssel in einer separaten Datei, in solchen Fällen können Sie den privaten Schlüssel wie folgt extrahieren
openssl rsa -in newreq.pem -out newkey.pem
Einrichten von SSL beim Apache 2.x unter Ubuntu Linux
Zunächst erzeugen Sie ein Zertifikat:
mkdir /etc/apache2/ssl openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key
Das Zertifikat binden Sie in der conf-Datei ein, defaultmäßig /etc/apache2/sites-enabled/000-default.conf:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
</VirtualHost>
</IfModule>
Danach aktivieren Sie SSL mit
a2enmod ssl
Sie können unter Ubuntu auch den Apache ssl-virtual host aktivieren
a2ensite default-ssl.conf
Dann können Sie den Port 80 auf den Port 443 umleiten:
<VirtualHost *:80>
ServerName superx-cloud.de
ServerAlias www.superx-cloud.de
Redirect / https://www.superx-cloud.de/
...
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAlias www.superx-cloud.de
ServerName superx-cloud.de
...
</VirtualHost>
</IfModule>
Und dann starten Sie Apache neu mit
/etc/init.d/apache2 restart
Zertifikate mit Let's encrypt
Mit ACME unter Linux lassen sich Zertifikate von der Initiative Let's encrypt signieren lassen. Die Zertifikate sind 3 Monate gültig, und haben eine eingebaute automatische Verlängerung implementieren. Gehen Sie dazu wie folgt vor:
Clonen Sie das Projekt von GitHub:
git clone https://github.com/Neilpang/acme.sh.git
Es wird ein Verzeichnis "acme.sh" erzeugt, mit dem Script "acme.sh". Dieses kopieren Sie als User root auf den Server, z.B. nach /root.
apt-get install socat
Dann installieren Sie den cronjob zum Aktualisieren:
./acme.sh --install
Der Cronjob prüft jede Nacht um 0:44 Uhr, ob das Zertifikat abgelaufen ist, wenn nicht wird es erneuert. Danach müssen Sie die Shell neu öffnen, und bei zerossl registrieren:
./acme.sh --register-account -m git@superx-cloud.de --server zerossl
Dann erzeugen Sie die Zertifikatsdateien, am Beispiel der Domain "superx-cloud.de" auf einem Ubuntu-Apache, d.h. documentRoot ist /var/www/html :
./acme.sh --issue -d superx-cloud.de -w /var/www/html
Voraussetzung ist das Apache auf Port 80 läuft und die Firewall auf Port 80 frei ist (iptables).
Dann installieren Sie die Dateien in den Apache, die Beispielverzeichnisse stammen aus der Ubuntu-Apache-Installation. Ggf. müssen Sie das Verzeichnis /etc/apache2/ssl noch erzeugen.
mkdir -p /etc/apache2/ssl
./acme.sh --install-cert -d superx-cloud.de --cert-file /etc/apache2/ssl/server.crt --key-file /etc/apache2/ssl/server.key --fullchain-file /etc/apache2/ssl.crt/server-ca.crt
SSL Aktivieren
a2enmod ssl
Apache ssl-virtual host ggf. aktivieren, unter Ubuntu:
a2ensite default-ssl.conf
Darin
ServerName superx-cloud.de SSLCertificateFile /etc/apache2/ssl/superx-cloud.de.crt SSLCertificateKeyFile /etc/apache2/ssl/superx-cloud.de.key SSLCertificateChainFile /etc/apache2/ssl/superx-cloud.de-fullchain.crt SSLCACertificateFile /etc/apache2/ssl/superx-cloud.de-intermediate.crt
Danach starten Sie Apache neu.
SSL im Tomcat
Wenn Sie nicht die Möglichkeit die Verschlüsselung vom Webserver (Apache oder IIS) nutzen wollen, können Sie auch direkt im Tomcat verschlüsseln. Im folgenden eine Anleitung, wenn kein öffentlich bekanntes und signiertes Zertifikat genutzt werden soll. Große Teile wurden übernommen aus der Tomcat Dokumentation "ssl-howto.html".
Erzeugen Sie zunächst auf dem Applikationsserver einen Keystore mit dem Befehl Windows:
%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
UNIX:
$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA
Die Parameter werden erfragt; wichtig ist, dass der erste Eintrag (Vor- und Nachname, COMMON NAME CN) der DNS-Name des Werbservers ist, z.B. superx.verwaltung.uni-duisburg.de. Als Passwort geben Sie beide Male z.B. "changeit" an (das ist nur ein Beispielpasswort für die Dokumentation, natürlich sollten Sie das Passwort ändern). Daraufhin wird ein Zertifikat erzeugt und in der Datei .keystore im Homeverzeichnis des Benutzers angelegt (unter Windows im Profiles-Verzeichnis, unter UNIX im home-Verzeichnis).
Das persönliche Zertifikat können Sie durch einen kommerziellen Zertifizierungsserver publizieren; zu Testzwecken können Sie auch ein selbsterstelltes Zertifikat erzeugen:
keytool -selfcert -alias tomcat -validity -Anzahl der Tage-
Danach ändern Sie die Datei $TOMCAT_HOME/conf/server.xml, indem Sie die Passage mit der SSL-Verschlüsselung (z.B. 8443) ent-kommentieren und den normalen Port (8080) auskommentieren.
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorePass="changeit" keystoreFile="/home/superx/.keystore" />
Danach ist die Webanwendung über https://localhost:8443 statt http://localhost:8080 erreichbar. Sie müssen alle Links entsprechend ändern.
Das Zertifikat können Sie löschen, indem Sie auf der Kommandozeile eingeben: keytool -delete -alias tomcat
Signierung eines Zertifikats in Tomcat
Bei selbst signierten Zeritfikaten erscheint im Browser immer eine Sicherheitswarnung. Um dies zu vermeiden, muss man ein öffentliches Zertifikat von einem Trust Center erwerben. Dies kann man im Apache eintragen (s.u.), aber auch direkt im Tomcat, wenn Sie keinen Apache nutzen:
- public key + private key erzeugen und die im keystore-file ablegen (der private key wird dabei mit passwd verschlüsselt):
keytool -genkey -keyalg RSA -alias tomcat -keystore xxx.jks
- certificate request generieren --> Datei server.csr und an die CA schicken:
keytool -certreq -keyalg RSA -file server.csr -keystore xxx.jks
- Den von der CA signierten public key = Serverzertifikat zurückbekommen --> Datei server.cer
- Zuerst das Zertifikat der CA (z.B. UTN-USERFirst-Network Applications, http://www.usertrust.com) downloaden und in den keystore einspielen:
keytool -import -file UTN.cer -alias tomcat -keystore xxx.jks
- Dann das neue Serverzertifikat in den keystore einspielen:
keytool -import -file server.cer -alias tomcat -keystore xxx.jks
- in der Tomcat-server.xml auf die keystore-Datei verweisen:
keystoreFile="<<Pfad zur xxx.jks-Datei>>" keystorePass="passwd"
- Wichtig: dasselbe passwd einsetzen wie unter 1. zum Verschlüsseln des private key benutzt wurde
- Restart Tomcat
- https-Verbindung zum Server, Zertifikat überprüfen - vertrauenswürdig?
- ↑
Auch in der offiziellen Doku von mod_ssl wird dies empfohlen, mit dem Zusatz,dass nur root und der apache-daemon diese Datei lesen darf.