Zuletzt bearbeitet vor 3 Wochen
von Daniel Quathamer

Kernmodul Tomcat-Einrichtung

Installation und Einrichtung von tomcat.png 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.

http://localhost:8080/superx/

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.

lightbulb.svg 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
attention.svg 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
attention.svg 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.

lightbulb.svg 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?
  1. 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.

    http://www.modssl.org/docs/2.0/#FAQ-nopass