Tomcat Installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
 
(57 dazwischenliegende Versionen von 10 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
== Allgemein ==
== Allgemein ==


=== Achtung ===
[http://tomcat.apache.org/ Apache Tomcat] ist ein Webserver (HTTP-Server), der in der Programmiersprache Java entwickelt ist. Er dient in erster Linie dazu, dynamische Web-Anwendungen zu betreiben, die ebenfalls in Java programmiert sind. Basis-Technologien sind [http://de.wikipedia.org/wiki/Servlet Java-Servlets] und [http://de.wikipedia.org/wiki/JSP Java Server Pages (JSP)].


Diese Installationsanleitung bezieht sich auf den mittlerweile auslaufenden Tomcat 5.5! Neuere Versionen können problemlos von http://tomcat.apache.org heruntergeladen und im Paket entpackt werden.
Mit Hilfe von Apache Tomcat ist bei Hostsharing das Hosting von komplexen Java Web-Applikationen problemlos möglich.


=== Allgemeine Hinweise ===
== Spezielle Installation bei Hostsharing ==


Achtung: Diese Installationsanleitung bezieht sich auf den mittlerweile auslaufenden Tomcat 5.5! Neuere Versionen können problemlos von http://tomcat.apache.org heruntergeladen und im Paket entpackt werden.
In jedem dynamischen Webhosting-Paket der Hostsharing eG können einer (oder mehrere) Tomcat-Webserver betrieben werden.


Diese Anleitung dokumentiert die Installation des Apache Tomcat Servers als Paket-Admin in einem Dynamic-Web Paket bei Hostsharing. Ist die entsprechende Tarif-Option gebucht worden, richtet ein Hostmaster einmalig die Tomcat-Umgebung im Paket ein und sie kann dann genutzt werden. Der Paket-Admin kann anschließend weitere Domains im Tomcat konfigurieren, Anwendungen aufsetzen und den Tomcat starten oder beenden.
Dazu muss für jede Tomcat-Instanz die Option "Betrieb eines eigenen Serverdienstes" gebucht werden. Im Bereich des Shared Hosting ist die Option kostenpflichtig.  


Das Installationsskript kann vom Paket-Admin auch später weitere Male aufgerufen werden, wenn er selbst den Tomcat erneut installieren möchte. Dazu muss allerdings vorher die aktuelle Installation entfernt oder verschoben sein.
Diese Anleitung dokumentiert die Installation des Apache Tomcat Servers als Service-User in einem WEB-Paket bei Hostsharing.  Mit der Einrichtung der Option "eigener Serverdienst" werden für die Paket-IP-Adresse einer oder mehrere IP-Ports reserviert. An diese Ports wird der eigene Serverdienst (also der Tomcat-Server) am Localhost-Interface gebunden.


=== Spezielle Installation bei Hostsharing ===
Geben Sie bei der Bestellung der Option "Eigener Serverdienst" an:


Jedes Paket mit gebuchter Tomcat-Option ("Daemon M") startet einen eigenen Tomcat, der jedoch durch eine zentrale Tomcat-Installation bereitgestellt wird. Lediglich die Anwendungs-, Arbeits- und Temp-Verzeichnisse sind in den Paketen eingerichtet und so für jede Tomcat-Instanz eindeutig und von den anderen getrennt.
# den Service User, mit dessen Rechten der Tomcat-Dienst laufen soll (also zum Beispiel "xyz00-tomcat")
# wieviele IP-Ports reserviert werden sollen (in der folgenden Anleitung verwenden wir drei nicht-privilegierte Ports:
* 38005 als "Shutdown"-Schnittstelle
* 38006 für eine AJP-Listener


Dieses Verhalten wird durch die Umgebungsvariablen CATALINA_HOME und CATALINA_BASE, die Tomcat zur Laufzeit auswertet, ermöglicht. Unter CATALINA_HOME liegt die zentrale Tomcat-Installation und unter CATALINA_BASE werden die oben genannten Verzeichnisse gesucht.
== Installation ==


== Installation ==  
Vorbemerkung: Mit Debian 12 ('Bookworm') wird Tomcat 10 von der Distribution mitgeliefert.
 
Auf den Hostsharing-Servern ist das Debian-Paket "tomcat10-user" installiert. Es stellt den
Apache Tomcat Server in der Version 10.1.x für den Betrieb als normaler (nicht privilegierter) User bereit.
Dabei wird die zentral installierte Tomcat-Software benutzt, die über Betriebssystem-Updates mit Sicherheits-Updates versorgt wird.
 
Für die Installation der Konfigurations-Dateien in Heimat-Verzeichnis des Benutzers wird folgender Befehl
mit den Rechten des Service-Users aufgerufen:
 
<syntaxhighlight lang="bash">
xyz00-tomcat@h00:~$ tomcat10-instance-create tomcat
</syntaxhighlight>
 
Ich bevorzuge das catalina.sh-Startskript zum Testen:
 
<syntaxhighlight lang="bash">
xyz00-tomcat@h00:~$ cp /usr/share/tomcat10/bin/catalina.sh tomcat/bin/
</syntaxhighlight>
 
Dieser Befehl legt ein Verzeichnis "tomcat" mit der üblichen Dateistruktur für einen Tomcat-Server an:


=== Voraussetzungen ===
<syntaxhighlight lang="bash">
bin
bin/catalina.sh
bin/setenv.sh
bin/shutdown.sh
bin/startup.sh
conf
conf/catalina.properties
conf/context.xml
conf/jaspic-providers.xml
conf/logging.properties
conf/server.xml
conf/tomcat-users.xml
conf/web.xml
logs
policy
policy/catalina.policy
temp
webapps
work
</syntaxhighlight>


Für eine zulässige und erfolgreiche Installation des Tomcat in einem Paket müssen folgende Dinge gegeben sein:
In der Hauptsache muss die Konfigurationsdatei "server.xml" im Verzeichnis "~/tomcat/conf/" angepasst werden.


* Man muss Paket-Admin eines Dynamic-Web Pakets sein
Beispiel für eine minimale "server.xml":
* Gebuchte JSP-Option (per Email an bestellung(at)hostsharing.net)
* Portvermerk in /etc/ports oder eigene IP für das Paket und entsprechende iptables-Regeln - je nach Installationsmodus (bei der Bestellung angeben, Preise hier)


=== Art der Installation ===
<syntaxhighlight lang="xml" line>
<?xml version="1.0" encoding="UTF-8"?>
<Server port="38005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector protocol="AJP/1.3" address="127.0.0.1" port="38006" redirectPort="443" secretRequired="false" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="../webapps" unpackWARs="true" autoDeploy="true"></Host>
    </Engine>
  </Service>
</Server>
</syntaxhighlight>


Es stehen zwei Installationsmodi zur Verfügung. In beiden Modi läuft der Tomcat jedoch mit den Rechten des Paket-Users und kann somit nur auf nicht-privilegierte Ports (> 1024) zugreifen.
Angepasst werden müssen:
* die beiden IP-Ports (im Beispiel 38005 und 38006 am Localhost-Interface)


Einer der Modi muss bei der Bestellung der JSP-Option angegeben werden, damit die Hostmaster den Tomcat entsprechend installieren und die entsprechenden Einträge vornehmen können.
== Deployment einer Anwendung ==


==== Apache Webserver als Proxy: mod_proxy ====
In der Beispiel-Konfiguration wurde das Verzeichnis ''$HOME/webapps/'' für die Anwendungen konfiguriert. Wir legen dieses Verzeichnis an und kopieren eine minimale Anwendung hinein:


Hierbei läuft vor dem Tomcat Server der Apache Webserver mit mod_proxy und leitet alle Anfragen an den Tomcat weiter. Er arbeitet als Proxy. Dieses Verhalten wird über .htaccess-Dateien konfiguriert, die in den entsprechenden Subdomain-Verzeichnissen liegen müssen und eine bestimmte Rewrite-Regel beinhalten. Eine beispielhafte .htaccess-Datei sieht folgendermaßen aus:
<syntaxhighlight lang="bash">
mkdir -p $HOME/webapps/hello/WEB-INF/
</syntaxhighlight>


RewriteEngine On
Dort legen wir die Datei ~/webapps/hello/WEB-INF/web.xml mit folgendem Inhalt an:
RewriteCond %{SERVER_PORT} ^80$
RewriteBase /
RewriteRule ^(.*)$ http://www.example.com:30031/${escape:$1} [P,L]


Die benutzten Ports werden von den Hostmastern in der Datei /etc/ports eingetragen.
<syntaxhighlight lang="xml" line>
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
</web-app>
</syntaxhighlight>


==== Eigene Paket-IP: iptables ====
Dazu eine einfache JSP-Datei ~/webapps/hello/index.jsp:


In dieser Konfiguration läuft der Tomcat auf einer eigenen IP und dem (Standard-)Port 8080, weswegen kein Eintrag in /etc/ports notwendig ist. Alle Anfragen an Port 80 werden über iptables-Regeln an den Tomcat weiter gereicht. Das Paket bekommt eine eigene IP und die Regeln müssen von einem Hostmaster in iptables eingetragen werden.
<syntaxhighlight lang="html" line>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="de-de">
<body>
<h1>Hallo Welt</h1>
<p>Java Version: <%= System.getProperty("java.version") %></p>
</body>
</html>
</syntaxhighlight>


=== Installationsskript ===
Nun können wir die HTTP-Requests, die an eine Domain im Paket gesendet werden, an den Tomcat weiterleiten.
Das funktioniert über eine ''.htaccess''-Datei, zum Beispiel im Verzeichnis ''~/doms/hs-example.de/htdocs-ssl'':


Das Installationsskript steht auf allen Hives mit Dynamic-Web Paketen unter dem Pfad /opt/tomcat/bin/install-tomcat zur Verfügung und hat folgende Aufrufsyntax:
<syntaxhighlight lang="apache" line>
DirectoryIndex disabled
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) ajp://127.0.0.1:38006/$1 [proxy,last]
</syntaxhighlight>


xyz00@host:~$ /opt/tomcat/bin/install-tomcat -h
Achtung der IP-Port 38006 muss hier wieder angepasst werden!
Usage: install-tomcat [OPTIONS]
This script creates all necessary directories, files and links to run Apache Tomcat in your package. You must invoke it as a package user.
-h, --help show this help
-m, --mode set install mode
mod_proxy: read ports from /etc/ports (default)
iptables : use default ports 8005, 8080 and 8443
-t, --test set test mode, does not create anything
xyz00@host:~$


Das Skript prüft zuerst ob es von einem gültigen Paket-User (nur Paket-Admins) aufgerufen wurde, ob die entsprechenden Ports in /etc/ports verfügbar sind (nur im Modus mod_proxy) und keine Verzeichnisse oder Dateien einer vorherigen Installation vorhanden sind. Entsprechende Fehler mit Hilfevorschlägen werden ausgegeben.
Dadurch ist die Mini-Anwendung unter der URL "https://hs-example.de/hello/" erreichbar.


Wird das Skript mit dem Parameter -t aufgerufen; beendet es sich nach diesen Prüfungen selbst.
== Start des Tomcat Servers ==


Wird es ohne Parameter oder mit dem Parameter -m aufgerufen, installiert es alle notwendigen Dateien und gibt entsprechende Meldungen aus.
Der Tomcat kann über die Skripte in "~/tomcat/bin/" gestartet und gestoppt werden.


=== Angelegte Verzeichnisse und Dateien ===
<syntaxhighlight lang="bash">
cd ~/tomcat
./bin/startup.sh
</syntaxhighlight>


* Verzeichnisse
Log-Ausgaben des Servers sind in "~/tomcat/logs/catalina.out" zu finden.
** ~/etc/tomcat Für die Konfigurationsdateien des Tomcat.
** ~/tomcat/ Für Symlinks in wichtige Verzeichnisse.
** ~/var/cache/
** ~/var/cache/tomcat/ Für installierte Anwendungen (zur Laufzeit).
** ~/var/cache/tomcat/_tmp/ Für temporäre Dateien des Tomcat (zur Laufzeit).
** ~/webapps/ Für Anwendungen. Jeder konfigurierte Host bekommt ein Unterverzeichnis.
** ~/webapps/xyz00.hostsharing.net/ Anwendungen des Default-Host.
** ~/webapps/tomcat.example.com/ Anwendungen einer weiteren Domain mit vorkonfigurierter Subdomain tomcat.
* Dateien
** ~/etc/tomcat/server.xml Die Tomcat Konfigurationsdatei.
** ~/etc/tomcat/tomcat-users.xml Tomcats servserseitige Benutzerverwaltung.
** ~/etc/tomcat/web.xml Konfigurationsdatei des Servlet-Containers.
* Symlinks
** ~/tomcat/conf Link auf ~/etc/tomcat
** ~/tomcat/work Link auf ~/var/cache/tomcat
** ~/tomcat/temp Link auf ~/var/cache/tomcat/_tmp


=== Server starten und beenden ===
Damit der Tomcat bei einem Reboot der Hostsharing-Server automatisch gestartet wird,
konfigurieren wir den Prozessmonitor ''systemd'' entsprechend.


Das Start- und Stop-Skript findet man unter dem Pfad /opt/tomcat/bin/rc-tomcat und es hat folgende Aufrufsyntax:
Wir legen ein Verzeichnis für die Konfiguration des ''systemd'' an und legen eine Unit-Konfiguration für einen Service dort ab:


xyz00@host:~$ /opt/tomcat/bin/rc-tomcat
<syntaxhighlight lang="bash">
Using CATALINA_BASE: /home/pacs/xyz00/tomcat
mkdir -p ~/.config/systemd/user
Using CATALINA_HOME: /opt/tomcat/current55
</syntaxhighlight>
Using CATALINA_TMPDIR: /home/pacs/xyz00/tomcat/temp
Using JRE_HOME: /opt/java/current60
Usage: rc-tomcat ( commands ... )
commands:
debug Start Catalina in a debugger
debug -security Debug Catalina with a security manager
jpda start Start Catalina under JPDA debugger
run Start Catalina in the current window
run -security Start in the current window with security manager
start Start Catalina in a separate window
start -security Start in a separate window with security manager
stop Stop Catalina
stop -force Stop Catalina (followed by kill -KILL)
version What version of tomcat are you running?
xyz00@host:~$


== Weitergehende Informationen ==
Die Unit-Datei ''~/.config/systemd/user/tomcat.service''


=== Start des Tomcat bei Server Reboot ===
<syntaxhighlight lang="ini" line>
[Unit]
Description=Tomcat User Service


Der Tomcat-Prozess wird von Hand gestartet und nicht von den Hostmastern überwacht. Es liegt in deiner Verantwortung nach einem Reboot des Hostsharing-Servers deinen Tomcat neu zu starten. Das geht am einfachsten über einen Eintrag in der [[Cron| Crontab]]:
[Service]
WorkingDirectory=%h/tomcat
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="JAVA_OPTS=-Xms256M -Xmx512M"
ExecStart=%h/tomcat/bin/catalina.sh run
StandardOutput=append:%h/tomcat/logs/catalina.log
StandardError=inherit
Restart=always
PrivateTmp=true
NoNewPrivileges=true


JAVA_HOME=/opt/java/current60
[Install]
WantedBy=default.target
HOME=/home/pacs/xyz99
</syntaxhighlight>


PATH=$JAVA_HOME/bin:/usr/bin:/bin:/usr/local/bin
Auf Wunsch kann ''SystemD'' RAM- und CPU-Ressourcen begrenzen. Dazu wird der Abschnitt ''Service'' ergänzt:
# Starte Tomcat beim Reboot
@reboot /opt/tomcat/bin/rc-tomcat start


=== Logging ===
<syntaxhighlight lang="ini" line>
[Service]
...
MemoryAccounting=true
CPUAccounting=true
MemoryHigh=512M
MemoryMax=768M
CPUQuota=50%
</syntaxhighlight>


Die Log-Datei zum Status des Tomcat und den Meldungen beim Starten kann man sich als Paket-Admin ansehen per
Die letzte Aufgabe ist das Einrichten der Bereinigung für die Log-Dateien.


less ~/var/catalina.out
Dazu lege ich die Konfigurationsdatei ''.logrotate'' im $HOME-Verzeichnis an:


<syntaxhighlight lang="bash" line>
=== Anwendung: Tomcat Dokumentation ===
/home/pacs/xyz00/users/tomcat/tomcat/logs/catalina.log {
  copytruncate
  compress
  rotate 5
  daily
  missingok
}
</syntaxhighlight>


Die Tomcat-Dokumentation findet man online im unten angegebenen Link. Außerdem enthält die Server-Konfiguration in der Datei server.xml einen auskommentierten Bereich, der die Anwendung "Tomcat Dokumentation" für einen bestimmten Host unter dem Pfad /tomcat-docs einbindet. Um diese Anwendung für einen bestimmten Host zu aktivieren, muss vor dem Starten des Tomcat folgender Bereich im jeweiligen Host-Bereich der server.xml aus dem Kommentar genommen werden.
Für die Bereinigung der Log-Dateien noch zwei systemd-Timer:


<Context displayName="Tomcat Documentation"
~/.config/systemd/user/logrotate.service
    docBase="${catalina.home}/webapps/tomcat-docs"
<syntaxhighlight lang="bash" line>
    path="/tomcat-docs"
[Unit]
    antiResourceLocking="false" antiJARLocking="false"/>
Description=rotate tomcat logs


=== Anwendung: Tomcat Manager ===
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate -s /home/pacs/xyz00/users/tomcat/.logrotate.state /home/pacs/xyz00/users/tomcat/.logrotate
</syntaxhighlight>


Die Server-Konfiguration enthält in der Datei server.xml einen auskommentierten Bereich, der die Anwendung "Tomcat Manager" für einen bestimmten Host unter dem Pfad /manager einbindet. Um diese Anwendung für einen bestimmten Host zu aktivieren muss vor dem Starten des Tomcat folgender Bereich im jeweiligen Host der server.xml aus dem Kommentar genommen werden.
~/.config/systemd/user/logrotate.timer
<syntaxhighlight lang="ini" line>
[Unit]
Description=rotate tomcat logs


<Context displayName="Tomcat Manager"
[Timer]
    docBase="${catalina.home}/server/webapps/manager"
OnCalendar=1:1
    path="/manager" privileged="true"
Persistent=True
    antiResourceLocking="false" antiJARLocking="false">
 


Um als Benutzer Zugriff auf die Manager-Anwendung zu bekommen muss in der Benutzerverwaltung tomcat-users.xml dem Benutzer die Rolle  manager zugewiesen sein.
[Install]
WantedBy=timers.target
</syntaxhighlight>


Im Browser kann man dann den manager aufrufen per (8080 ist der individuell zugewiesene Port!)
~/.config/systemd/user/delete_old_logs.service
<syntaxhighlight lang="bash" line>
[Unit]
Description=delete old log files


http://www.example.com:8080/manager
[Service]
Type=oneshot
ExecStart=/usr/bin/find /home/pacs/xyz00/users/tomcat/tomcat/logs -type f -mmin +10080 -delete
</syntaxhighlight>


z.B. Auflistung der laufenden Apps
~/.config/systemd/user/delete_old_logs.timer
<syntaxhighlight lang="ini" line>
[Unit]
Description=delete old log files


http://www.example.com:8080/manager/list
[Timer]
OnCalendar=14:3
Persistent=True


z.B. Status-Seite
[Install]
WantedBy=timers.target
</syntaxhighlight>


http://www.example.com:8080/manager/status


Falle: Lässt man den zugewiesenen Port weg, bekommt man (zumindest in Tomcat 5.5)  überraschender Weise einen Fehler "403 Forbidden".
Timer aktivieren und starten:
Siehe hierzu auch [http://www.apacheserver.net/tomcat-manager-not-working-at192997.htm http://www.apacheserver.net/tomcat-manager-not-working-at192997.htm]
<syntaxhighlight lang="bash" line>
$ systemctl --user enable logrotate.timer
$ systemctl --user start logrotate.timer
$ systemctl --user enable delete_old_logs.timer
$ systemctl --user start delete_old_logs.timer
</syntaxhighlight>


{{Textkasten|rot|Achtung|Die Manager-Anwendung bringt gewisse Risiken mit sich, da über sie der komplette Tomcat gesteuert (z.B. deploy und undeploy von Anwendungen) werden kann! Bitte nur aktivieren, wenn man weiß was man tut.}}
Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.


=== Links ===
== Links ==


*[http://tomcat.apache.org/ Apache Tomcat Homepage (Englisch)]
*[http://tomcat.apache.org/ Apache Tomcat Homepage (Englisch)]
*[http://tomcat.apache.org/tomcat-5.5-doc/index.html Apache Tomcat Dokumentation (Version 5.*, Englisch)]
*[http://tomcat.apache.org/tomcat-9.0-doc/index.html Apache Tomcat Dokumentation (Version 9.0, Englisch)]
*[http://wiki.apache.org/tomcat/FAQ Apache Tomcat FAQ (Englisch)]
*[http://wiki.apache.org/tomcat/FrontPage Apache Tomcat Wiki (Englisch)]
*[https://github.com/tpokorra/Hostsharing-Ansible-Tomcat Ansible Playbook für Hostsharing]
 
----
----
[[Kategorie:HSDoku]]
[[Kategorie:HSDoku]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Installationsanleitungen]]
[[Kategorie:Ansible Playbook]]
[[Kategorie:Software]]
[[Kategorie:Software]]
[[Kategorie:Java]]
[[Kategorie:Eigene Daemons]]
[[Kategorie:Eigene Daemons]]

Aktuelle Version vom 3. Dezember 2024, 13:55 Uhr

Apache Tomcat installieren

Allgemein

Apache Tomcat ist ein Webserver (HTTP-Server), der in der Programmiersprache Java entwickelt ist. Er dient in erster Linie dazu, dynamische Web-Anwendungen zu betreiben, die ebenfalls in Java programmiert sind. Basis-Technologien sind Java-Servlets und Java Server Pages (JSP).

Mit Hilfe von Apache Tomcat ist bei Hostsharing das Hosting von komplexen Java Web-Applikationen problemlos möglich.

Spezielle Installation bei Hostsharing

In jedem dynamischen Webhosting-Paket der Hostsharing eG können einer (oder mehrere) Tomcat-Webserver betrieben werden.

Dazu muss für jede Tomcat-Instanz die Option "Betrieb eines eigenen Serverdienstes" gebucht werden. Im Bereich des Shared Hosting ist die Option kostenpflichtig.

Diese Anleitung dokumentiert die Installation des Apache Tomcat Servers als Service-User in einem WEB-Paket bei Hostsharing. Mit der Einrichtung der Option "eigener Serverdienst" werden für die Paket-IP-Adresse einer oder mehrere IP-Ports reserviert. An diese Ports wird der eigene Serverdienst (also der Tomcat-Server) am Localhost-Interface gebunden.

Geben Sie bei der Bestellung der Option "Eigener Serverdienst" an:

  1. den Service User, mit dessen Rechten der Tomcat-Dienst laufen soll (also zum Beispiel "xyz00-tomcat")
  2. wieviele IP-Ports reserviert werden sollen (in der folgenden Anleitung verwenden wir drei nicht-privilegierte Ports:
  • 38005 als "Shutdown"-Schnittstelle
  • 38006 für eine AJP-Listener

Installation

Vorbemerkung: Mit Debian 12 ('Bookworm') wird Tomcat 10 von der Distribution mitgeliefert.

Auf den Hostsharing-Servern ist das Debian-Paket "tomcat10-user" installiert. Es stellt den Apache Tomcat Server in der Version 10.1.x für den Betrieb als normaler (nicht privilegierter) User bereit. Dabei wird die zentral installierte Tomcat-Software benutzt, die über Betriebssystem-Updates mit Sicherheits-Updates versorgt wird.

Für die Installation der Konfigurations-Dateien in Heimat-Verzeichnis des Benutzers wird folgender Befehl mit den Rechten des Service-Users aufgerufen:

xyz00-tomcat@h00:~$ tomcat10-instance-create tomcat

Ich bevorzuge das catalina.sh-Startskript zum Testen:

xyz00-tomcat@h00:~$ cp /usr/share/tomcat10/bin/catalina.sh tomcat/bin/

Dieser Befehl legt ein Verzeichnis "tomcat" mit der üblichen Dateistruktur für einen Tomcat-Server an:

bin
bin/catalina.sh
bin/setenv.sh
bin/shutdown.sh
bin/startup.sh
conf
conf/catalina.properties
conf/context.xml
conf/jaspic-providers.xml
conf/logging.properties
conf/server.xml
conf/tomcat-users.xml
conf/web.xml
logs
policy
policy/catalina.policy
temp
webapps
work

In der Hauptsache muss die Konfigurationsdatei "server.xml" im Verzeichnis "~/tomcat/conf/" angepasst werden.

Beispiel für eine minimale "server.xml":

<?xml version="1.0" encoding="UTF-8"?>
<Server port="38005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector protocol="AJP/1.3" address="127.0.0.1" port="38006" redirectPort="443" secretRequired="false" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="../webapps" unpackWARs="true" autoDeploy="true"></Host>
    </Engine>
  </Service>
</Server>

Angepasst werden müssen:

  • die beiden IP-Ports (im Beispiel 38005 und 38006 am Localhost-Interface)

Deployment einer Anwendung

In der Beispiel-Konfiguration wurde das Verzeichnis $HOME/webapps/ für die Anwendungen konfiguriert. Wir legen dieses Verzeichnis an und kopieren eine minimale Anwendung hinein:

mkdir -p $HOME/webapps/hello/WEB-INF/

Dort legen wir die Datei ~/webapps/hello/WEB-INF/web.xml mit folgendem Inhalt an:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
	id="WebApp_ID" version="3.0">
</web-app>

Dazu eine einfache JSP-Datei ~/webapps/hello/index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="de-de">
<body>
<h1>Hallo Welt</h1>
<p>Java Version: <%= System.getProperty("java.version")  %></p>
</body>
</html>

Nun können wir die HTTP-Requests, die an eine Domain im Paket gesendet werden, an den Tomcat weiterleiten. Das funktioniert über eine .htaccess-Datei, zum Beispiel im Verzeichnis ~/doms/hs-example.de/htdocs-ssl:

DirectoryIndex disabled
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) ajp://127.0.0.1:38006/$1 [proxy,last]

Achtung der IP-Port 38006 muss hier wieder angepasst werden!

Dadurch ist die Mini-Anwendung unter der URL "https://hs-example.de/hello/" erreichbar.

Start des Tomcat Servers

Der Tomcat kann über die Skripte in "~/tomcat/bin/" gestartet und gestoppt werden.

cd ~/tomcat
./bin/startup.sh

Log-Ausgaben des Servers sind in "~/tomcat/logs/catalina.out" zu finden.

Damit der Tomcat bei einem Reboot der Hostsharing-Server automatisch gestartet wird, konfigurieren wir den Prozessmonitor systemd entsprechend.

Wir legen ein Verzeichnis für die Konfiguration des systemd an und legen eine Unit-Konfiguration für einen Service dort ab:

mkdir -p ~/.config/systemd/user

Die Unit-Datei ~/.config/systemd/user/tomcat.service

[Unit]
Description=Tomcat User Service

[Service]
WorkingDirectory=%h/tomcat
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="JAVA_OPTS=-Xms256M -Xmx512M"
ExecStart=%h/tomcat/bin/catalina.sh run
StandardOutput=append:%h/tomcat/logs/catalina.log
StandardError=inherit
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

Auf Wunsch kann SystemD RAM- und CPU-Ressourcen begrenzen. Dazu wird der Abschnitt Service ergänzt:

[Service]
...
MemoryAccounting=true
CPUAccounting=true
MemoryHigh=512M
MemoryMax=768M
CPUQuota=50%

Die letzte Aufgabe ist das Einrichten der Bereinigung für die Log-Dateien.

Dazu lege ich die Konfigurationsdatei .logrotate im $HOME-Verzeichnis an:

/home/pacs/xyz00/users/tomcat/tomcat/logs/catalina.log {
   copytruncate
   compress
   rotate 5
   daily
   missingok
}

Für die Bereinigung der Log-Dateien noch zwei systemd-Timer:

~/.config/systemd/user/logrotate.service

[Unit]
Description=rotate tomcat logs

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate -s /home/pacs/xyz00/users/tomcat/.logrotate.state /home/pacs/xyz00/users/tomcat/.logrotate

~/.config/systemd/user/logrotate.timer

[Unit]
Description=rotate tomcat logs

[Timer]
OnCalendar=1:1
Persistent=True

[Install]
WantedBy=timers.target

~/.config/systemd/user/delete_old_logs.service

[Unit]
Description=delete old log files

[Service]
Type=oneshot
ExecStart=/usr/bin/find /home/pacs/xyz00/users/tomcat/tomcat/logs -type f -mmin +10080 -delete

~/.config/systemd/user/delete_old_logs.timer

[Unit]
Description=delete old log files

[Timer]
OnCalendar=14:3
Persistent=True

[Install]
WantedBy=timers.target


Timer aktivieren und starten:

$ systemctl --user enable logrotate.timer
$ systemctl --user start logrotate.timer
$ systemctl --user enable delete_old_logs.timer
$ systemctl --user start delete_old_logs.timer

Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.

Links