Tomcat – Application-Server

Tomcat ist ein Java Application Server welcher in Java/JavaScript geschriebene Programme ausführt.

Als erstes gilt es eine Umgebung für den Appl-Server zu schaffen. Wir benötigen eine geeignete JavaRuntime Umgebung.

Sucht euch bitte die passende Version auf der Seite: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Für den Raspberry Pi wäre das:
http://www.oracle.com/technetwork/java/embedded/downloads/javase/index.html – „ARMv6/7 Linux – Headless – Client Compiler EABI, VFP, HardFP ABI, Little Endian1“.

Da Oracle unbedingt Cookie setzen will zum abnicken der AGBs kann man das ganze nicht ganz so einfach mit wget laden man braucht noch was drumherum:

RaspberryPi
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/" "http://download.oracle.com/otn/java/ejre/7u51-b13/ejre-7u51-fcs-b13-linux-arm-vfp-hflt-client_headless-18_dec_2013.tar.gz

für Linux 64bit:
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http://www.oracle.com/" "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-x64.tar.gz"

Installation von Java auf eurem System:

mkdir /usr/lib/jvm
cd /usr/lib/jvm
tar xfz jre-7u51-linux-x64.tar.gz #64bit Linux
tar xfz jdk-7u51-linux-arm-vfp-hflt.tar.gz #RaspberryPi
ln -s /usr/lib/jvm/jre1.7.0_51/ /usr/lib/jvm/java
update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/java/bin/java" 1 #Oracle Java zum Standard

Ein „java -version“ sollte soetwas ausgeben(auf RaspberryPi):
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode)

Damit wäre die umgebung für Tomcat fertig. Jetzt geht es mit der eigentlichen installation von Tomcat los.

„Aktuellen“ Tomcat herunterladen http://tomcat.apache.org/download-70.cgi
wget http://www.eu.apache.org/dist/tomcat/tomcat-7/v7.0.42/bin/apache-tomcat-7.0.42.tar.gz

Ich installiere es auf einer eigenen partition welche ich nach /tomcat mounte.

cd /
tar xfz apache-tomcat-7.0.42.tar.gz
mv /apache-tomcat-7.0.42 /tomcat
chown -R tomcat:tomcat /tomcat
chmod +x /tomcat/bin/*.sh

Jetzt kann man ihn schon fast starten, hier ein Script welches ich mir auch nur von „http://www.SysADMINsLife.com“ kopiert und etwas angepasst habe:
tomcat:

### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: $named
# Should-Stop: $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start Tomcat Server
# Description: Start the Tomcat Server
### END INIT INFO
######################################
# customize values for your needs
 
JRE_HOME="";
JAVA_HOME="/usr/lib/jvm/java";
 
TOMCAT_USER=tomcat;
TOMCAT_PATH=/tomcat;
SHUTDOWN_TIME=60
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=8090 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
export JAVA_OPTS
export CATALINA_OPTS
 
if [ -n "$JAVA_HOME" ] && [ -n "$JRE_HOME" ] ; then
        echo "JAVA_HOME and JRE_HOME is set.
Choose one of them.
 
JAVA_HOME=$JAVA_HOME
JRE_HOME=$JRE_HOME
 
Abort starting Tomcat."
        exit 1;
fi
 
if [ -n "$JAVA_HOME" ] ; then
        JAVA_VERSION=$($JAVA_HOME/bin/java -version 2>&1|grep "java version"|awk {'print $3'}|cut -d"." -f 2);
        export JAVA_HOME;
fi
 
if [ -n "$JRE_HOME" ] ; then
        JAVA_VERSION=$($JRE_HOME/bin/java -version 2>&1|grep "java version"|awk {'print $3'}|cut -d"." -f 2);
        export JRE_HOME;
fi
 
if [ $JAVA_VERSION -gt 7 ] ; then
        JAVA_OPTS="-Djava.awt.headless=true -Xms64m -Xmx256m";
else
        JAVA_OPTS="-Djava.awt.headless=true -Xms64m -Xmx256m -XX:MaxPermSize=128m";
fi
 
tomcat_pid() {
        echo `ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }'`
}
 
start() {
        if [ -f $TOMCAT_PATH/bin/startup.sh ];
        then
                pid=$(tomcat_pid)
                if [ -n "$pid" ]
                then
                        echo "Start aborted because Tomcat already running with pid: $pid"
                else
                        echo "Starting Tomcat"
                        /bin/su $TOMCAT_USER -c $TOMCAT_PATH/bin/startup.sh
                fi
        else
                echo "$TOMCAT_PATH/bin/startup.sh does not exist - Please check your config"
        fi
 
        return 0
}
 
stop() {
        if [ -f $TOMCAT_PATH/bin/shutdown.sh ];
        then
                pid=$(tomcat_pid)
                if [ -n "$pid" ]
                then
                        echo "Stopping Tomcat"
                        /bin/su $TOMCAT_USER -c $TOMCAT_PATH/bin/shutdown.sh
                        let waitfor=$SHUTDOWN_TIME
                        count=0;
                        until [ `ps -p $pid | grep -c $pid` = '0' ] || [ $count -gt $waitfor ]
                        do
                                echo -n -e "\rWaiting $count of $waitfor seconds for Tomcat to exit until process kill ";
                                sleep 1
                                let count=$count+1;
                        done
                        if [ $count -gt $waitfor ]; then
                                echo -n -e "\nKilling Tomcat which didn't stop after $SHUTDOWN_TIME seconds"
                                kill -9 $pid
                        fi
                else
                        echo "Your Tomcat Instance is not running"
                fi
        else
                echo "$TOMCAT_PATH/bin/shutdown.sh does not exist - Please check your config"
        fi
        return 0
}
 
case $1 in
start)
        start
;;
stop)
        stop
;;
restart)
        stop
        start
;;
status)
        pid=$(tomcat_pid)
        if [ -n "$pid" ]
        then
                echo "Your Tomcat Instance is running with pid: $pid"
        else
                echo "Your Tomcat Instance is not running"
        fi
;;
*)
        echo "Usage: $0 { start | stop | restart | status }"
;;
esac
exit 0

Dieses Skript noch ausführbar machen chmod +x tomcat und dann ausführen ./tomcat start.

Nun im Logfile verfolgen ob er wirklich startet mit tail -f /tomcat/logs/catalina.out und warten bis folgende Ausgabe erscheint:

Mrz 19, 2014 2:22:05 PM org.apache.coyote.AbstractProtocol start
Information: Starting ProtocolHandler ["http-bio-8282"]
Mrz 19, 2014 2:22:05 PM org.apache.coyote.AbstractProtocol start
Information: Starting ProtocolHandler ["ajp-bio-8009"]
Mrz 19, 2014 2:22:05 PM org.apache.catalina.startup.Catalina start
Information: Server startup in 2589 ms

Jetzt kann man im Browser unter der URL „http://<servername>:8080“ den Tomcat bewundern. Wenn er läuft stoppen mit ./tomcat stop und noch etwas hand anlegen.
Als ersters solltet ihr das Script nach /etc/init.d/ kopieren und mit update-rc.d tomcat defaults 99 01 dem init-Prozess bekannt machen bzw. automatisch starten lassen.

1. Benutzer anlegen für „Server-Status/Manager GUI“:
vi /tomcat/conf/tomcat-users.xml und folgendes in den Abschnitt <tomcat-users> hinzufügen:

<role rolename="manager"/>;
   <role rolename="manager-gui"/>
   <role rolename="admin"/>
   <user username="<USERNAME>" password="<PASSWORD>" roles="admin,manager,admin-gui,manager-gui"/>

 

und schon könnt ihr euch unter der URL „http://<servername>:8080/manager/“ mit den Credentials anmelden.

2. Wenn euch das Standard-Logging welches für jeden Tag ein eigenes Log öffnet stört kann folgendes hinzufügen:
/tomcat/conf/logging.properties:

1catalina.org.apache.juli.FileHandler.rotatable = false
2localhost.org.apache.juli.FileHandler.rotatable = false
3manager.org.apache.juli.FileHandler.rotatable = false
4host-manager.org.apache.juli.FileHandler.rotatable = false

1catalina.org.apache.juli.FileHandler.suffix = log
2localhost.org.apache.juli.FileHandler.suffix = log
3manager.org.apache.juli.FileHandler.suffix = log
4host-manager.org.apache.juli.FileHandler.suffix = log

3. Wenn ihr euren Tomcat nicht direkt an das Netz hängen wollt könnt ihr die Anfragen vorher mit dem Apache oder nginx abfangen und an den Tomcat weiterleiten so ist kann man noch einige Dinge beeinflussen wie Rewrite der URL, vhosts usw.

Ich nutze den nginx als ReverseProxy für den Tomcat. Der Tomcat darf nicht auf dem port vom nginx laufen.

Hier müssen am Tomcat und an nginx Veränderungen vorgenommen werden.

Am Tomcat:
/tomcat/conf/server.xml (innerhalb von Server->Service->Engine->Host):
Eventuell Port ändern:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

hier ‚port=“8080″‚ auf ein nicht besetzten über 1024 liegenden Port wechseln.

Wenn im logging korrekte IPs erscheinen sollen dies hinzufügen:
/tomcat/conf/server.xml:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
                internalProxies="127\.0\.0\.1"
                remoteIpHeader="x-forwarded-for"
                proxiesHeader="x-forwarded-by"
                trustedProxies="127.0.0.1"
                protocolHeader="x-forwarded-proto">

Dies sorgt dafür das ein vom Proxy/Reverse Proxy gesetzter „x-forwarded-for“ Eintrag im Header welcher die echte IP des anfragenden Clients ist auswertet und verarbeitet. So ist im access-log des Tomcat die echte Client-IP gesetzt und nicht die des Proxy.

Damit sind die arbeiten an der Tomcat-konfig abgeschlossen.
Der nginx wird wie folgt zum Reverse Proxy konfiguriert:
/etc/nginx/sites-available/default:

server {
        listen *:80;
        server_name ;
        root /tomcat/webapps/;

        location / {

                proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Proto $scheme;
                proxy_set_header   Host              $http_host;
                proxy_set_header   X-Real-IP         $remote_addr;
                proxy_set_header   CLIENT_IP         $remote_addr;
                proxy_pass http://127.0.0.1:8080/;
        }
}

Beide Dienste werden neugestartet bzw. beim nginx reloaded und unter der URL "http://<servername>" sollte euer Tomcat über nginx erreichbar sein.

4. Der Tomcat kann über die Zeile "JAVA_OPTS="-Djava.awt.headless=true -Xms32m -Xmx64m -XX:MaxPermSize=96m"" im Start-Skript konfiguriert werden.

Hier wurde festgelegt das Java mit 32MByte initialisiert wird(-Xms) und maximal 64MByte verbrauchen darf(-Xmx). Mit "-XX:MaxPermSize=96m" legt man den PermGenSpace fest dies ist der „Heap Space“ hier werden die Classen abgelegt. Bei grösseren Projekten kann es zu OutOfMemory kommen weil nicht alle Classen geladen werden können. Wird dieser nicht angegeben wird der Standard benutzt: 64MByte.

Zu guter letzt sollte dem Tomcat noch ein Programm hinzugefügt werden.
Lade dazu „psi probe“ herunter: https://code.google.com/p/psi-probe/ entpacken die zip-Datei und kopieren die enthaltene probe.war-Datei nach /tomcat/webapps/. Führe wieder ein tail -f /tomcat/logs/catalina.out aus und sehe zu wie die App. deployed wird. Nach erfolgreicher Installation kann man dies unter http://<servername>/probe/ bewundern.

Update 19.07.:

Wenn man das jdk 8 haben möchte lädt man dies so:
curl -L --header "Cookie: s_nr=1405796959315; s_cc=true; gpw_e24=http%3A%2F%2Fwww.oracle.com%2Ftechnetwork%2Fjava%2Fjavase%2Fdownloads%2Fjdk8-arm-downloads-2187472.html; s_sq=oracleotnlive%2Coracleglobal%3D%2526pid%253Dotn%25253Aen-us%25253A%25252Fjava%25252Fjavase%25252Fdownloads%25252Fjdk8-arm-downloads-2187472.html%2526pidt%253D1%2526oid%253Dfunctiononclick(event)%25257BacceptAgreement(window.self%25252C'jdk-8-oth-JPR')%25253B%25257D%2526oidt%253D2%2526ot%253DRADIO; oraclelicense=accept-securebackup-cookie; testSessionCookie=Enabled" http://download.oracle.com/otn-pub/java/jdk/8u6-b23/jdk-8u6-linux-arm-vfp-hflt.tar.gz -o jdk-8u6-linux-arm-vfp-hflt.tar.gz