Tomcat Installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
 
(8 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 24: Zeile 24:
== Installation ==  
== 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.
Vorbemerkung: Mit Debian 12 ('Bookworm') wird Tomcat 10 von der Distribution mitgeliefert.  


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


Zeile 33: Zeile 33:
mit den Rechten des Service-Users aufgerufen:
mit den Rechten des Service-Users aufgerufen:


    xyz00-tomcat@h00:~$ tomcat9-instance-create tomcat
<syntaxhighlight lang="bash">
xyz00-tomcat@h00:~$ tomcat10-instance-create tomcat
</syntaxhighlight>


Ich bevorzuge das catalina.sh-Startskript zum Testen:
Ich bevorzuge das catalina.sh-Startskript zum Testen:


    xyz00-tomcat@h00:~$ cp /usr/share/tomcat9/bin/catalina.sh tomcat/bin/
<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:
Dieser Befehl legt ein Verzeichnis "tomcat" mit der üblichen Dateistruktur für einen Tomcat-Server an:


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


In der Hauptsache muss die Konfigurationsdatei "server.xml" im Verzeichnis "~/tomcat/conf/" angepasst werden.
In der Hauptsache muss die Konfigurationsdatei "server.xml" im Verzeichnis "~/tomcat/conf/" angepasst werden.
Zeile 67: Zeile 71:
Beispiel für eine minimale "server.xml":
Beispiel für eine minimale "server.xml":


<pre>
<syntaxhighlight lang="xml" line>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<Server port="38005" shutdown="SHUTDOWN">
<Server port="38005" shutdown="SHUTDOWN">
Zeile 92: Zeile 96:
   </Service>
   </Service>
</Server>
</Server>
</pre>
</syntaxhighlight>


Angepasst werden müssen:
Angepasst werden müssen:
Zeile 101: Zeile 105:
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:
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/
<syntaxhighlight lang="bash">
mkdir -p $HOME/webapps/hello/WEB-INF/
</syntaxhighlight>


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


<pre>
<syntaxhighlight lang="xml" line>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<web-app  
<web-app  
Zeile 114: Zeile 120:
id="WebApp_ID" version="3.0">
id="WebApp_ID" version="3.0">
</web-app>
</web-app>
</pre>
</syntaxhighlight>


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


<pre>
<syntaxhighlight lang="html" line>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<!DOCTYPE html>
Zeile 127: Zeile 133:
</body>
</body>
</html>
</html>
</pre>
</syntaxhighlight>


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


<pre>
<syntaxhighlight lang="apache" line>
DirectoryIndex disabled
DirectoryIndex disabled
RewriteEngine On
RewriteEngine On
Zeile 139: Zeile 145:
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*) ajp://127.0.0.1:38006/$1 [proxy,last]
RewriteRule ^(.*) ajp://127.0.0.1:38006/$1 [proxy,last]
</pre>
</syntaxhighlight>


Achtung der IP-Port 38006 muss hier wieder angepasst werden!
Achtung der IP-Port 38006 muss hier wieder angepasst werden!
Zeile 149: Zeile 155:
Der Tomcat kann über die Skripte in "~/tomcat/bin/" gestartet und gestoppt werden.
Der Tomcat kann über die Skripte in "~/tomcat/bin/" gestartet und gestoppt werden.


<pre>
<syntaxhighlight lang="bash">
cd ~/tomcat
cd ~/tomcat
./bin/startup.sh
./bin/startup.sh
</pre>
</syntaxhighlight>


Log-Ausgaben des Servers sind in "~/tomcat/logs/catalina.out" zu finden.
Log-Ausgaben des Servers sind in "~/tomcat/logs/catalina.out" zu finden.
Zeile 161: Zeile 167:
Wir legen ein Verzeichnis für die Konfiguration des ''systemd'' an und legen eine Unit-Konfiguration für einen Service dort ab:
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
<syntaxhighlight lang="bash">
mkdir -p ~/.config/systemd/user
</syntaxhighlight>


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


[Unit]
<syntaxhighlight lang="ini" line>
Description=Tomcat User 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
MemoryAccounting=true
CPUAccounting=true
MemoryHigh=768K
MemoryMax=1024K
[Install]
WantedBy=default.target


[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
</syntaxhighlight>
Auf Wunsch kann ''SystemD'' RAM- und CPU-Ressourcen begrenzen. Dazu wird der Abschnitt ''Service'' ergänzt:
<syntaxhighlight lang="ini" line>
[Service]
...
MemoryAccounting=true
CPUAccounting=true
MemoryHigh=512M
MemoryMax=768M
CPUQuota=50%
</syntaxhighlight>


Die letzte Aufgabe ist das Einrichten der Bereinigung für die Log-Dateien.
Die letzte Aufgabe ist das Einrichten der Bereinigung für die Log-Dateien.
Zeile 192: Zeile 209:
Dazu lege ich die Konfigurationsdatei ''.logrotate'' im $HOME-Verzeichnis an:
Dazu lege ich die Konfigurationsdatei ''.logrotate'' im $HOME-Verzeichnis an:


<pre>
<syntaxhighlight lang="bash" line>
/home/pacs/xyz00/users/tomcat/tomcat/logs/catalina.log {
/home/pacs/xyz00/users/tomcat/tomcat/logs/catalina.log {
   copytruncate
   copytruncate
Zeile 200: Zeile 217:
   missingok
   missingok
}
}
</pre>
</syntaxhighlight>
 
Für die Bereinigung der Log-Dateien noch zwei systemd-Timer:
 
~/.config/systemd/user/logrotate.service
<syntaxhighlight lang="bash" line>
[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
</syntaxhighlight>
 
~/.config/systemd/user/logrotate.timer
<syntaxhighlight lang="ini" line>
[Unit]
Description=rotate tomcat logs
 
[Timer]
OnCalendar=1:1
Persistent=True
 
[Install]
WantedBy=timers.target
</syntaxhighlight>
 
~/.config/systemd/user/delete_old_logs.service
<syntaxhighlight lang="bash" line>
[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
</syntaxhighlight>
 
~/.config/systemd/user/delete_old_logs.timer
<syntaxhighlight lang="ini" line>
[Unit]
Description=delete old log files
 
[Timer]
OnCalendar=14:3
Persistent=True
 
[Install]
WantedBy=timers.target
</syntaxhighlight>


Für die Bereinigung der Log-Dateien noch eine ''crontab'':


<pre>
Timer aktivieren und starten:
PATH=/usr/local/bin:/usr/bin:/bin
<syntaxhighlight lang="bash" line>
HOME=/home/pacs/xyz00/users/tomcat
$ systemctl --user enable logrotate.timer
MAILTO=ich@meine-domain.de
$ systemctl --user start logrotate.timer
# m h  dom mon dow  command
$ systemctl --user enable delete_old_logs.timer
1 1 * * * /usr/sbin/logrotate -s $HOME/.logrotate.state $HOME/.logrotate
$ systemctl --user start delete_old_logs.timer
14 3 * * * /usr/bin/find $HOME/tomcat/logs -type f -mmin +10080 -delete
</syntaxhighlight>
</pre>


Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.
Dann gehen wir daran unsere Anwendungen im Tomcat zu deployen.
Zeile 220: Zeile 283:
*[http://tomcat.apache.org/tomcat-9.0-doc/index.html Apache Tomcat Dokumentation (Version 9.0, Englisch)]
*[http://tomcat.apache.org/tomcat-9.0-doc/index.html Apache Tomcat Dokumentation (Version 9.0, Englisch)]
*[http://wiki.apache.org/tomcat/FrontPage Apache Tomcat Wiki (Englisch)]
*[http://wiki.apache.org/tomcat/FrontPage Apache Tomcat Wiki (Englisch)]
*[[Monit installieren]]
*[https://github.com/tpokorra/Hostsharing-Ansible-Tomcat Ansible Playbook für Hostsharing]
*[https://github.com/tpokorra/Hostsharing-Ansible-Tomcat Ansible Playbook für Hostsharing]



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