Tomcat Installieren: Unterschied zwischen den Versionen

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


=== Allgemeine Hinweise ===
[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 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.
Mit Hilfe von Apache Tomcat ist bei Hostsharing das Hosting von komplexen Java Web-Applikationen problemlos möglich.


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.
== Spezielle Installation bei Hostsharing ==


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


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.
Dazu muss für jede Tomcat-Instanz die Option "Betrieb eines eigenen Serverdienstes" gebucht werden. Im Bereich des Shared Hosting ist die Option kostenpflichtig.  


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.
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.


=== Systemumgebung und verwendete Versionen ===
Geben Sie bei der Bestellung der Option "Eigener Serverdienst" an:


Version der Java Laufzeitumgebung: 1.6.0_22-b04
# 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


Version des Apache Tomcat: 5.5.31
== 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:


Das Start- und Stop-Skript /opt/tomcat/bin/rc-tomcat setzt die entsprechenden bzw. notwendigen Umgebungsvariablen automatisch.
<syntaxhighlight lang="bash">
xyz00-tomcat@h00:~$ cp /usr/share/tomcat10/bin/catalina.sh tomcat/bin/
</syntaxhighlight>


== Installation ==
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