Tomcat Installieren
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:
- 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
Installation
Vorbemerkung: Mit Debian 12 ('Bookworm') wird Tomcat 10 von der Distribution mitgeliefert. Die folgende Anleitung gilt sinngemäß, ersetze jeweils 'tomcat9' durch 'tomat10' in den Namen der Skripte und Verzeichnisse.
Auf den Hostsharing-Servern ist das Debian-Paket "tomcat9-user" installiert. Es stellt den Apache Tomcat Server in der Version 9.0.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:~$ tomcat9-instance-create tomcat
Ich bevorzuge das catalina.sh-Startskript zum Testen:
xyz00-tomcat@h00:~$ cp /usr/share/tomcat9/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 conf/Catalina/localhost 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-11-openjdk-amd64" Environment="JAVA_OPTS=-Xms256M -Xmx512M" ExecStart=%h/tomcat/bin/catalina.sh run StandardOutput=file:%h/tomcat/logs/catalina.log StandardError=inherit Restart=always PrivateTmp=true NoNewPrivileges=true [Install] WantedBy=default.target
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 eine crontab:
PATH=/usr/local/bin:/usr/bin:/bin HOME=/home/pacs/xyz00/users/tomcat MAILTO=ich@meine-domain.de # m h dom mon dow command 1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate 14 3 * * * /usr/bin/find $HOME/tomcat/logs -type f -mmin +10080 -delete
Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.
Links
- Apache Tomcat Homepage (Englisch)
- Apache Tomcat Dokumentation (Version 9.0, Englisch)
- Apache Tomcat Wiki (Englisch)
- Monit installieren
- Ansible Playbook für Hostsharing