Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


tomcat_administration:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
tomcat_administration:start [2015/08/18 10:55]
127.0.0.1 Externe Bearbeitung
tomcat_administration:start [2022/05/13 15:09] (aktuell)
marco.staub
Zeile 1: Zeile 1:
-====== Tomcat ====== +====== Tomcat ​Administration ​======
-[[mod_jk]] +
-===== Java Installation ===== +
-==== Pakete ==== +
-Ubuntu 8.04, Debian Lenny: +
-  sun-java6-jdk+
  
-Ubuntu 10.04: +===== Tag 1 =====
-  openjdk-6-jdk +
-\\ +
-\\ +
-Aufgrund der geänderten Oracle Lizenzbestimmungen,​ wurden die Oracle  +
-Java Packete aus den Standard-Repositories entfernt. non-free wird  +
-für die bequeme Installation benötigt, /​etc/​apt/​sources.list anpassen.+
  
-Debian 6 Squeeze: +==== 1.- tomcat.sh ====
-  deb http://​ftp.de.debian.org/​debian/​ squeeze main non-free +
-  deb-src http://​ftp.de.debian.org/​debian/​ squeeze main non-free +
- +
-  deb http://​security.debian.org/​ squeeze/​updates main non-free +
-  deb-src http://​security.debian.org/​ squeeze/​updates main non-free +
- +
-  # squeeze-updates,​ previously known as '​volatile'​ +
-  deb http://​ftp.de.debian.org/​debian/​ squeeze-updates main non-free +
-  deb-src http://​ftp.de.debian.org/​debian/​ squeeze-updates main non-free +
- +
- +
-Mint 13: +
-  deb http://​packages.linuxmint.com/​ maya main upstream import non-free +
-===== Java Konfiguration ===== +
-Debian / Ubuntu: +
-  update-alternatives --config java +
-''​java-6-sun''​ auswählen +
- +
-===== Oracle Java 7 Installation ===== +
-  java -version +
-  sudo apt-get purge openjdk* +
-  sudo add-apt-repository ppa:​webupd8team/​java +
-  sudo apt-get update +
-  sudo apt-get install oracle-java7-installer +
-  java -version +
- +
-===== Alternative Oracle Java 7 Installation ===== +
-   +
-  sudo mkdir -p /​usr/​lib/​jvm +
-  cd ~/​Downloads +
-  sudo cp jdk-7u21-linux-i586.tar.gz /​usr/​lib/​jvm +
-  cd /​usr/​lib/​jvm +
-  sudo tar zxvf jdk-7u21-linux-i586.tar.gz +
-  sudo rm jdk-7u21-linux-i586.tar.gz +
-  ls -l +
-  #​jdk1.7.0_21 +
-  sudo update-alternatives --install "/​usr/​bin/​javac"​ "​javac"​ "/​usr/​lib/​jvm/​jdk1.7.0_21/​bin/​javac" ​1 +
-  sudo update-alternatives --install "/​usr/​bin/​java"​ "​java"​ "/​usr/​lib/​jvm/​jdk1.7.0_21/​bin/​java"​ 1 +
-  sudo update-alternatives --set "​javac"​ "/​usr/​lib/​jvm/​jdk1.7.0_21/​bin/​javac"​ +
-  sudo update-alternatives --set "​java"​ "/​usr/​lib/​jvm/​jdk1.7.0_21/​bin/​java"​ +
- +
-  sudo nano /​etc/​profile +
-''/​etc/​profile''​ : ( anhängen ) +
-<code bash> +
-JAVA_HOME=/​usr/​lib/​jvm/​jdk1.7.0_21 +
-PATH=$PATH:​$JAVA_HOME/​bin +
-export JAVA_HOME +
-export PATH +
-</​code>​ +
-  . /​etc/​profile +
-  java –version +
-  java version 1.7.0_21 +
-  #Java(TM) SE Runtime Environment (build 1.7.0_21-b12) +
-  #Java HotSpot(TM) Client VM (build 23.21-b01, mixed mode) +
-  javac –version +
-  #javac 1.7.0_21 +
- +
- +
- +
-===== Tomcat Installation von Hand ===== +
-Tomcat 6: Linux .tar.gz runterladen von: +
-http://tomcat.apache.org/​download-60.cgi z.B.: +
-  cd +
-  mkdir workshop +
-  cd workshop +
-  wget http://​www.osnt.org/​apache/​tomcat/​tomcat-6/​v6.0.38/​bin/​apache-tomcat-6.0.38.tar.gz +
-  tar xzf apache-tomcat-6.0.38.tar.gz +
-  ln -s apache-tomcat-6.0.38 apache-tomcat +
- +
-Tomcat 7: Linux .tar.gz runterladen von: +
-http://​tomcat.apache.org/​download-70.cgi z.B.: +
-  cd +
-  mkdir workshop +
-  cd workshop +
-  wget http://​www.osnt.org/​apache/​tomcat/​tomcat-7/​v7.0.52/​bin/​apache-tomcat-7.0.52.tar.gz +
-  tar xzf apache-tomcat-7.0.52.tar.gz +
-  ln -s apache-tomcat-7.0.52 apache-tomcat +
- +
-Tomcat 8: Linux .tar.gz runterladen von: +
-http://​tomcat.apache.org/​download-80.cgi z.B.: +
-  cd +
-  mkdir workshop +
-  cd workshop +
-  wget http://​www.osnt.org/​apache/​tomcat/​tomcat-8/​v8.0.24/​bin/​apache-tomcat-8.0.24.tar.gz +
-  tar xzf apache-tomcat-8.0.24.tar.gz +
-  ln -s apache-tomcat-8.0.24 apache-tomcat +
- +
-===== Tomcat Minimal Konfiguration ===== +
-  cd +
-  cd workshop +
-  mkdir node73 +
-  cd node73 +
-  mkdir bin conf webapps logs work temp +
-  # File server und JSP Support only! +
-  #cp ../​apache-tomcat/​conf/​web.xml conf/ +
-''​conf/​server.xml''​ : ( komplett, kurze Version ) +
-<code xml> +
-<?xml version='​1.0'​ encoding='​utf-8'?>​ +
-<Server port="​${port.prefix}05"​ shutdown="​SHUTDOWN">​ +
-  <​Listener className="​org.apache.catalina.core.JasperListener"​ /> +
-  <​Listener className="​org.apache.catalina.core.JreMemoryLeakPreventionListener"​ /> +
- +
-  <Service name="​Catalina">​ +
-    <​Connector port="​${port.prefix}80"​  +
-               ​protocol="​HTTP/​1.1"​  +
-               />​ +
-    <Engine name="​Catalina"​ defaultHost="​localhost"​ jvmRoute="​node${port.prefix}">​ +
-      <Host name="​localhost" ​ appBase="​webapps"​ +
-            unpackWARs="​true"​ autoDeploy="​true"​ > +
-      </​Host>​ +
-    </​Engine>​ +
-  </​Service>​ +
-</​Server>​ +
-</​code>​ +
- +
- +
-''​conf/​server.xml''​ : ( Tomcat 8 ) +
-<code xml> +
-<?xml version='​1.0'​ encoding='​utf-8'?>​ +
-<Server port="​${port.prefix}05"​ shutdown="​SHUTDOWN">​ +
-  <​Listener className="​org.apache.catalina.startup.VersionLoggerListener"​ /> +
-  <​Listener className="​org.apache.catalina.core.JreMemoryLeakPreventionListener"​ /> +
- +
-  <Service name="​Catalina">​ +
-    <​Connector port="​${port.prefix}80"​ +
-      protocol="​HTTP/​1.1"​ +
-    /> +
-    <Engine name="​Catalina"​ +
-      defaultHost="​localhost"​ jvmRoute="​node${port.prefix}">​ +
-      <Host name="​localhost"​ +
-          appBase="​webapps">​ +
-      </​Host>​ +
-    </​Engine>​ +
-  </​Service>​ +
-</​Server>​ +
- +
-</​code>​ +
-''​bin/​startup.sh''​ : +
-<code bash> +
-#​!/​bin/​bash +
-export CATALINA_HOME=~/​workshop/​apache-tomcat +
-export CATALINA_BASE=~/​workshop/​node73 +
-export JAVA_OPTS="​-Dport.prefix=73" +
-export CATALINA_OPTS="​-Xmx128m"​ +
-export CATALINA_PID="​${CATALINA_BASE}/​logs/​tomcat.pid"​ +
-${CATALINA_HOME}/​bin/​catalina.sh start $@ +
-</​code>​ +
- +
-''​bin/​shutdown.sh''​ : +
-<code bash> +
-#​!/​bin/​bash +
-export CATALINA_HOME=~/​workshop/​apache-tomcat +
-export CATALINA_BASE=~/​workshop/​node73 +
-export JAVA_OPTS="​-Dport.prefix=73"​ +
-export CATALINA_PID="​${CATALINA_BASE}/​logs/​tomcat.pid"​ +
-${CATALINA_HOME}/​bin/​catalina.sh stop $@ +
-</​code>​ +
-Startfähigkeit herstellen +
-<code bash> +
-  chmod +x bin/​startup.sh +
-  #cp -a bin/​startup.sh bin/​shutdown.sh +
-  chmod +x bin/​shutdown.sh +
-</​code>​ +
- +
-Verzeichnisbaum nach dem Start+
 <​code>​ <​code>​
-├── ​bin +#!/bin/sh
-│   ├── shutdown.sh +
-│   └── startup.sh +
-├── conf +
-│   ├── Catalina +
-│   │   └── localhost +
-│   └── server.xml +
-├── logs +
-│   ├── catalina.out +
-│   └── tomcat.pid +
-├── temp +
-├── webapps +
-└── work +
-</code> +
-Check der server.xml ab Apache Tomcat 7+
  
-''​bin/​configtest.sh''​ : +### Start Config ###
-<code bash> +
-#!/​bin/​bash +
-export CATALINA_HOME=~/​workshop/​apache-tomcat +
-export CATALINA_BASE=~/​workshop/​node73 +
-export JAVA_OPTS="​-Dport.prefix=73"​ +
-${CATALINA_HOME}/​bin/​catalina.sh configtest $@ +
-</​code>​+
  
-''​conf/​web.xml''​ +TOMCAT_VERSION=10.0.20 
-<​code>​ +INSTANCE_NAME=workshop
-<web-app xmlns="​http://​java.sun.com/​xml/​ns/​javaee"​ +
-  ​xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ +
-  xsi:​schemaLocation="​http://​java.sun.com/​xml/​ns/​javaee +
-                      http://​java.sun.com/​xml/​ns/​javaee/​web-app_3_0.xsd"​ +
-  version="​3.0">​ +
-  <​servlet>​ +
-        <​servlet-name>​default</​servlet-name>​ +
-        <​servlet-class>​org.apache.catalina.servlets.DefaultServlet</​servlet-class>​ +
-        <​init-param>​ +
-            <​param-name>​debug</​param-name>​ +
-            <​param-value>​0</​param-value>​ +
-        </​init-param>​ +
-        <​init-param>​ +
-            <​param-name>​listings</​param-name>​ +
-            <​param-value>​false</​param-value>​ +
-        </​init-param>​ +
-        <​load-on-startup>​1</​load-on-startup>​ +
-    </​servlet>​+
  
-    <​servlet-mapping>​ +### End Config ####
-        <​servlet-name>​default</​servlet-name>​ +
-        <​url-pattern>/</​url-pattern>​ +
-    </​servlet-mapping>​ +
-</​web-app>​ +
-</​code>​+
  
-<​code>​ +CATALINA_HOME=/opt/tomcat/products/​${TOMCAT_VERSION} 
-mkdir webapps/ROOT +CATALINA_BASE=/​opt/​tomcat/​instances/${INSTANCE_NAME}
-echo "​hello"​ >webapps/ROOT/index.html +
-</code>+
  
-Ergebnis einer index.html Auslieferung +export CATALINA_HOME 
-<​code>​nutzer18@notebook18:​~/​workshop/​node73/​conf$ telnet 127.0.0.1 7380 +export CATALINA_BASE
-Trying 127.0.0.1... +
-Connected to 127.0.0.1. +
-Escape character is '​^]'​. +
-GET /index.html HTTP/​1.0 ​+
  
-HTTP/1.1 200 OK +case "​$1" ​in 
-Server: Apache-Coyote/​1.1 +start
-Accept-Ranges:​ bytes +        $CATALINA_HOME/​bin/​startup.sh
-ETag: W/"6-1394459464000"​ +
-Last-Modified:​ Mon, 10 Mar 2014 13:51:04 GMT +
-Content-Length:​ 6 +
-Date: Mon, 10 Mar 2014 13:59:42 GMT +
-Connection: close +
- +
-hello +
-Connection closed by foreign host. +
-nutzer18@notebook18:​~/​workshop/​node73/​confpwd +
- +
-</​code>​ +
- +
-Mimetypes +
-''​conf/​web.xml''​ +
-<​code>​ +
-<web-app ....> +
-...  +
-  <!-- Nach servlet-mapping --> +
-  <​mime-mapping>​ +
-        <​extension>​css</​extension>​ +
-        <​mime-type>​text/​css</​mime-type>​ +
-  </​mime-mapping>​ +
-  <​mime-mapping>​ +
-        <​extension>​ico</​extension>​ +
-        <​mime-type>​image/​x-icon</​mime-type>​ +
-  </​mime-mapping>​ +
-  <​mime-mapping>​ +
-        <​extension>​html</​extension>​ +
-        <​mime-type>​text/​html</​mime-type>​ +
-  </​mime-mapping>​ +
-  <​mime-mapping>​ +
-        <​extension>​jpg</​extension>​ +
-        <​mime-type>​image/​jpeg</​mime-type>​ +
-  </​mime-mapping>​ +
-  <​mime-mapping>​ +
-        <​extension>​js</​extension>​ +
-        <​mime-type>​application/​javascript</​mime-type>​ +
-  </​mime-mapping>​ +
-  <​mime-mapping>​ +
-        <​extension>​json</​extension>​ +
-        <​mime-type>​application/​json</​mime-type>​ +
-  </​mime-mapping>​ +
-   <​mime-mapping>​ +
-       <​extension>​png</​extension>​ +
-       <​mime-type>​image/​png</​mime-type>​ +
-   </​mime-mapping>​ +
-   <​mime-mapping>​ +
-       <​extension>​xml</​extension>​ +
-       <​mime-type>​application/​xml</​mime-type>​ +
-   </​mime-mapping>​ +
-... +
-<​web-app>​ +
-</​code>​ +
- +
-oder einfacher alles aus der Distribution übernehmen:​) +
- +
-<​code>​ +
-cd workshop/​node73 +
-cp ../​apache-tomcat/​conf/​web.xml conf/​web.xml +
-bin/​shutdown.sh -force +
-bin/​startup.sh +
-</​code>​ +
- +
-==== Hinweis zur server.xml Konfiguration ==== +
-Der Connector Parameter "​HTTP/​1.1" ​steht für den Alias <​code>​org.apache.coyote.http11.Http11Protocol</​code>​ wenn kein APR Listener erfolgreich den APR Native Libs gefunden hat. Wenn das APR initialisiert werden konnte, wird der ProtokollHandler auf die Klasse <​code>​org.apache.coyote.http11.Http11AprProtocol</​code>​ gesetzt. Ähnliches gilt für den AJP/1.3 Alias. Das Projekt Apache Portable Runtime ist ein C-Lib die es ermöglich unter verschiedenen Betriebssystemen Threads, IO, usw. zu nutzen. Für den Tomcat existiert mit dem Projekt tcnative eine Anbindung für Java. +
- +
-==== Testen ==== +
-Tomcat starten: +
-  ./​bin/​startup.sh +
- +
-Prozesse sehen: +
-  jps +
-  jps -v +
-  lsof -a -i -c java +
-  lsof -i | grep java +
-  lsof -i | grep $(cat ../​logs/​tomcat.pid+
- +
-Speicherbelegung der Prozesse: +
-  jstat -gc $(cat logs/​tomcat.pid) +
- +
-Free Memory +
- +
-  jstat -gc $(cat logs/​tomcat.pid) | tail -1 | awk '​{print "free old memory:",​($7-$8)/​1024,​ "​mb"​}'​ +
-  jstat -gc $(cat logs/​tomcat.pid) | tail -1 | awk '​{print "free perm memory:",​($9-$10)/​1024,​ "​mb"​}'​ +
- +
-Stacktrace ausgeben lassen: +
-  kill -3 $(cat logs/​tomcat.pid) +
-  less logs/​catalina.out +
-  #stacktrace snapshot erzeugen +
-  jstack -l $(cat logs/​tomcat.pid) >"​logs/​gc`date`"​ +
- +
-  firefox http://​localhost:​7380/​ +
- +
-''​bin/​restart.sh''​ : ( restart Tomcat) +
-<​code>​ +
-#​!/​bin/​bash +
-~/​workshop/​node73/​bin/​shutdown.sh -force +
-~/​workshop/​node73/​bin/​startup.sh +
-</​code>​ +
-===== Checks =====   +
- +
-''​Links''​ +
-[[http://​nagios.sourceforge.net/​docs/​3_0/​pluginapi.html|Plugin API Nagios]] +
-[[http://​www.faqs.org/​rfcs/​rfc3339.html|RFC339]] +
-[[http://​de.wikipedia.org/​wiki/​ISO_8601|ISO_8601]] +
- +
-==== Check Pid, Ports, Alive ==== +
-<code bash> +
-  if [ -f ~/​workshop/​node73/​logs/​tomcat.pid ]; then +
-    pid_no=`cat ~/​workshop/​node73/​logs/​tomcat.pid` +
-    DATE=`date --rfc-3339=ns` +
-    ps_pid=`ps aux |grep -c $pid_no` +
-         +
-    echo "$DATE - OK - pid ($pid_no) existiert"​ +
- +
-    if [ $ps_pid -gt 1 ]; then +
-      echo "$DATE - Ok - Zugehoeriger Prozess existiert"​ +
-    else +
-      echo "$DATE - Err - Zugehoeriger Prozess existiert nicht"​ +
-    fi +
- +
-    port_7380=`lsof -i | grep $pid_no | grep -q ':​7380'​ && echo -n "Ok - 7380" || echo -n "Err - 7380"`  +
-    port_7309=`lsof -i | grep $pid_no | grep -q ':​7309'​ && echo -n "Ok - 7309" || echo -n "Err - 7309"`  +
-    port_7305=`lsof -i | grep $pid_no | grep -q ':​7305'​ && echo -n "Ok - 7305" || echo -n "Err - 7305"`  +
- +
-    for x in "​$port_7380"​ "​$port_7309"​ "​$port_7305"​ ; do +
-      echo "$DATE - $x" +
-    done  +
- +
-    temp=`curl --silent http://​localhost:​7380/​test1/​test1_ok.jsp | grep -c '​Ok'​`  +
-    if [ $temp -eq 1 ]; then +
-      echo "$DATE - Ok - AliveCheck"​ +
-    else +
-      echo "$DATE - Err - AliveCheck"​ +
-    fi +
-  else +
-    echo "$DATE - Err: pid existiert nicht!"​ +
-  fi +
-</​code>​ +
-==== Check JVM Free Mem ==== +
-Prüfen ob noch genügend freier Speicher vorhanden ist: +
- +
- +
-''​bin/​check_jvmfreemem.sh''​ : +
-<code bash> +
-#​!/​bin/​bash +
-# resolve links - $0 may be a softlink +
-case $0 in +
-    /*) +
-        PRG="​$0"​+
         ;;         ;;
-    *+stop
-        ​PWD=`pwd` +        ​$CATALINA_HOME/​bin/​shutdown.sh 
-        ​PRG="$PWD/$0"+        ​;; 
 +*) 
 +        echo "Usage: ​$0 {start|stop}" 
 +        exit 1
         ;;         ;;
-esac 
- 
-while [ -h "​$PRG"​ ]; do 
-  ls=`ls -ld "​$PRG"​` 
-  link=`expr "​$ls"​ : '​.*->​ \(.*\)$'​` 
-  if expr "​$link"​ : '/​.*'​ > /dev/null; then 
-    PRG="​$link"​ 
-  else 
-    PRG=`dirname "​$PRG"​`/"​$link"​ 
-  fi 
-done 
-cd "​`dirname "​$PRG"​`"​ 
-PWD=`pwd` 
-PRGDIR=`dirname "​$PWD"​` 
-PID=$(cat ${PRGDIR}/​logs/​tomcat.pid) 
-DATE=`date --rfc-3339=ns` 
- 
-MEMOLDUSAGE=$(jstat -gc $PID | tail -1 | awk '​{print $(8)}'​) 
-PERFOLDDATA=$(jstat -gcoldcapacity $PID | tail -1 | awk -v usage=$MEMOLDUSAGE '​{print "free old memory:",​($2-usage)/​1024,​ "mb ;", "​percentage:",​(($2-usage) * 100 / $2),"​%"​ }') 
-MEMPERMUSAGE=$(jstat -gc $PID | tail -1 | awk '​{print $(10)}'​) 
-PERFPERMDATA=$(jstat -gcpermcapacity $PID | tail -1 | awk -v usage=$MEMPERMUSAGE '​{print "free perm memory:",​($2-usage)/​1024,​ "mb ;", "​percentage:",​(($2-usage) * 100 / $2),"​%"​ }') 
- 
-VALUE=$(echo $PERFOLDDATA | awk '​{print int($8)}'​) 
- 
-STATUS=OK 
-if [ $VALUE -lt $1 ] ; then 
-    STATUS=WARNING  ​ 
-elif [ $VALUE -lt $2 ] ; then 
-    STATUS=CRITICAL 
-fi 
- 
-echo $STATUS 
- 
-if [ $STATUS != "​CRITICAL"​ ] ; then 
-VALUE=$(echo $PERFPERMDATA | awk '​{print int($8)}'​) 
- 
-if [ $VALUE -lt $3 ] ; then 
-    STATUS=WARNING 
-elif [ $VALUE -lt $4 ] ; then 
-    STATUS=CRITICAL 
-fi 
-fi 
- 
-echo "​JVMFREEMEM $STATUS - $DATE | $PERFOLDDATA | $PERFPERMDATA" ​ 
-case $STATUS in 
- OK) exit 0 ;; 
- WARNING) exit 1 ;; 
- CRTICAL) exit 2 ;; 
- *) exit 3;; 
 esac esac
 </​code>​ </​code>​
  
-==== Check TomcatStartup State  ​====+==== 1.3 - Erweiterung setenv.sh ​====
  
-Als Parameter benötigt das Skript den Pfad zur Logdatei. 
- 
-''​bin/​check_tomcatstartup.sh''​ : 
-<code bash> 
-#!/bin/bash 
-OIFS=$IFS 
-IFS=$' 
-' 
- 
-LOGFILE=$1 
-RESPONSE_CODE_OK=0 
-RESPONSE_CODE_WARNING=1 
-RESPONSE_CODE_CRITICAL=2 
-RESPONSE_CODE_UNKNOWN=3 
- 
-WARN_COUNT=0 
-ERROR_COUNT=0 
-ANALYSE_STATE=0 
- 
-if [ ! -f $LOGFILE ]; then 
-   ​IFS=$OIFS 
-   echo "File not found" 
-   exit $RESPONSE_CODE_UNKNOWN 
-fi 
- 
-for x in $(tac $LOGFILE) ; 
-  do 
- if [ `echo $x | grep '​Server startup in' ` ]; then 
-   ANALYSE_STATE=1 
- fi; 
- 
- if [ ${ANAlYSE_STATE}="​1"​ ]; then 
- if [ `echo $x | grep '​ERROR'​` ]; then 
-              ERROR_COUNT=$(($ERROR_COUNT+1)) 
- fi; 
- if [ `echo $x | grep '​WARN'​ ` ]; then 
- WARN_COUNT=$(($WARN_COUNT+1)) 
- fi; 
- 
- if [ `echo $x | grep '​Starting service Catalina'​` ]; then 
-                        break 
-                fi; 
- fi; 
-done ; 
- 
-IFS=$OIFS 
- 
-if [ $ERROR_COUNT -ge "​1"​ ]; then 
-   echo "​TomcatStartupCheck - CRITICAL | " 
-   echo "WARN COUNT: $WARN_COUNT"​ 
-   echo "ERROR COUNT: $ERROR_COUNT | " 
-   exit $RESPONSE_CODE_CRITICAL 
-fi 
- 
-if [ $WARN_COUNT -ge "​1"​ ]; then 
-   echo "​TomcatStartupCheck - WARNING | " 
-   echo "WARN COUNT: $WARN_COUNT"​ 
-   echo "ERROR COUNT: $ERROR_COUNT | " 
-   exit $RESPONSE_CODE_WARNING 
-fi 
- 
-if [ ${ANAlYSE_STATE}="​1"​ ]; 
-   then 
-      echo "​TomcatStartupCheck - OK | " 
-      echo "WARN COUNT: $WARN_COUNT"​ 
-      echo "ERROR COUNT: $ERROR_COUNT | " 
-      exit $RESPONSE_CODE_OK 
-   else 
-      echo "​TomcatStartupCheck - UNKNOWN | " 
-      echo "WARN COUNT: $WARN_COUNT"​ 
-      echo "ERROR COUNT: $ERROR_COUNT | " 
-      exit $RESPONSE_CODE_UNKNOWN 
-fi 
- 
-</​code>​ 
- 
-===== Applikationen ===== 
-==== Hello World ==== 
-  mkdir webapps/​hello 
-''​webapps/​hello/​index.jsp''​ : 
-<​file>​ 
-hello! <br> 
-es ist <%=new java.util.Date() %> Uhr! 
-</​file>​ 
- 
-  firefox http://​localhost:​7380/​hello/​ 
- 
-==== Hello World Servlet ==== 
-  mkdir -p webapps/​hello/​WEB-INF/​classes 
-  cd webapps/​hello/​WEB-INF/​classes 
-  vi HelloWorld.java 
- 
-''​webapps/​hello/​WEB-INF/​classes/​HelloWorld.java''​ 
-<​file>​ 
-import java.io.*; 
-import javax.servlet.*;​ 
-import javax.servlet.http.*;​ 
- 
-public class HelloWorld extends HttpServlet { 
- 
-    public void doGet(HttpServletRequest request, HttpServletResponse response) 
-    throws IOException,​ ServletException 
-    { 
-        response.setContentType("​text/​html"​);​ 
-        PrintWriter out = response.getWriter();​ 
-        out.println("<​html>"​);​ 
-        out.println("<​head>"​);​ 
-        out.println("<​title>​Hello World!</​title>"​);​ 
-        out.println("</​head>"​);​ 
-        out.println("<​body>"​);​ 
-        out.println("<​h1>​Hello World!</​h1>"​);​ 
-        out.println("</​body>"​);​ 
-        out.println("</​html>"​);​ 
-    } 
-} 
-</​file>​ 
-  javac -cp ~/​workshop/​apache-tomcat/​lib/​servlet-api.jar HelloWorld.java 
-  cd .. 
-  vi web.xml 
- 
-''​webapps/​hello/​WEB-INF/​web.xml''​ 
-<​file>​ 
-<​web-app>​ 
-    <​servlet>​ 
-        <​servlet-name>​HelloWorld</​servlet-name>​ 
-        <​servlet-class>​HelloWorld</​servlet-class>​ 
-    </​servlet>​ 
-    <​servlet-mapping>​ 
-        <​servlet-name>​HelloWorld</​servlet-name>​ 
-        <​url-pattern>/​world</​url-pattern>​ 
-    </​servlet-mapping>​ 
-</​web-app>​ 
-</​file>​ 
- 
-Restart des Servers 
-  cd ~/​workshop/​node73 
-  bin/​shutdown.sh 
-  bin/​startup.sh 
-  firefox http://​localhost:​7380/​hello/​world 
- 
-Test mit telnet 
-  ​ 
 <​code>​ <​code>​
-nutzer20@notebook20:​~/​workshop/​node73$ telnet 127.0.0.1 7380 +CATALINA_TMPDIR="${CATALINA_VAR}/temp
-Trying 127.0.0.1... +CATALINA_PID="${CATALINA_VAR}/logs/tomcat.pid
-Connected to 127.0.0.1. +CATALINA_OUT="${CATALINA_VAR}/logs/catalina.out
-Escape character is '​^]'​. +CATALINA_OPTS="-Dcatalina.var=${CATALINA_VAR}"
-GET /​hello/​world HTTP/1.0 +
- +
-HTTP/1.1 200 OK +
-Server: Apache-Coyote/​1.1 +
-Content-Type:​ text/html +
-Content-Length:​ 103 +
-Date: Thu, 08 Mar 2012 14:10:34 GMT +
-Connection: close +
- +
-<​html>​ +
-<​head>​ +
-<​title>​Hello World!</​title>​ +
-</​head>​ +
-<​body>​ +
-<​h1>​Hello World!</​h1>​ +
-</​body>​ +
-</​html>​ +
-Connection closed by foreign host. +
-</​code> ​  +
- +
-Autoreload auf WEB-INF/​web.xml +
- +
-''​node73/​conf/​context.xml''​ +
-<​file>​ +
-<​Context>​ +
-   <​WatchedResource>​WEB-INF/​web.xml</​WatchedResource>​ +
-</​Context>​ +
-</​file>​ +
- +
-Autoreload für Änderungen von Klassen aller Anwendungen +
- +
-''​node73/​conf/​context.xml''​ +
-<​file>​ +
-<Context reloadable="true">​ +
-   <​WatchedResource>​WEB-INF/​web.xml</​WatchedResource>​ +
-</​Context>​ +
-</​file>​ +
-Nun muss der Server ebenfalls nochmals restartet werden. Ab jetzt kann man Änderungen an der Java Quelle Datei vornehmen und nach jeder Übersetzung wird diese in der Laufenden Anwendung sichtbar. +
-   +
- +
-Ab dem Apache Tomcat 7 mit dem Servlet API 3.0 lassen sich die Konfigurationen auch +
-direkt in den Servlet Code schreiben:​ +
- +
-Anlage der Anwendung world +
-  cd ~/​workshop/​node73/​webapps +
-  mkdir world +
-  mkdir world/​WEB-INF +
-  mkdir world/​WEB-INF/​classes +
-  mkdir world/​WEB-INF/​classes/​world +
-  cd world/​WEB-INF/​classes/​world +
-  vi Hello.java +
-  javac -cp ~/​workshop/​apache-tomcat/​lib/​servlet-api.jar Hello.java +
-  # restart des Servers +
- +
- +
-<​file>​ +
- +
-package world; +
- +
-import java.io.*;​ +
-import javax.servlet.*;​ +
-import javax.servlet.http.*;​ +
-import javax.servlet.annotation.WebServlet ; +
- +
-@WebServlet("/​hello"​) +
-public class Hello extends HttpServlet ​{ +
- +
-    public void doGet(HttpServletRequest request, HttpServletResponse response) +
-    throws IOException,​ ServletException +
-    { +
-        response.setContentType("​text/html"); +
-        ​PrintWriter out response.getWriter();​ +
-        out.println("<​html>"​);​ +
-        out.println("<​head>"​);​ +
-        out.println("<​title>​Hello World!</title>"​);​ +
-        out.println("<​/head>"​);​ +
-        out.println("<​body>"​);​ +
-        ​out.println("<​h1>​Hello World!</​h1>"​);​ +
-        out.println("</​body>"​);​ +
-        out.println("</​html>"​);​ +
-    ​} +
-+
-</file> +
-==== .war ==== +
-  mkdir /tmp/​hello2 +
-''/​tmp/​hello2/​index.jsp''​ : +
-<​file>​ +
-hello2! <​br>​ +
-es ist <%=new java.util.Date() %> Uhr! +
-</​file>​ +
- +
-  jar cf hello2.war -C /​tmp/​hello2/​ index.jsp +
-  cp hello2.war webapps/ +
- +
-  firefox http://​localhost:​7380/​hello2/​ +
- +
- +
-===== Tomcat 6 Installation mit Ubuntu ===== +
-Ubuntu Standard Tomcat Installation +
-<​file>​ +
-sudo apt-get install tomcat6 +
-sudo apt-get install tomcat6-admin +
-</​file>​ +
- +
-User Node Installation für Test +
-<​file>​ +
-sudo apt-get install tomcat6-user  +
-tomcat6-instance-create node91 -p 9180 -c 9105 -w qwewqeiq879qewq +
-node91/​bin/​startup.sh +
-node91/​bin/​shutdown.sh +
-</​file>​ +
- +
-===== Basic Authentication ===== +
-Application ''​hello''​ mit Basic Authentication absichern +
- +
-''​conf/​server.xml''​ : +
-<code xml> +
-<Server ..> +
-.. +
-  <​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 ..> +
-    <Engine ..> +
-      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"​ +
-             ​resourceName="​UserDatabase"/>​ +
-        .. +
-    </​Engine>​ +
-  </​Service>​ +
-</​Server>​+
 </​code>​ </​code>​
  
-''​conf/​tomcat-users.xml''​ : +==== 1.OOM ====
-<code xml> +
-<​tomcat-users>​ +
-  <user username="​manager"​ password="​tomcat"​ roles="​manager-gui"​ /> +
-</​tomcat-users>​ +
-</​code>​ +
- +
-''​webapps/​hello/​WEB-INF/​web.xml''​ : +
- +
-<​file>​ +
-<?xml version="1.0" encoding="​ISO-8859-1"?>​ +
-<web-app xmlns="​http://​java.sun.com/​xml/​ns/​javaee"​ +
-   ​xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ +
-   ​xsi:​schemaLocation="​http://​java.sun.com/​xml/​ns/​javaee http://​java.sun.com/​xml/​ns/​javaee/​web-app_2_5.xsd"​ +
-   ​version="​2.5">​  +
- +
-  <​display-name>​Hello World Application</​display-name>​ +
-  <​description>​ +
-    Tolle Hello World Application +
-  </​description>​ +
-  <​servlet>​ +
-        <​servlet-name>​HelloWorld</​servlet-name>​ +
-        <​servlet-class>​HelloWorld</​servlet-class>​ +
-    </​servlet>​ +
-    <​servlet-mapping>​ +
-        <​servlet-name>​HelloWorld</​servlet-name>​ +
-        <​url-pattern>/​world</​url-pattern>​ +
-    </​servlet-mapping>​ +
-  <!-- Define a Security Constraint on this Application --> +
-  <​security-constraint>​ +
-    <​web-resource-collection>​ +
-      <​web-resource-name>​Hello</​web-resource-name>​ +
-      <​url-pattern>/​index.jsp</​url-pattern>​ +
-      <​url-pattern>/​world</​url-pattern>​ +
- +
-      <!-- <​url-pattern>/​html/​*</​url-pattern> ​ --> +
-    </​web-resource-collection>​ +
-    <​auth-constraint>​ +
-       <​!-- NOTE:  This role is not present in the default users file --> +
-       <​role-name>​manager-gui</​role-name>​ +
-    </​auth-constraint>​ +
-  </​security-constraint>​ +
- +
-  <!-- Define the Login Configuration for this Application --> +
-  <​login-config>​ +
-    <​auth-method>​BASIC</​auth-method>​ +
-    <​realm-name>​Hello World Application</​realm-name>​ +
-  </​login-config>​ +
- +
-  <!-- Security roles referenced by this web application --> +
-  <​security-role>​ +
-    <​description>​ +
-      The role that is required to log in to the Hello Application +
-    </​description>​ +
-    <​role-name>​manager-gui</​role-name>​ +
-  </​security-role>​ +
- +
-  <​error-page>​ +
-    <​error-code>​401</​error-code>​ +
-    <​location>/​401.jsp</​location>​ +
-  </​error-page>​ +
- +
-</​web-app>​ +
-</​file>​ +
-Syntax Tomcat 6 Servlet Api 2.5 checken: +
-  xmllint --noout --schema http://​java.sun.com/​xml/​ns/​javaee/​web-app_2_5.xsd webapps/​hello/​WEB-INF/​web.xml +
-Syntax Tomcat 7 - Servlet API 3.0 checken: +
-  xmllint --noout --schema http://​java.sun.com/​xml/​ns/​javaee/​web-app_3_0.xsd webapps/​hello/​WEB-INF/​web.xml +
-   +
-''​webapps/​hello/​401.jsp''​ : +
-<​file>​ +
-hello error 401 +
-</​file>​ +
- +
-Setzen einer kontrollierten Fehlerreaktion für "File not found" Status Code 404 +
-''​webapps/​hello/​WEB-INF/​web.xml''​+
 <​code>​ <​code>​
-<web-app> +JAVA_OOM="​-XX:​+HeapDumpOnOutOfMemoryError ​-XX:​HeapDumpPath=/var/tomcat/workshop ​-XX:​OnOutOfMemoryError=${CATALINA_HOME}/bin/oom.sh" 
-.. +CATALINA_OPTS="​$CATALINA_OPTS $JAVA_OOM"​
-  <​error-page>​ +
-    <error-code>​404<​/error-code>​ +
-    <​location>​/404.jsp</location>​ +
-  </error-page> +
-  <​error-page>​ +
-        <​exception-type>​java.lang.Throwable<​/exception-type>​ +
-        <​location>​/exception.jsp</​location>​ +
-  </​error-page>​ +
- +
-.. +
-</​web-app>​+
 </​code>​ </​code>​
  
-Für Tomcat 7 ist das web-app Schema folgendes.+==== 1.4 action.bash ====
  
-''​webapps/​hello/​WEB-INF/​web.xml''​ :  
-<​file>​ 
-<web-app xmlns="​http://​java.sun.com/​xml/​ns/​javaee"​ 
-  xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ 
-  xsi:​schemaLocation="​http://​java.sun.com/​xml/​ns/​javaee 
-                      http://​java.sun.com/​xml/​ns/​javaee/​web-app_3_0.xsd"​ 
-  version="​3.0">​ 
-</​web-app>​ 
- 
-</​file>  ​ 
-''​webapps/​hello/​404.jsp''​ : 
-<​file>​ 
- 
-<%@ page session="​false"​ isErrorPage="​true"​ %> 
- 
-<​html>​ 
-<​head><​title>​404 Not Found</​title></​head>​ 
-<​body>​ 
-<​h1>​404 Not Found</​h1>​ 
- 
-The url <​code>​${requestScope["​javax.servlet.error.request_uri"​]}</​code> ​ 
-was not found. 
-</​body>​ 
-</​html>​ 
- 
-</​file>​ 
- 
-Verfügbare RequestScope Attribute 
- 
-|Attribute |Type | 
-|javax.servlet.error.status_code| java.lang.Integer| 
-|javax.servlet.error.message| java.lang.String| 
-|javax.servlet.error.request_uri| java.lang.String| 
-|javax.servlet.error.servlet_name| java.lang.String| 
-|javax.servlet.error.exception| java.lang.Throwable| 
-|javax.servlet.error.exception_type| java.lang.Class| 
- 
-''​webapps/​hello/​my.jsp''​ : 
-<​file>​ 
-<%@ page session="​false"​ errorPage="​exception.jsp"​ %> 
-<​html>​ 
-<​head><​title>​My World</​title></​head>​ 
-<​body>​ 
-<​h1>​Yep</​h1>​ 
-<% 
- if(true) { 
- throw new RuntimeException("​my world"​);​ 
- } 
-%> 
-</​body>​ 
-</​html>​ 
-</​file>​ 
- 
- 
-''​webapps/​hello/​exception.jsp''​ : 
-<​file>​ 
-<%@ page session="​false"​ isErrorPage="​true"​ import="​java.io.*"​ %> 
-<​html>​ 
-<​head>​ 
- <​title>​Exceptional Even Occurred!</​title>​ 
- <​style>​ 
- body, p { font-family:​Tahoma;​ font-size:​10pt;​ padding-left:​30;​ } 
- pre { font-size:​8pt;​ } 
- </​style>​ 
-</​head>​ 
-<​body>​ 
- 
-<%-- Exception Handler --%> 
-<font color="​red">​ 
-<%= exception.toString() %><​br>​ 
-</​font>​ 
- 
-<% 
-out.println("<​!--"​);​ 
-StringWriter sw = new StringWriter();​ 
-PrintWriter pw = new PrintWriter(sw);​ 
-exception.printStackTrace(pw);​ 
-out.print(sw);​ 
- 
-sw.close(); 
-pw.close(); 
-out.println("​-->"​);​ 
-application.log(sw.toString());​ 
- 
-%> 
- 
-</​body>​ 
-</​html>​ 
-</​file>​ 
- 
-===== Digest password ===== 
-Generierung des Password mit Digest 
 <​code>​ <​code>​
-apache-tomcat/​bin/​digest.sh -a SHA1 manager 
-</​code>​ 
- 
-Eintragen der Password in die tomcat-users.xml 
- 
-''​node73/​conf/​tomcat-users.xml'':​ 
-<​file>​ 
-<​tomcat-users>​ 
-  <user username="​manager"​ password="​536c0b339345616c1b33caf454454d8b8a190d6c"​ roles="​manager-gui"​ /> 
-  <user username="​tomcat"​ password="​536c0b339345616c1b33caf454454d8b8a190d6c"​ roles="​user"​ /> 
- 
-</​tomcat-users>​ 
-</​file>​ 
- 
-Eintragen des Digest Algo im Realm 
-''​node73/​conf/​server.xml''​ 
-<​file>​ 
-.. 
-    <Engine name="​Catalina"​ defaultHost="​localhost"​ jvmRoute="​node${port.prefix}">​ 
-      <Realm className="​org.apache.catalina.realm.UserDatabaseRealm"​ 
-             ​digest="​SHA1" ​ 
-             ​resourceName="​UserDatabase"/>​ 
-.. 
-    </​Engine>​ 
- 
-</​file>​ 
- 
-Restart des Servers 
- 
-===== Manager Application ===== 
-Erste Option ist die Übernahme der manager Anwendung in die Node. 
-  cp -a ../​apache-tomcat/​webapps/​manager/​ webapps/ 
- 
-Besser wäre eine Referenz der Manager Anwendung in den Node zuvereinbaren. 
- 
-''​conf/​Catalina/​localhost/​manager.xml''​ : 
-<code xml> 
-<Context docBase="​${catalina.home}/​webapps/​manager"​ antiResourceLocking="​false"​ privileged="​true"​ useHttpOnly="​true"/>​ 
-</​code>​ 
- 
-  firefox http://​localhost:​7380/​manager/​html 
-Benutzername:​ manager 
-Password: tomcat 
-( siehe ''​conf/​tomcat-users.xml''​ ) 
- 
-''​conf/​tomcat-users.xml'' ​ 
-<​file>​ 
-<​tomcat-users>​ 
-<user name="​manager"​ password="​tomcat"​ roles="​manager-gui"​ /> 
-</​tomcat-users>​ 
-</​file>​ 
- 
-Tomcat 8:  
-''​conf/​tomcat-users.xml'' ​ 
- 
-<​file>​ 
-<?xml version='​1.0'​ encoding='​utf-8'?>​ 
-<​tomcat-users xmlns="​http://​tomcat.apache.org/​xml"​ 
-              xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ 
-              xsi:​schemaLocation="​http://​tomcat.apache.org/​xml tomcat-users.xsd"​ 
-              version="​1.0">​ 
-  <role rolename="​manager-gui"/>​ 
-  <user username="​manager"​ password="​tomcat"​ roles="​manager-gui"/>​ 
-</​tomcat-users>​ 
-</​file>​ 
----- 
- 
- 
-Mit dem GlobalResourcesLifecycleListener werden die Daten der UserDatabase im MbeanServer (JMX)  
-veröffentlicht und sind damit änderbar. Wenn die UserDatabase schreibar ist, kann man die Änderungen sogar wieder speichern. ​ 
- 
- 
-**Vorsicht** die Passwörter sind via JMX einsehbar und evtl. temporär änderbar!!! 
- 
-''​conf/​server.xml''​ 
-<​file>​ 
-<Server .. > 
- <​Listener className="​org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"​ /> 
- 
-  <​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" ​ 
-              readonly="​false"​ /> 
-  </​GlobalNamingResources>​ 
-  <Service ..> 
-    <Engine ..> 
-      <Realm className="​org.apache.catalina.realm.UserDatabaseRealm"​ 
-             ​resourceName="​UserDatabase"/>​ 
-        .. 
-    </​Engine>​ 
-  </​Service>​ 
-<​Server/> ​ 
-</​file>​ 
- 
-Zur Installation von Anwendungen auf dem Server kann man auch curl nutzen. 
-Dazu ist es notwendig das der "​User"​ der Manager Anwendung in der Role "​manager-script"​ eingetragen ist. 
-<​code>​curl --user manager:​tomcat "​http://​localhost:​7380/​manager/​text/​deploy?​path=/​docs&​config=file:/​home/​nutzer18/​workshop/​node73/​docs.xml"</​code>​ 
- 
-''​docs.xml''​ 
-<​file>​ 
-<Context docBase="​${catalina.home}/​webapps/​docs"​ /> 
-</​file>​ 
- 
-Einschränkung des Zugriffs auf die Manager Anwendung nur vom lokalen Host 
-''​conf/​Catalina/​localhost/​manager.xml''​ : 
-<​file>​ 
-<Context docBase="​${catalina.home}/​webapps/​manager"​ antiResourceLocking="​false"​ privileged="​true"​ useHttpOnly="​true">​ 
-  <Valve className="​org.apache.catalina.valves.RemoteAddrValve"​ 
-         ​allow="​127\.\d+\.\d+\.\d+|::​1|0:​0:​0:​0:​0:​0:​0:​1|192\.168\.1\.\d+"/>​ 
-</​Context>​ 
- 
- 
-</​file>​ 
- 
-''​conf/​server.xml''​ 
-<​code>​ 
-    <Engine ...> 
-    ​ 
-    ​ 
-    <Realm className="​org.apache.catalina.realm.LockOutRealm">​ 
-         <​Realm className="​org.apache.catalina.realm.UserDatabaseRealm"​ 
-              resourceName="​UserDatabase"/>​ 
- 
-    </​Realm>​ 
-    
-   ... 
-   </​Engine>​ 
-</​code>  ​ 
- 
-==== Weitere Manager Berechtigungen ==== 
- 
-''​conf/​tomcat-users.xml'' ​ 
-<​file>​ 
-<​tomcat-users>​ 
-<user name="​manager"​ password="​tomcat"​ roles="​manager-gui"​ /> 
-<user name="​script"​ password="​tomcat"​ roles="​manager-script"​ /> 
-<user name="​jmx"​ password="​tomcat"​ roles="​manager-jmx"​ /> 
-<user name="​status"​ password="​tomcat"​ roles="​manager-status"​ /> 
-</​tomcat-users>​ 
- 
-</​file>​ 
- 
-<​code>​ 
-curl -u status:​tomcat http://​localhost:​7380/​manager/​status/​all?​XML=true ​ 
-</​code>​ 
- 
-Ergebnis 
-<​code>​ 
-<?xml version="​1.0"​ encoding="​utf-8"?>​ 
-<?​xml-stylesheet type="​text/​xsl"​ href="/​manager/​xform.xsl"​ ?> 
-<​status>​ 
-    <jvm> 
-        <memory free="​61724312"​ total="​72613888"​ max="​119341056"/>​ 
-        <​memorypool name="​PS Eden Space" type="​Heap memory"​ usageInit="​15007744"​ usageCommitted="​30015488"​ usageMax="​36503552"​ usageUsed="​795720"/>​ 
-        <​memorypool name="​PS Old Gen" type="​Heap memory"​ usageInit="​40108032"​ usageCommitted="​40108032"​ usageMax="​89522176"​ usageUsed="​7624024"/>​ 
-        <​memorypool name="​PS Survivor Space" type="​Heap memory"​ usageInit="​2490368"​ usageCommitted="​2490368"​ usageMax="​2490368"​ usageUsed="​2469832"/>​ 
-        <​memorypool name="​Code Cache" type="​Non-heap memory"​ usageInit="​2555904"​ usageCommitted="​2555904"​ usageMax="​50331648"​ usageUsed="​1095104"/>​ 
-        <​memorypool name="​PS Perm Gen" type="​Non-heap memory"​ usageInit="​21757952"​ usageCommitted="​21757952"​ usageMax="​174063616"​ usageUsed="​16175656"/>​ 
-    </​jvm>​ 
-    <​connector name="&​quot;​http-bio-7380&​quot;">​ 
-        <​threadInfo maxThreads="​200"​ currentThreadCount="​10"​ currentThreadsBusy="​1"/>​ 
-        <​requestInfo maxTime="​53"​ processingTime="​146"​ requestCount="​7"​ errorCount="​0"​ bytesReceived="​0"​ bytesSent="​121567"/>​ 
-        <​workers>​ 
-            <worker stage="​R"​ requestProcessingTime="​0"​ requestBytesSent="​0"​ requestBytesReceived="​0"​ remoteAddr="?"​ virtualHost="?"​ method="?"​ currentUri="?"​ currentQueryString="?"​ protocol="?"/>​ 
-            <worker stage="​R"​ requestProcessingTime="​0"​ requestBytesSent="​0"​ requestBytesReceived="​0"​ remoteAddr="?"​ virtualHost="?"​ method="?"​ currentUri="?"​ currentQueryString="?"​ protocol="?"/>​ 
-            <worker stage="​S"​ requestProcessingTime="​4"​ requestBytesSent="​0"​ requestBytesReceived="​0"​ remoteAddr="​0:​0:​0:​0:​0:​0:​0:​1"​ virtualHost="​localhost"​ method="​GET"​ currentUri="/​manager/​status/​all"​ currentQueryString="​XML=true"​ protocol="​HTTP/​1.1"/>​ 
-        </​workers>​ 
-    </​connector>​ 
-    <​connector name="&​quot;​ajp-bio-7309&​quot;">​ 
-        <​threadInfo maxThreads="​200"​ currentThreadCount="​0"​ currentThreadsBusy="​0"/>​ 
-        <​requestInfo maxTime="​0"​ processingTime="​0"​ requestCount="​0"​ errorCount="​0"​ bytesReceived="​0"​ bytesSent="​0"/>​ 
-        <​workers/>​ 
-    </​connector>​ 
-</​status>​ 
-</​code>​ 
- 
-* [[http://​tomcat.apache.org/​tomcat-8.0-doc/​config/​filter.html#​CSRF_Prevention_Filter| Tomcat CSRF Filter]] 
-* [[http://​de.wikipedia.org/​wiki/​Cross-Site-Request-Forgery | Cross-Site-Request-Forgery]] 
-* [[http://​xmlprettyprint.com/​ | XML Pretty Printer]] 
-===== Monitoring mit der Jconsole ===== 
- 
-Remote Monitoring mit dem Befehl jconsole 
- 
-''​bin/​startup.sh''​ 
-<code java> 
- 
-export CATALINA_OPTS="​$CATALINA_OPTS -Dcom.sun.management.jmxremote \ 
--Dcom.sun.management.jmxremote.port=7304 \ 
--Dcom.sun.management.jmxremote.authenticate=false \ 
--Dcom.sun.management.jmxremote.ssl=false \ 
--Djava.rmi.server.hostname=$(hostname) \ 
--Djava.rmi.server.useLocalHostname=true"​ 
-</​code>​ 
- 
-Wenn eine Autorisierung nötig ist geht das mit:  
-<​code>​  
-    -Dcom.sun.management.jmxremote.authenticate=true \ 
-    -Dcom.sun.management.jmxremote.password.file=../​conf/​jmxremote.password \ 
-    -Dcom.sun.management.jmxremote.access.file=../​conf/​jmxremote.access \ 
-</​code> ​   ​ 
-  
-''​conf/​jmxremote.access''​ 
-<​code>​  
-monitorRole readonly 
-controlRole readwrite 
-</​code> ​   ​ 
- 
-  
-''​conf/​jmxremote.password''​ 
-<​code>​  
-monitorRole tomcat 
-controlRole tomcat 
-</​code>​ 
-  
-Tipp: Der Password-file muss read-only und nur von UNIX Prozess Nutzers des Tomcats lesbar sein!! 
- 
-Konfiguration im Tomcat für Server und Registry port! 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​config/​listeners.html#​JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​monitoring.html 
- 
-download jmx remote download 
-http://​tomcat.apache.org/​download-70.cgi 
- 
-cp catalina-jmx-remote.jar node73/lib 
- 
-<​code>​ 
-<Server ...> 
-   <​Listener className="​org.apache.catalina.mbeans.JmxRemoteLifecycleListener"​ 
-             ​rmiRegistryPortPlatform="​${port.prefix}03"​ 
-             ​rmiServerPortPlatform="​${port.prefix}04"​ /> 
-          ​ 
-</​Server>​ 
-</​code>​ 
- 
-Freischaltung der Firewall 
-<​code>​ 
-  sudo iptables -A INPUT -p tcp --dport 7303 -j ACCEPT 
-  sudo iptables -A INPUT -p tcp --dport 7304 -j ACCEPT 
-</​code>​ 
- 
- 
-Access URL 
-<​code>​ 
-    service:​jmx:​rmi://​192.168.1.218:​7304/​jndi/​rmi://​192.168.1.218:​7303/​jmxrmi  ​ 
-</​code>​ 
- 
-''​conf/​tomcat-users.xml''​ 
-<​code>​ 
-<?xml version='​1.0'​ encoding='​utf-8'?>​ 
-<​tomcat-users>​ 
-  <role rolename="​manager-jmx"/>​ 
-  <role rolename="​manager-gui"/>​ 
-  <user username="​jmx"​ password="​tomcat"​ roles="​manager-jmx"/>​ 
-  <user username="​manager"​ password="​tomcat"​ roles="​manager-gui,​manager-jmx"/>​ 
-</​tomcat-users>​ 
-</​code>​ 
- 
-Access MBean Attribute WebModule stateName 
-<​code>​ 
-http://​notebook31:​7380/​manager/​jmxproxy/?​get=Catalina:​j2eeType=WebModule,​name=//​localhost/​hello,​J2EEApplication=none,​J2EEServer=none&​att=stateName 
-</​code>​ 
- 
-Access with curl 
-<​code>​ 
-$curl --user "​jmx:​tomcat"​ "​http://​notebook31:​7380/​manager/​jmxproxy/?​get=Catalina:​j2eeType=WebModule,​name=//​localhost/​hello,​J2EEApplication=none,​J2EEServer=none&​att=stateName"​ 
-OK - Attribute get '​Catalina:​j2eeType=WebModule,​name=//​localhost/​hello,​J2EEApplication=none,​J2EEServer=none'​ - stateName = STARTED 
- 
-</​code>​ 
- 
-<​code>​ 
-$ curl --user "​jmx:​tomcat"​ "​http://​notebook31:​7380/​manager/​jmxproxy/?​get=Catalina:​j2eeType=WebModule,​name=//​localhost/​hello,​J2EEApplication=none,​J2EEServer=none&​att=stateName"​ --silent | awk '​{print $1 " " $(NF)}'​ 
-OK STARTED 
-</​code>​ 
- 
-===== Logging ===== 
-Hinweise 
-  - [[http://​tomcat.apache.org/​tomcat-7.0-doc/​api/​org/​apache/​juli/​FileHandler.html|FileHandler Properties]] 
-  - [[http://​tomcat.apache.org/​tomcat-7.0-doc/​api/​org/​apache/​juli/​OneLineFormatter.html| OneLineformatter]] 
-  - [[http://​tomcat.apache.org/​tomcat-7.0-doc/​api/​org/​apache/​juli/​VerbatimFormatter.html|VerbatimFormatter (kein Stacktrace:​-)]] 
-==== Logging: Minimale Konfiguration ==== 
-''​conf/​logging.properties''​ : 
-<​file>​ 
-handlers = 1catalina.org.apache.juli.FileHandler 
- 
-.handlers = 1catalina.org.apache.juli.FileHandler 
- 
-############################################################​ 
-# Handler specific properties. 
-# Describes specific configuration info for Handlers. 
-############################################################​ 
- 
-1catalina.org.apache.juli.FileHandler.level = FINE 
-1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/​logs 
-1catalina.org.apache.juli.FileHandler.prefix = catalina. 
- 
-#​java.util.logging.ConsoleHandler.level = FINE 
-#​java.util.logging.ConsoleHandler.formatter =  
-</​file>​ 
-==== Anwendung mit eigener Log- Konfiguration ==== 
- 
-''​bin/​setenv.sh''​ : 
-<​file>​ 
 #!/bin/bash #!/bin/bash
-JAVA_OPTS="​$JAVA_OPTS ​-Dlogdir=${CATALINA_BASE}/logs"​ +dumps=`ls -1rt /var/tomcat/java_pid*.hprof | tail -1`; 
-</file> +printf "​Memory Dump:\n $dumps"​ >> /tmp/dumps.log 
- +# printf "​Memory Dump:\n $dumps"​ | mailx -s "​Memory Dump" "​admin@example.zz"
-<code> +
-cd bin +
-chmod +x setenv.sh +
-cd .. +
-mkdir -p webapps/ROOT/WEB-INF/​classes +
-vi webapps/​ROOT/​WEB-INF/​classes/​logging.properties+
 </​code>​ </​code>​
  
-''​webapps/​ROOT/​WEB-INF/​classes/​logging.properties''​ : +==== 1.8 - Valve und Filter ====
-<​file>​ +
-handlers=1root.org.apache.juli.FileHandler +
-.handlers=1root.org.apache.juli.FileHandler +
-.level=FINE +
-1root.org.apache.juli.FileHandler.level=FINE +
-1root.org.apache.juli.FileHandler.directory=${logdir} +
-1root.org.apache.juli.FileHandler.prefix=root- +
-</​file>​+
  
-Level : 
-  * OFF 
-  * SEVERE 
-  * WARNING 
-  * INFO 
-  * CONFIG 
-  * FINE 
-  * FINER 
-  * FINEST 
-  * ALL 
- 
-Unterdrücken der WebSocket Meldung bei Verwendung von Java 6 
-''​conf/​logging.properties''​ 
 <​code>​ <​code>​
-org.apache.tomcat.websocket.server.WsSci.level = OFF 
-</​code>​ 
- 
-Autoreloading Anwendung nachdem die logging.properties geändert wurde 
- 
-''​webapps/​ROOT/​META-INF/​context.xml''​ : 
-<​file>​ 
 <​Context>​ <​Context>​
-   <WatchedResource>​WEB-INF/​classes/​logging.properties<​/WatchedResource>+<Valve className="​org.apache.catalina.valves.StuckThreadDetectionValve"​ threshold="​10"​/>
 </​Context>​ </​Context>​
-</​file>​ 
- 
-''​webapps/​ROOT/​log.jsp''​ : 
-<​file>​ 
-<%@ page import="​java.util.logging.*"​ %> 
-<% 
- 
-Logger logger = Logger.getLogger(""​);​ 
-logger.info("​Info"​);​ 
-logger.fine("​Fine"​);​ 
- 
-application.log("​context log"); 
-System.out.println("​system.out"​);​ 
-System.err.println("​system.err"​);​ 
-%> 
-see logfiles 
-</​file>​ 
- 
-<​code>​ 
-curl http://​localhost:​7380/​log.jsp 
 </​code>​ </​code>​
  
-Ausgabe 
-  /​var/​log/​tomcat/​node74/​root-<​Date>​.log 
- 
-  13.07.2010 15:25:32 org.apache.jsp.log_jsp _jspService 
-  INFO: Info 
-  13.07.2010 15:25:32 org.apache.jsp.log_jsp _jspService 
-  FEIN: Fine 
-  13.07.2010 15:25:32 org.apache.catalina.core.ApplicationContext log 
-  INFO: context log 
- 
- 
- 
-Unterdrücken der Tomcat Meldungen: 
- 
-''​webapps/​ROOT/​WEB-INF/​classes/​logging.properties''​ 
-<​file>​ 
-handlers=1root.org.apache.juli.FileHandler 
-.handlers=1root.org.apache.juli.FileHandler 
-.level=FINE 
-1root.org.apache.juli.FileHandler.level=FINE 
-1root.org.apache.juli.FileHandler.directory=${logdir} 
-1root.org.apache.juli.FileHandler.prefix=root- 
-org.apache.catalina.level=INFO 
-org.apache.tomcat.level=INFO 
-org.apache.jasper.level=INFO 
-</​file>​ 
- 
-Ausgabe des Tomcat8 
- 
-  05-May-2015 10:​03:​24.863 INFO [http-nio-7380-exec-7] org.apache.jsp.log_jsp._jspService Info 
-  05-May-2015 10:​03:​24.864 FINE [http-nio-7380-exec-7] org.apache.jsp.log_jsp._jspService Fine 
-  05-May-2015 10:​03:​24.864 INFO [http-nio-7380-exec-7] org.apache.catalina.core.ApplicationContext.log context log 
- 
- 
-Änderung der Sprache für die LogAusgabe 
- 
-check : 
-<code bash> 
-echo $LANG 
-de_DE.UTF-8 
-</​code>​ 
- 
-''​bin/​startup.sh und bin/​shutdown.sh oder in der setenv.sh''​ 
-<​file>​ 
-export LANG="​en_US.UTF-8"​ 
-export JAVA_OPTS="​$JAVA_OPTS -Duser.language=en -Duser.country=US"​ 
-</​file>​ 
- 
-Ausgabe 
-  /​var/​log/​tomcat/​node74/​root-<​Date>​.log 
-  Sep 3, 2010 10:09:11 AM org.apache.jsp.log_jsp _jspService 
-  INFO: Info 
-  Sep 3, 2010 10:09:11 AM org.apache.jsp.log_jsp _jspService 
-  FINE: Fine 
-  Sep 3, 2010 10:09:11 AM org.apache.catalina.core.ApplicationContext log 
-  INFO: context log 
- 
-  /​var/​log/​tomcat/​node74/​catalina.out 
- 
-  system.out 
-  system.err 
- 
-Umlenkung der Ausgabe von System.out und System.err in das Appliction.log 
- 
-''​webapps/​ROOT/​META-INF/​context.xml''​ : 
-<​file>​ 
-  <Context swallowOutput="​true"​ /> 
-</​file>​ 
-==== logrotate ==== 
-''/​etc/​logrotate.d/​tomcat''​ : 
-<​file>​ 
-/​home/​nutzer01/​workshop/​node73/​logs/​catalina.out { 
-    size=+10 
-    compress 
-    create 640 nutzer01 nutzer01 
-    copytruncate 
-    # Achtung: hierbei können einzelne Logmeldungen während des Kopier/​Compress Vorgangs verloren gehen 
-} 
-</​file>​ 
-=== testen === 
-  logrotate /​etc/​logrotate.conf 
- 
-oder etwas ernsthafter 
- 
-''/​etc/​logrotate.d/​tomcat''​ : 
-<​file>​ 
-/​home/​nutzer01/​workshop/​node73/​logs/​catalina.out { 
-    rotate 8 
-    daily 
-    compress 
-    create 640 nutzer01 nutzer01 
-    copytruncate 
-    # Achtung: hierbei können einzelne Logmeldungen während des Kopier/​Compress Vorgangs verloren gehen 
-} 
-</​file>​ 
- 
-=== Ausschalten der Rotierung eines FileHandlers === 
-''​webapps/​ROOT/​WEB-INF/​classes/​logging.properties''​ 
-<​file>​ 
-.. 
-1root.org.apache.juli.FileHandler.rotatable=false 
-</​file>​ 
- 
-http://​tomcat.apache.org/​tomcat-6.0-doc/​api/​org/​apache/​juli/​FileHandler.html 
- 
- 
- 
-==== /var fuer log-files nutzen ==== 
-<​file>​ 
-sudo mkdir /​var/​log/​tomcat/​node73 
-sudo mkdir /​var/​tmp/​tomcat/​node73/​temp 
-sudo mkdir /​var/​tmp/​tomcat/​node73/​work 
-sudo chown nutzer01:​nutzer01 /​var/​log/​tomcat/​node73 
-sudo chown -R nutzer01:​nutzer01 /​var/​tmp/​tomcat/​node73 
-</​file>​ 
-''​home/​nutzer01/​workshop/​node73/​bin/​startup.sh''​ : 
-<​file>​ 
-... 
-export CATALINA_OUT=/​var/​log/​tomcat/​node73/​catalina.out 
-export CATALINA_TMPDIR=/​var/​tmp/​tomcat/​node73/​temp 
-export JAVA_OPTS=-Dport.prefix=73 -Dcatalina.workdir=/​var/​tmp/​tomcat/​node73/​work 
-... 
-</​file>​ 
- 
-''​home/​nutzer01/​workshop/​node73/​bin/​shutdown.sh''​ : 
-<​file>​ 
-... 
-export CATALINA_OUT=/​var/​log/​tomcat/​node73/​catalina.out 
-export CATALINA_TMPDIR=/​var/​tmp/​tomcat/​node73/​temp 
-export JAVA_OPTS=-Dport.prefix=73 -Dcatalina.workdir=/​var/​tmp/​tomcat/​node73/​work 
-... 
-</​file>​ 
- 
-''​home/​nutzer01/​workshop/​node73/​conf/​server.xml''​ : 
-<​file>​ 
-<Engine ...> ​ 
-   <​Host name="​localhost"​ appBase="​webapps"​ workDir="​${catalina.workdir}"​ > 
-   </​Host>​ 
-</​Engine>​ 
-</​file>​ 
- 
-Anpassung der /​etc/​logrotate.d auf /​var/​log/​tomcat/​catalina.out nicht vergessen! 
- 
- 
- 
- 
- 
-==== Java 7 und Tomcat >7.0.42 formatting ==== 
- 
-   * SimpleFormatter http://​www.docjar.com/​html/​api/​java/​util/​logging/​SimpleFormatter.java.html 
-   * Formatter Pattern syntax http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Formatter.html 
- 
- 
-''​conf/​logging.properties''​ 
-<​file>​ 
-.handlers=java.util.logging.ConsoleHandler 
- 
-handlers=java.util.logging.ConsoleHandler 
- 
-java.util.logging.ConsoleHandler.level=FINE 
-java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter 
-java.util.logging.SimpleFormatter.format=%1$tb %1$td, %1$tY %1$tl:​%1$tM:​%1$tS %1$Tp %2$s %4$s: %5$s%n 
-org.apache.tomcat.util.digester.Digester.level=OFF 
- 
-</​file>​ 
- 
-Ausgabe 
-<​file>​ 
-Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/​server.xml:​ Attribute name "​port"​ associated with an element type "​Server"​ must be followed by the ' = ' character. 
-Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/​server.xml:​ Attribute name "​port"​ associated with an element type "​Server"​ must be followed by the ' = ' character. 
-Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina start SEVERE: Cannot start server. Server instance is not configured. 
-</​file>​ 
- 
-   * ISO_8601 http://​de.wikipedia.org/​wiki/​ISO_8601 
-<​file>​ 
-.handlers=java.util.logging.ConsoleHandler 
- 
-handlers=java.util.logging.ConsoleHandler 
- 
-java.util.logging.ConsoleHandler.level=FINE 
- 
-java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter 
-java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$tdT%1$tH:​%1$tM:​%1$tS.%1$tL%1$tz %2$s %4$s: %5$s%n 
- 
-org.apache.tomcat.util.digester.Digester.level=OFF 
- 
-</​file>​ 
- 
-Ausgabe 
-<​file>​ 
-2014-09-02T12:​15:​09.333+0200 org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/​server.xml:​ Attribute name "​port"​ associated with an element type "​Server"​ must be followed by the ' = ' character. 
-2014-09-02T12:​15:​09.338+0200 org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/​server.xml:​ Attribute name "​port"​ associated with an element type "​Server"​ must be followed by the ' = ' character. 
-2014-09-02T12:​15:​09.338+0200 org.apache.catalina.startup.Catalina start SEVERE: Cannot start server. Server instance is not configured. 
-</​file>​ 
- 
-Es fehlt die Angabe über den Threadname oder die ID dieses gibt es nur mit dem OneLineFormatter bisher! 
- 
-==== Einsatz OneLineformatter des Tomcat 7 - JULI ==== 
- 
-Als erster müssen wir die Source aus dem Trunk des Apache Tomcat 7 holen. 
- 
-<​file>​ 
-mkdir -p workshop/​formatter/​src/​org/​apache/​juli 
-cd workshop/​formatter/​src/​org/​apache/​juli 
-wget http://​svn.apache.org/​repos/​asf/​tomcat/​trunk/​java/​org/​apache/​juli/​OneLineFormatter.java 
-wget http://​svn.apache.org/​repos/​asf/​tomcat/​trunk/​java/​org/​apache/​juli/​DateFormatCache.java 
-javac -cp ../​../​../​../​../​apache-tomcat.6.0.32/​bin/​tomcat-juli.jar *.java 
-cd ../../.. 
-jar -cf ../​formatter.jar org/​apache/​juli/​*.class 
-cp ../​formatter.jar ../​../​node73/​bin 
-cd ../​../​node73 
-</​file>​ 
- 
-''​bin/​setenv.sh''​ 
-<​file>​ 
-#!/bin/bash 
-export CLASSPATH=$CLASSPATH:​$CATALINA_BASE/​bin/​formatter.jar 
-</​file>​ 
- 
-''​conf/​logging.properties''​ 
-<​file>​ 
-handlers = 1catalina.org.apache.juli.FileHandler 
-.handlers = 1catalina.org.apache.juli.FileHandler 
-.level=INFO 
-1catalina.org.apache.juli.FileHandler.level = FINE 
-1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/​logs 
-1catalina.org.apache.juli.FileHandler.prefix = catalina. 
-1catalina.org.apache.juli.FileHandler.formatter = org.apache.juli.OneLineFormatter 
-</​file>​ 
- 
-restart des Servers und Kontrolle des Log Files  
- 
-''​logs/​catalina.YYYY-MM_DD.log''​ 
-<​file>​ 
-12-Jul-2011 12:​38:​09.835 INFO org.apache.coyote.http11.Http11Protocol.start Starting Coyote HTTP/1.1 on http-7380 
-12-Jul-2011 12:​38:​10.046 INFO org.apache.jk.common.ChannelSocket.init JK: ajp13 listening on /​0.0.0.0:​7309 
-12-Jul-2011 12:​38:​10.060 INFO org.apache.jk.server.JkMain.start Jk running ID=0 time=0/​44 ​ config=null 
-12-Jul-2011 12:​38:​10.086 INFO org.apache.catalina.startup.Catalina.start Server startup in 5390 ms 
-</​file>​ 
- 
-Im Tomcat 7 existiert noch ein AsyncFileHandler der sich für High Traffic Sites eignet. 
- 
-''​conf/​logging.properties''​ 
-<​file>​ 
-handlers = 1catalina.org.apache.juli.AsyncFileHandler 
- 
-.handlers = 1catalina.org.apache.juli.AsyncFileHandler 
- 
-1catalina.org.apache.juli.AsyncFileHandler.level = FINE 
-1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/​logs 
-1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina 
-1catalina.org.apache.juli.AsyncFileHandler.rotatable= false 
-1catalina.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter 
- 
-java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$tdT%1$tH:​%1$tM:​%1$tS.%1$tL%1$tz %2$s %4$s: %5$s%n 
- 
-org.apache.tomcat.util.digester.Digester.level=OFF 
- 
-</​file>​ 
- 
- 
-|System properties | Default | 
-|org.apache.juli.AsyncOverflowDropType| 1 | 
-|org.apache.juli.AsyncMaxRecordCount | 10000 | 
-|org.apache.juli.AsyncLoggerPollInterval | 1000 | 
- 
-| AsyncOverflowDropType | Wert | 
-|OVERFLOW_DROP_LAST | 1 | 
-|OVERFLOW_DROP_FIRST | 2 | 
-|OVERFLOW_DROP_FLUSH ​ | 3 | 
-|OVERFLOW_DROP_CURRENT | 4 | 
- 
-Referenz der Properties: http://​tomcat.apache.org/​tomcat-7.0-doc/​api/​org/​apache/​juli/​FileHandler.html 
- 
-==== Links zu Java Logging API's ==== 
- 
-^ Beschreibung ^ Link ^ 
-| commons-logging ​                    | http://​commons.apache.org/​logging/​ | 
-| log4j                               | http://​logging.apache.org/​log4j | 
-| tomcat logging ​                     | http://​tomcat.apache.org/​tomcat-6.0-doc/​logging.html | 
-| logback (Nachfolger von log4j) ​     | http://​logback.qos.ch/​ | 
-| logback AccessLog and Filter ​       | http://​logback.qos.ch/​access.html | 
-| SLF4J logback Tomcat Binding ​       | http://​github.com/​grgrzybek/​tomcat-slf4j-logback | 
-| SLF4J logback Tomcat Download ​      | https://​github.com/​grgrzybek/​tomcat-slf4j-logback/​downloads | 
-| Log4j Tutorial ​                     | http://​www.torsten-horn.de/​techdocs/​java-log4j.htm | 
-| Java Logging API Erweiterung X4Juli | http://​www.x4juli.org/​ | 
-| Syslog4j ​                           | http://​syslog4j.org/​ | 
-==== Access Log ==== 
-''​./​conf/​server.xml''​ unterhalb des Tags Engine oder Host oder innerhalb der Context Definition für eine Anwendung ''​./​conf/​Catalina/​localhost/<​app>​.xml''​ : 
-<​file>​ 
-      <Valve className="​org.apache.catalina.valves.AccessLogValve" ​ 
-             ​directory="​logs"  ​ 
-             ​prefix="​access-" ​ 
-             ​suffix="​.log" ​ 
-             ​pattern="​%h %l &​quot;​%u&​quot;​ %t &​quot;​%r&​quot;​ %s %b %D %S" ​ 
-             ​resolveHosts="​false"​ 
-      /> 
-</​file>​ 
- 
-Im Apache Tomcat 7 lässt sich der Zeitstempel auf die Millisekunde genau erzeugen und 
-man kann festlegen, ob der Zeitstempel vom Beginn oder Ende des Requests ausgeben wird. 
-''​./​conf/​Catalina/​localhost/<​app>​.xml''​ : 
-<​file>​ 
-        <Valve className="​org.apache.catalina.valves.AccessLogValve"​ 
-           ​directory="​logs"  ​ 
-           ​prefix="​access-"​ 
-           ​suffix="​.log"​ 
-           ​rotatable="​true"​ 
-           ​pattern="​%h &​quot;​%{begin:​yyyy-MM-dd'​T'​HH:​mm:​ss:​SSSZ}t&​quot;​ %{begin:​msec}t &​quot;​%r&​quot;​ &​quot;​%{Referer}i&​quot;​ &​quot;​%{User-Agent}i&​quot;​ %s %b &​quot;​%I&​quot;​ %D %S" 
-           ​resolveHosts="​false"/>​ 
-</​file>​ 
- 
-=== testen === 
-100 Anfragen schicken: 
-  ab -c 5 -n 100 -k http://​localhost:​7380/​hello/​index.jsp 
-Anfragen größer 70 Millisekunden filter: 
-  awk '​$(NF-1)/​10 >= 7' logs/​access-2010-06-25.log 
-  perl -a -n -e 'print $F[-2],$/ if $F[-2] > 70' logs/​access-2010-06-25.log 
- 
-=== Dokumentation === 
-  * http://​localhost:​8080/​docs/​config/​valve.html 
- 
-=== Dynamische Konfiguration des AccessLogValve === 
-Einfügen des ServerLifeCycleListener bewirkt, das das JMX Mbean MBeanFactory hinzugefügt wird. 
-Mit Hilfe des Mbean kann man zur Laufzeit Tomcat Komponenten wie eine AccessLogValve hinzufügen und ein 
-Ausgabe setzen. 
- 
-Im Apache Tomcat 7 gibt es diese Klasse nicht mehr und die MbeanFactory ist immer aktiv! 
- 
-''​conf/​server.xml''​ 
 <​code>​ <​code>​
-<Server ..+   <filter
-   ​<Listener className="​org.apache.catalina.mbeans.ServerLifecycleListener" ​/> +      <filter-name>​ExpiresFilter</​filter-name>​ 
-   .. +      <​filter-class>​org.apache.catalina.filters.ExpiresFilter<​/filter-class
-   +      <​init-param>​ 
-   <Service ..+         <​param-name>​ExpiresByType text</​param-name>​ 
-   .. +         <​param-value>​access plus 2 days</​param-value>​ 
-   ​</Service+      </​init-param>​ 
-</Server>+   </filter
 +   <​filter-mapping>​ 
 +      <​filter-name>​ExpiresFilter</​filter-name>​ 
 +      <​url-pattern>​*.html</​url-pattern>​ 
 +      <​dispatcher>​REQUEST</dispatcher
 +   ​</filter-mapping>
 </​code>​ </​code>​
  
-Attribute Pattern für das AccesLogValve mit einer erweiterten Ausgabe +===== Tag 2 =====
-<​code>​ +
-%h %l "​%u"​ %t "​%r"​ %s %b %D %S "​%{User-Agent}i"​ "​%{Referer}i"​ +
-</​code>​ +
-Vorsicht: In der server.xml die Doppelten Anführungsstriche bitte durch &quot; ersetzen.+
  
-Mit dem Attribute <​code>​enabled=false</​code>​ des AccessLogValve kann ein Ausgabe unterbunden werden. Dafür +==== 2.4 - SSL Connector ====
-kann der JMX Zugang via jconsole genutzt werden.+
  
-Dynamisch kann man diese Umschaltung auf via Manager App folgendermassen bewirken. 
 <​code>​ <​code>​
-http://​notebook20:​7380/​manager/​jmxproxy?​set=Catalina:​type=Valve,name=AccessLogValve,​seq=1&att=enabled&​val=false+<​Connector port="​8443"​ protocol="​org.apache.coyote.http11.Http11NioProtocol"​ 
 +   ​maxThreads="​150"​ SSLEnabled="​true"​ scheme="​https"​ secure="​true"​ > 
 +   <​SSLHostConfig protocols="​all,​-TLSv1,​-TLSv1.1
 +                  ciphers="​HIGH:​!aNULL:​!eNULL:​!EXPORT:​!DES:​!RC4:​!MD5:​!kRSA"​ 
 +                  honorCipherOrder="​true"​ > 
 +      <​Certificate  
 +           ​certificateKeystoreFile="​${catalina.base}/​conf/​keystore.jks"​ 
 +           ​certificateKeystorePassword="​changeit"​ /> 
 +    </​SSLHostConfig>​ 
 +</​Connector>​
 </​code>​ </​code>​
  
-==== ELK-Stack for tomcat accesslog ​==== +==== 2.5 Anpassungen logging.properties ​====
- +
-=== Logstash === +
- +
-http://​logstash.net/​docs/​1.4.2/​tutorials/​getting-started-with-logstash+
  
 <​code>​ <​code>​
-curl -O https://​download.elasticsearch.org/​logstash/​logstash/​logstash-1.4.2.tar.gz +handlers = 1catalina.org.apache.juli.AsyncFileHandler,​ 
-tar zxvf logstash-1.4.2.tar.gz +2localhost.org.apache.juli.AsyncFileHandler,​ 
-cd logstash-1.4.2 +3manager.org.apache.juli.AsyncFileHandler,​ 4hostmanager
-bin/​logstash -e 'input { stdin { } } output { stdout {} }' +org.apache.juli.AsyncFileHandler,​ java.util.logging.ConsoleHandler,​ 
-bin/​logstash -e 'input { stdin { } } output { stdout { codec => rubydebug } }'+5workshop1.org.apache.juli.AsyncFileHandler,​ 
 +6workshop2.org.apache.juli.AsyncFileHandler
 </​code>​ </​code>​
- 
-Bald 1.5.x 
- 
-Auf jeder Maschine sollten die Logs mit dem logstashforwarder abgeholt werden. 
-  
-https://​github.com/​elastic/​logstash-forwarder 
- 
-Aufgaben 
- 
-* Multiline Logs 
-* Exceptions 
-* Direkt Log mit GELF 
-* Informationen in Log Meldungen maschinenlesbar formulieren 
-* Begrenzung der Logs auf Verwertbares 
-* Ausfall und wiederaufsetzen der LogInfrastruktur 
-  * Redis Cache 
-  * Skallierung 
- 
-=== Elasticsearch === 
- 
-https://​github.com/​elastic/​elasticsearch 
- 
 <​code>​ <​code>​
-curl -O https://​download.elasticsearch.org/​elasticsearch/​elasticsearch/​elasticsearch-1.5.2.tar.gz +5workshop1.org.apache.juli.AsyncFileHandler.level = FINE 
-tar zxvf elasticsearch-1.5.2.tar.gz +5workshop1.org.apache.juli.AsyncFileHandler.directory = ${catalina.var}/logs 
-cd elasticsearch-1.5.2+5workshop1.org.apache.juli.AsyncFileHandler.prefix = workshop_log1
-cd config +5workshop1.org.apache.juli.AsyncFileHandler.maxDays = 90 
-vi elasticsearch.conf +5workshop1.org.apache.juli.AsyncFileHandler.encoding = UTF-8
-# disable autorecovery cluster +
-discovery.zen.ping.multicast.enabled: false +
-./​bin/​elasticsearch +
-bin/​logstash ​-e 'input { stdin { } } output { elasticsearch { host => localhost } }' +
-curl '​http://​localhost:​9200/​_search?​pretty'​ +
-</​code>​+
  
-''​tomcat.conf''​ +6workshop2.org.apache.juli.AsyncFileHandler.level ​FINE 
- +6workshop2.org.apache.juli.AsyncFileHandler.directory ​${catalina.var}/logs 
-<​file>​ +6workshop2.org.apache.juli.AsyncFileHandler.prefix ​workshop_log2
-input { stdin { } } +6workshop2.org.apache.juli.AsyncFileHandler.maxDays = 90 
- +6workshop2.org.apache.juli.AsyncFileHandler.encoding = UTF-8
-filter { +
-  grok { +
-      match => { "​message"​ => "​%{IPORHOST:​clientip} \"​%{TIMESTAMP_ISO8601:​timestamp}\"​ %{NUMBER:​unixtime:​int} \"​%{WORD:​verb} %{URIPATHPARAM:​request} HTTP/​%{NUMBER:​httpversion}\"​ \"​(?:​%{URI:​referrer}|-)\"​ \"​%{GREEDYDATA:​agent}\"​ %{NUMBER:​response:​int} (?:​%{NUMBER:​bytes:​int}|-) \"​%{GREEDYDATA:​thread}\"​ %{NUMBER:​duration:​int} (?:​%{WORD:​session_id}.%{WORD:​node}|-)"​} +
-  } +
- +
-+
- +
-output { +
-  elasticsearch { host => localhost } +
-  ​stdout { codec => rubydebug } +
-+
-</​file>​ +
- +
- +
-Parse all access logs +
- +
-<​file>​ +
-input { +
-  file { +
-    path => "/​home/​nutzer17/​workshop/​*/​logs/​access-*.log" +
-    start_position ​=> beginning +
-  } +
-+
- +
- +
-filter ​{ +
-  grok { +
-      match => { "​message"​ => "​%{IPORHOST:​clientip} \"​%{TIMESTAMP_ISO8601:​timestamp}\"​ %{NUMBER:​unixtime:​int} \"​%{WORD:​verb} %{URIPATHPARAM:​request} HTTP/​%{NUMBER:​httpversion}\"​ \"​(?:​%{URI:​referrer}|-)\"​ \"​%{GREEDYDATA:​agent}\"​ %{NUMBER:​response:​int} (?:​%{NUMBER:​bytes:​int}|-) \"​%{GREEDYDATA:​thread}\"​ %{NUMBER:​duration:​int} (?:​%{WORD:​session_id}.%{WORD:node}|-)"​} +
-  } +
-+
- +
-output { +
-  elasticsearch { host => localhost } +
-  stdout { codec => rubydebug } +
-+
-</file> +
- +
-Install HQ Plugin +
- +
-http://​www.elastichq.org/​support_plugin.html +
- +
-open http://​localhost:​9200/​_plugin/​HQ/​ +
- +
-Aufgaben +
- +
-* Erlernen der Query Sprache ist komplex und aufwendig +
-* Cluster +
-* Backup und Restore von Indexen +
- +
-=== Kibana === +
- +
- +
-https://​github.com/​elastic/​kibana +
- +
-<​code>​ +
-curl -O https://​download.elastic.co/​kibana/​kibana/​kibana-4.0.2-linux-x64.tar.gz +
-tar zxvf kibana-4.0.2-linux-x64.tar.gz +
-cd kibana-4.0.2/bin +
-./kibana +
-open http://​localhost:​5601+
 </​code>​ </​code>​
- 
-Änderungen in config/​kibana.yml 
- 
-Aufgaben 
- 
-* Erstellen eines Dashboards 
-* Sollen Metriken auch in Elasticsearch gespeichert werden? (Volumen) 
- 
-===== Speicher einstellen ===== 
-''​bin/​startup.sh''​ : 
-<​file>​ 
-export CATALINA_OPTS="​-Dport.prefix=73 -Xms64m -Xmx128m"​ 
-</​file>​ 
- 
-Perm Heap vergössern 
 <​code>​ <​code>​
--XX:​MaxPermSize=256m+ws_log.handlers ​5workshop1.org.apache.juli.AsyncFileHandler 
 +de.kippdata.workshop.handlers = 6workshop2.org.apache.juli.AsyncFileHandler
 </​code>​ </​code>​
- +==== 2.6 - log4j.xml ====
-GC Logging+
 <​code>​ <​code>​
-DATE=`date +'%y-%m-%d-%H-%M-%S'` +<?xml version="​1.0"​ encoding="​UTF-8"?>​ 
-export CATALINA_OPTS="$CATALINA_OPTS -verbosegc -Xloggc:$CATALINA_BASE/logs/gc-$DATE.log"​ +<!-- You can add the attribute monitorInterval (seconds) 
-export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCDateStamps ​-XX:​+PrintGCDetails ​-XX:+PrintTenuringDistribution"+     to the Configuration element for hot config reloading,  
 +     for example: <​Configuration monitorInterval="​60"> ​--> 
 +<​Configuration status="​warn"​ monitorInterval="​60">​ 
 +  <​Appenders>​ 
 +    <​RollingFile name="​default"​ 
 +                 ​fileName="${sys:catalina.var}/logs/catalina.log"​ 
 +                 filePattern="${sys:catalina.var}/​logs/​catalina.log.%d{yyyy-MM-dd-HHmmss}">​ 
 +      <​PatternLayout>​ 
 +        <​pattern>​%d %r %p [%t] %c (%F:%L) - %m%n</​pattern>​ 
 +      </​PatternLayout>​ 
 +      <!-- Daily Rotation, schedule is cron style 
 +           with columns seconds, minutes, hours, day-of-month,​ 
 +           ​month,​ day-of-week,​ year(optional) --> 
 +      <​CronTriggeringPolicy schedule="0 0 0 * * ?" /> 
 +    </​RollingFile>​ 
 +  </​Appenders>​ 
 +  <​Loggers>​ 
 +    <Root level="​info">​ 
 +      <​AppenderRef ref="​default"/>​ 
 +    </​Root>​ 
 +<!-- Example for changing a log level 
 +    <Logger name="​org.apache.catalina"​ 
 +            level="​info"​ additivity="​false">​ 
 +      <​AppenderRef ref="​default"/>​ 
 +    </​Logger>​ 
 +    <Logger name="​org.apache.catalina.core.ContainerBase.[Catalina].[localhost]"​ 
 +            level="​info"​ additivity="​false">​ 
 +      <​AppenderRef ref="​default"/>​ 
 +    </​Logger>​ 
 +    <Logger name="​org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/​manager]"​ 
 +            level="​info"​ additivity="​false">​ 
 +      <​AppenderRef ref="​default"/>​ 
 +    </​Logger>​ 
 +--> 
 +  </​Loggers>​ 
 +</​Configuration>​
 </​code>​ </​code>​
  
-Jstat Memory Trace+==== 2.7 - JMX Remote ====
 <​code>​ <​code>​
-jstat -gc `cat logs/tomcat.pid` 5000 +JMX_OPTS_NOSSL_NOAUTH="​\ 
-</​code>​+-Dcom.sun.management.jmxremote=true \ 
 +-Dcom.sun.management.jmxremote.port=1090 \ 
 +-Dcom.sun.management.jmxremote.ssl=false \ 
 +-Dcom.sun.management.jmxremote.authenticate=false \ 
 +"
  
-GCViewer +JMX_OPTS_SSL_NOAUTH="​\ 
-  * https://​github.com/​chewiebug/​GCViewer.git +-Dcom.sun.management.jmxremote=true \ 
-  * https://​github.com/chewiebug/gcviewer/​wiki+-Dcom.sun.management.jmxremote.port=1090 \ 
 +-Dcom.sun.management.jmxremote.ssl=true \ 
 +-Dcom.sun.management.jmxremote.authenticate=false \ 
 +-Djavax.net.ssl.keyStorePassword=workshop \ 
 +-Djavax.net.ssl.keyStore=${CATALINA_BASE}/conf/keystore.jks \ 
 +"
  
- +JMX_OPTS_SSL_AUTH="\ 
-VmParameter +-Dcom.sun.management.jmxremote=true \ 
-   * List all Parameter <​code>​java ​ -XX:​+UnlockDiagnosticVMOptions -XX:​+PrintFlagsFinal -version</​code>​ +-Dcom.sun.management.jmxremote.port=1090 ​
-  * http://​orwell-staat.de/​ubuntu/​vmparameters.html +-Dcom.sun.management.jmxremote.ssl=true \
-===== Sessions ===== +
-http://​localhost:​7380/​manager/​html/​sessions?​path=/​hello +
- +
-Eine alternativer Tomcat Manager ist psi-probe. +
- +
-Schicker: http://​code.google.com/​p/​psi-probe +
-runterladen und +
-  unzip probe-2.3.3.zip +
-  cp probe.war webapps +
- +
-===== Weitere Tomcat Instanz ===== +
-  cd +
-  cp -a node73/ node74 +
-  cd node74/ +
-''​bin/​startup.sh''​ : +
-<code bash> +
-#​!/​bin/​bash +
-export CATALINA_HOME=~/​apache-tomcat/​ +
-export CATALINA_BASE=~/​node74/​ +
-export JAVA_OPTS="-Dport.prefix=74"​ +
-export CATALINA_OPTS="​-Xmx128m"​ +
-export CATALINA_PID="​${CATALINA_BASE}/​logs/​tomcat.pid" +
-${CATALINA_HOME}/​bin/​catalina.sh start $@ +
-</​code>​ +
-''​bin/​shutdown.sh''​ : +
-<code bash> +
-#​!/​bin/​bash +
-export CATALINA_HOME=~/​apache-tomcat/​ +
-export CATALINA_BASE=~/​node74/​ +
-export JAVA_OPTS="​-Dport.prefix=74"​ +
-export CATALINA_PID="​${CATALINA_BASE}/​logs/​tomcat.pid"​ +
-${CATALINA_HOME}/​bin/​catalina.sh stop $@ +
-</​code>​ +
-  ./​bin/​startup.sh +
- +
- +
-oder:: +
- +
-<​code>​ +
-vi start +
-ln -s start stop +
-vi setenv.sh +
-vi restart +
-chmod 700 start stop restart +
-</​code>​ +
-''​start''​ +
-<​code>​ +
-#​!/​bin/​bash +
-export CATALINA_HOME=~/​workshop/​apache-tomcat +
-export CATALINA_BASE=~/​workshop/​node74 +
-${CATALINA_HOME}/​bin/​catalina.sh `basename $0` $@ +
-</​code>​ +
- +
-''​setenv.sh''​ +
-<​code>​ +
-export JAVA_OPTS="​-Dport.prefix=74"​ +
-export CATALINA_PID="​${CATALINA_BASE}/​logs/​tomcat.pid"​ +
-export CATALINA_OPTS="​-Xmx128m"​ +
-export CATALINA_OPTS="​$CATALINA_OPTS ​-Dcom.sun.management.jmxremote \ +
--Dcom.sun.management.jmxremote.ssl=false \+
 -Dcom.sun.management.jmxremote.authenticate=true \ -Dcom.sun.management.jmxremote.authenticate=true \
--Dcom.sun.management.jmxremote.password.file=../​conf/​jmxremote.password ​+-Dcom.sun.management.jmxremote.access.file=${CATALINA_BASE}/​conf/​jmxremote.access ​
--Dcom.sun.management.jmxremote.access.file=../​conf/​jmxremote.access ​+-Dcom.sun.management.jmxremote.password.file=${CATALINA_BASE}/​conf/​jmxremote.password ​
--Djava.rmi.server.hostname=$(hostname) ​+-Djavax.net.ssl.keyStorePassword=workshop ​
--Djava.rmi.server.useLocalHostname=true"​ +-Djavax.net.ssl.keyStore=${CATALINA_BASE}/​conf/​keystore.jks \ 
-export CATALINA_OPTS="​$CATALINA_OPTS -Djava.awt.headless=true" ​ +"
-</​code>​+
  
-''​restart''​ +CATALINA_OPTS="​$CATALINA_OPTS $JMX_OPTS_NOSSL_NOAUTH"​
-<​code>​ +
-#​!/​bin/​bash +
-~/​workshop/​node74/​bin/​stop -force +
-sleep 2 +
-~/​workshop/​node74/​bin/​start+
 </​code>​ </​code>​
-===== Praktischere Minimale Konfiguration ===== 
-  cp -a ../​apache-tomcat-6.0.35/​conf/​* conf/ 
  
-Änderungen ( nicht vollständig ):+===== Tag 3 =====
  
-''​conf/​server.xml''​ : +==== 3.7 - Ressources ​====
-<code xml> +
-<Server port="​${port.prefix}05"​ shutdown="​SHUTDOWN"​ > +
-<​Connector port="​${port.prefix}80"​ protocol="​HTTP/​1.1" connectionTimeout="​20000"​ redirectPort="​8443"​ /> +
-<​Connector port="​${port.prefix}09"​ protocol="​AJP/​1.3"​ redirectPort="​8443"​ /> +
-</​code>​+
  
-===== Universelles Start Skript ===== 
- 
-ermittelt seinen Namen aus dem Verzeichnis node<​prefix>​ und setzt die jvmRoute und den port.prefix für die server.xml. 
- 
-''​bin/​startup.sh''​ : 
-<code bash> 
-#!/bin/bash 
-# Get the fully qualified path to the script 
-case $0 in 
-    /*) 
-        SCRIPT="​$0"​ 
-        ;; 
-    *) 
-        PWD=`pwd` 
-        SCRIPT="​$PWD/​$0"​ 
-        ;; 
-esac 
- 
-# Change spaces to ":"​ so the tokens can be parsed. 
-SCRIPT=`echo $SCRIPT | sed -e 's; ;:;g'` 
-# Get the real path to this script, resolving any symbolic links 
-TOKENS=`echo $SCRIPT | sed -e 's;/; ;g'` 
-REALPATH= 
-for C in $TOKENS; do 
-    REALPATH="​$REALPATH/​$C"​ 
-    while [ -h "​$REALPATH"​ ] ; do 
-        LS="​`ls -ld "​$REALPATH"​`"​ 
-        LINK="​`expr "​$LS"​ : '​.*->​ \(.*\)$'​`"​ 
-        if expr "​$LINK"​ : '/​.*'​ > /dev/null; then 
-            REALPATH="​$LINK"​ 
-        else 
-            REALPATH="​`dirname "​$REALPATH"​`""/​$LINK"​ 
-        fi 
-    done 
-done 
-# Change ":"​ chars back to spaces. 
-REALPATH=`echo $REALPATH | sed -e 's;:; ;g'` 
- 
-# Change the current directory to the location of the script 
-cd "​`dirname "​$REALPATH"​`"​ 
-cd "​`dirname "​$SCRIPT"​`"​ 
-REALDIR=`pwd` 
-parentdir=`dirname $REALDIR` 
-export CATALINA_BASE=$parentdir 
- 
-INSTANCE_NAME=`basename $parentdir` 
-PORT_PREFIX=`echo $INSTANCE_NAME | awk '{ printf substr($1,​5,​2)}'​` 
- 
-export CATALINA_HOME=/​home/​nutzer01/​workshop/​apache-tomcat-6.0.35 
-export CATALINA_OUT=/​var/​log/​tomcat/​$INSTANCE_NAME/​catalina.out 
-mkdir -p /​var/​log/​tomcat/​$INSTANCE_NAME 
-export CATALINA_TMPDIR=/​var/​tmp/​tomcat/​$INSTANCE_NAME/​temp 
-mkdir -p /​var/​tmp/​tomcat/​$INSTANCE_NAME 
-export JAVA_OPTS="​-DjvmRoute=$INSTANCE_NAME -Dport.prefix=$PORT_PREFIX"​ 
-export CATALINA_OPTS="​-server -Xmx128m -Dcatalina.workdir=/​var/​tmp/​tomcat/​$INSTANCE_NAME/​work"​ 
-export CATALINA_PID=/​var/​log/​tomcat/​$INSTANCE_NAME/​tomcat.pid 
-$CATALINA_HOME/​bin/​catalina.sh start $@ 
- 
-</​code>​ 
- 
-===== Dokumentation ===== 
-http://​localhost:​8080/​docs/​config/​index.html 
- 
- 
- 
-===== Java Tools ===== 
- 
-Liste aller Java Prozesse eines Nutzers 
-  jps 
- 
-  2390 Bootstrap 
-  8259 Jps 
-  8244 Bootstrap 
- 
-Ausgabe der Parameter der Java Prozesse 
-  jps -vml 
- 
-  2390 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28/​conf/​logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28/​endorsed -Dcatalina.base=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28 -Dcatalina.home=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28 -Djava.io.tmpdir=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28/​temp 
-  8295 sun.tools.jps.Jps -vml -Dapplication.home=/​usr/​lib/​jvm/​java-6-openjdk -Xms8m 
-  8244 org.apache.catalina.startup.Bootstrap start -Dnop -DjvmRoute=node74 -Dport.prefix=74 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcatalina.workdir=/​var/​tmp/​tomcat/​node74/​work -Djava.endorsed.dirs=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28/​endorsed -Dcatalina.base=/​home/​nutzer06/​workshop/​node74 -Dcatalina.home=/​home/​nutzer06/​workshop/​apache-tomcat-6.0.28 -Djava.io.tmpdir=/​var/​tmp/​tomcat/​node74/​temp 
- 
-Protokollierung des Speicherverbrauchs eines Java Prozesses 
- 
-  jstat -gc <​jpid>​ <time msec> 
- 
-Ausgabe ​ 
- 
-  S0C    S1C    S0U    S1U      EC       ​EU ​       OC         ​OU ​      ​PC ​  ​PU ​   YGC     ​YGCT ​   FGC    FGCT     ​GCT ​   
-   ​64,​0 ​  ​64,​0 ​  ​0,​0 ​   32,0   ​4288,​0 ​  ​342,​9 ​   35776,​0 ​    ​3195,​2 ​  ​16384,​0 10085,​0 ​   125    0,142  28      1,567    1,709 
-   ​64,​0 ​  ​64,​0 ​  ​0,​0 ​   32,0   ​4288,​0 ​  ​342,​9 ​   35776,​0 ​    ​3195,​2 ​  ​16384,​0 10085,​0 ​   125    0,142  28      1,567    1,709 
-   ​64,​0 ​  ​64,​0 ​  ​0,​0 ​   32,0   ​4288,​0 ​  ​428,​7 ​   35776,​0 ​    ​3195,​2 ​  ​16384,​0 10085,​0 ​   125    0,142  28      1,567    1,709 
- 
- 
-===== Connector in der server.xml ===== 
- 
-Im Tomcat 6 ist es möglich einen Threadpool auf der Basis des Standard Java Executor API zu nutzen. 
-Damit können endlich auch verschiedenen Connectoren einen gemeinsamen Threadpool nutzen. 
 <​code>​ <​code>​
-<Executor name="​Catalina-Threads"​ namePrefix="​Catalina-exec"​ maxThreads="​200"​ minSpareThreads="​50" /+<Context docBase="/opt/​webapps/​workshop/​3.1.0/workshop.war"​
-<​Connector port="​${port.prefix}80"​ executor="​Catalina-Threads"​ protocol="​HTTP/​1.1" ​/> +   ​<Resources>​ 
-<Connector port="​${port.prefix}90"​ executor="​Catalina-Threads"​ protocol="​org.apache.coyote.http11.Http11NioProtocol" ​/> +      <​PreResources className="​org.apache.catalina.webresources.DirResourceSet
- +                     base="${catalina.base}/​conf/​workshop" ​webAppMount="/WEB-INF/classes" /> 
-<​Connector port="${port.prefix}09" ​executor="Catalina-Threads"​ protocol="​org.apache.coyote.ajp.AjpProtocol" /> +   </​Resources>​ 
 +</​Context>​
 </​code>​ </​code>​
  
- +==== 3.8 - LDAP Realm ====
-==== server.xml ====+
  
 <​code>​ <​code>​
-<?xml version='​1.0'​ encoding='​utf-8'?>​ +   <Realm className="​org.apache.catalina.realm.JNDIRealm
-<Server port="​${port.prefix}05"​ shutdown="​SHUTDOWN">​ +          ​connectionName="cn=tcmanager,​ou=specialusers,​dc=linuxhotel,​dc=de
-  <​Listener ​className="​org.apache.catalina.startup.VersionLoggerListener" ​/> +          ​connectionPassword="secret
-  <​Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"​ /> +          ​connectionURL="ldap://ldapserver:​389/" 
- +          ​userBase="ou=people,dc=linuxhotel,​dc=de
- <​GlobalNamingResources>​ +          ​userSubtree="true
-    <​Resource name="​UserDatabase"​  +          ​userSearch="(uid={0})
-              auth="​Container"​ +          ​roleBase="ou=groups,dc=linuxhotel,​dc=de
-              type="​org.apache.catalina.UserDatabase"​ +          ​roleSubtree="true
-              description="User database that can be updated and saved+          ​roleName="cn
-              ​factory="org.apache.catalina.users.MemoryUserDatabaseFactory+          ​roleSearch="(uniqueMember={0})
-              ​pathname="conf/tomcat-users.xml" ​/+          />
-  </GlobalNamingResources>​  +
-  <Service name="Catalina">​ +
-    <​Executor ​ name="TomcatThreads"​  +
-               ​namePrefix="​Catalina-exec"​ +
-               ​maxThreads="​200"​  +
-               ​minSpareThreads="50" /> +
-    <​Connector port="${port.prefix}80"  +
-               protocol="org.apache.coyote.http11.Http11NioProtocol"​ +
-               ​executor="​TomcatThreads" ​   /> +
-    <​Connector port="​${port.prefix}81"  +
-               protocol="org.apache.coyote.http11.Http11Nio2Protocol"​ +
-               ​executor="​TomcatThreads" ​   /> +
-    <​Connector port="​${port.prefix}90"​ +
-               ​protocol="​org.apache.coyote.http11.Http11Protocol+
-               executor="TomcatThreads"/> +
- +
-    <Engine name="Catalina" ​     ​defaultHost="​localhost"​ jvmRoute="​node${port.prefix}">​ +
-      <​Valve className="org.apache.catalina.valves.AccessLogValve"​ +
-           ​directory="​logs" ​  +
-           ​prefix="​access-"​ +
-           ​suffix="​.log"​ +
-           ​rotatable="​true"​ +
-           ​pattern="​%h &quot;%{begin:​yyyy-MM-dd'​T'​HH:​mm:​ss:​SSSZ}t&quot; %{begin:​msec}t &​quot;​%r&​quot;​ &​quot;​%{Referer}i&​quot;​ &​quot;​%{User-Agent}i&​quot;​ %s %b &​quot;​%I&​quot;​ %D %S+
-           resolveHosts="​false"/>​  +
-      <Realm className="​org.apache.catalina.realm.UserDatabaseRealm"​ +
-             ​resourceName="​UserDatabase"/>​  +
-      <Host name="​localhost"​ appBase="​webapps">​ +
-      </​Host>​ +
-    </​Engine>​ +
-  </​Service>​ +
-</Server>+
 </​code>​ </​code>​
-==== Lasttest ==== 
  
-sudo apt-get install apache2-utils+===== Tag 4 =====
  
-Erzeugung von statischen Dateien 
-  cd webapps 
-  mkdir last 
-  cd last 
-  dd if=/​dev/​urandom of=8k.bin bs=1024 count=8 
-  dd if=/​dev/​urandom of=25k.bin bs=1024 count=25 
-  dd if=/​dev/​urandom of=64k.bin bs=1024 count=64 
-  dd if=/​dev/​urandom of=100k.bin bs=1024 count=100 
-  dd if=/​dev/​urandom of=250k.bin bs=1024 count=250 
  
-Ausführen der Test mit ab einer Testserie mit 5,​10,​25,​100,​200,​300 paralleln Anfragen mit jeweils 50000 Anfragen. +===== Tag =====
-  ab -c 5 -n 50000 -k http://​127.0.0.1:​7380/​last/​8k.bin +
-  ab -c 10 -n 50000 -k http://​127.0.0.1:​7380/​last/​8k.bin +
-  ...+
  
-Ausführung eines Tests +==== 5.1 - docker ====
-<​file>​ +
-cd workshop/​node74 +
-mkdir stat +
-vi last.sh +
-chmod 750 last.sh +
-</​file>​ +
-''​last.sh''​ +
-<​file>​ +
-#!/bin/sh+
  
-req=50000 
-for port in 7480 ; do \ 
-    for con in 10 50 100 250 400 800; do \ 
-        for datei in 8 25 64 100 250 ; do \ 
-          for iter in 1 2 3 ; do \ 
-          sleep 1 
-          ab -c ${con} -n ${req} -k \ 
-             ​http://​localhost:​${port}/​last/​${datei}k.bin > stat/​${port}-${datei}k-${con}-${req}-${iter}.txt ; 
-          done ; 
-        done ; 
-    done ; 
-done 
-</​file>​ 
- 
-Auswertung der Dateien 
-<​file>​ 
-cd stat 
-find . -exec grep -H "​Requests per" {} \; 
-</​file>​ 
- 
-  * http://​java.net/​projects/​faban/​ 
-  * http://​www.slamd.com/​ 
-  * http://​jakarta.apache.org/​jmeter 
- 
-Start visualVM remote 
 <​code>​ <​code>​
-ssh -X nutzer18@192.168.1.218 +FROM alpine:3.15
-jvisualvm --jdkhome /​usr/​lib/​jvm/​java-6-sun-1.6.0.26 +
-</​code>​+
  
-gnuplot+#### OpenJDK 17 
 +RUN apk update 
 +RUN apk add openjdk17-jre-headless 
 +ENV JAVA_HOME /​usr/​lib/​jvm/​java-17-openjdk
  
-  http://forums.cpanel.net/f402/using-apache-ab-benchmarking-gnuplot-graphing-275542.html+#### tcnative 
 +#ENV TCNATIVE 1.2.33 
 +#RUN apk add openjdk17-jdk apr-dev openssl-dev gcc make musl-dev 
 +#RUN wget -O /​tmp/​tomcat-native-${TCNATIVE}-src.tar.gz https://dlcdn.apache.org/tomcat/tomcat-connectors/​native/​${TCNATIVE}/​source/​tomcat-native-${TCNATIVE}-src.tar.gz; \ 
 +#  cd /tmp; \ 
 +#  tar -zxf tomcat-native-${TCNATIVE}-src.tar.gz; \ 
 +#  cd tomcat-native-${TCNATIVE}-src/​native;​ \ 
 +#  ./configure --prefix=/​opt/​tcnative/​${TCNATIVE};​ \ 
 +#  make; \ 
 +#  make install; \ 
 +#  cd /tmp; \ 
 +#  rm -rf /​tmp/​tomcat-native*
  
-  sudo -i +#### tomcat 
-  ​vi ​/etc/apt/​sources-list +ENV TOMCATVERSION 10.0.20 
-  sudo apt-get update +ENV INSTANCENAME workshop 
-  sudo apt-get install gnuplot +ENV TOMCATDIR ​/opt/tomcat 
-  vi plot.p +ENV WARFILE workshop.war 
-  ab -c 5 -n 50000 -g data.dat http://​localhost:​7380/​last/​8k.bin +ENV APPVERSION 3.1.0 
-   +ENV CATALINA_HOME ${TOMCATDIR}/products/apache-tomcat-${TOMCATVERSION} 
-''​/etc/apt/sources-list'' ​ +ENV CATALINA_BASE ${TOMCATDIR}/instances/${INSTANCENAME} 
-<​code>​ +ENV CATALINA_VAR ​/var/tomcat/${INSTANCENAME} 
-deb [arch=amd64] http://ubuntu/ubuntu ​         trusty ​         main restricted universe multiverse +ENV PATH $CATALINA_HOME/​bin:$PATH 
-deb [arch=amd64] http://ubuntu/ubuntu ​         trusty-security main restricted universe multiverse +ENV TCUSER tcrun 
-deb [arch=amd64] http://​ubuntu/​ubuntu ​         trusty-updates ​ main restricted universe multiverse +ENV TCGROUP tcgroup
-</​code>​ +
-  +
-''​plot.p''​ +
-<​code>​ +
-#output as png image +
-set terminal png+
  
-#save file to "data.png+create CATALINA_HOME 
-set output ​"data.png"+RUN mkdir -p "${TOMCATDIR}/​products"; \ 
 +  cd ${TOMCATDIR}/​products;​ \ 
 +  wget -O /​tmp/​tomcat-product.tar.gz ​"https://​archive.apache.org/​dist/​tomcat/​tomcat-10/​v${TOMCATVERSION}/​bin/​apache-tomcat-${TOMCATVERSION}.tar.gz"; \ 
 +  tar -zxf /​tmp/​tomcat-product.tar.gz;​ \ 
 +  rm /​tmp/​tomcat-product.tar.gz
  
-#graph title +create CATALINA_BASE 
-set title "​ab ​-n 50000 -c 5"+COPY ${INSTANCENAME}.tar /​tmp/​${INSTANCENAME}.tar 
 +RUN mkdir -p ${TOMCATDIR}/​instances;​ \ 
 +  cd ${TOMCATDIR}/​instances;​ \ 
 +  tar -xf /​tmp/​${INSTANCENAME}.tar;​ \ 
 +  rm /​tmp/​${INSTANCENAME}.tar
  
-#nicer aspect ratio for image size +create CATALINA_VAR 
-set size 1,0.7+RUN mkdir -p /​var/​tomcat/​${INSTANCENAME};​ \ 
 +  cd /​var/​tomcat/​${INSTANCENAME};​ \ 
 +  mkdir logs temp webapps work
  
-y-axis grid +create webappdir 
-set grid y+RUN mkdir -p /​opt/​webapps/​${INSTANCENAME}/​${APPVERSION}-jee9 
 +COPY $WARFILE /​opt/​webapps/​${INSTANCENAME}/​${APPVERSION}-jee9/​
  
-#x-axis label +create runtime user and change rights 
-set xlabel "​request"​+RUN addgroup $TCGROUP; \ 
 +  adduser ​-h /opt/tomcat -H -G $TCGROUP -s /bin/sh -D $TCUSER; \ 
 +  chown -R $TCUSER:​$TCGROUP /​opt/​tomcat;​ \ 
 +  chown -R $TCUSER:​$TCGROUP /​var/​tomcat;​ \ 
 +  chown -R $TCUSER:​$TCGROUP /​opt/​webapps
  
-#y-axis label +WORKDIR $CATALINA_BASE 
-set ylabel "​response time (ms)"+EXPOSE 8080 8443
  
-#plot data from "​domain.dat"​ using column 9 with smooth sbezier lines +USER $TCUSER 
-#and title of "​something"​ for the given data +CMD ["catalina.sh","run"]
-plot "data.dat" ​using 9 smooth sbezier with lines title "something"+
 </​code>​ </​code>​
  
-  gnuplot <​plot.p +==== 5.einfacher Proxy ====
-  ls -l data.* +
-  -rw-rw-r-- 1 nutzer31 nutzer31 2200170 Sep  3 17:47 data.dat +
-  -rw-rw-r-- 1 nutzer31 nutzer31 ​   3993 Sep  3 17:54 data.png +
- +
-==== APR Connector bereitstellen ==== +
- +
-  sudo aptitude install libapr1-dev +
-  sudo aptitude install libssl-dev +
-  cd apache-tomcat-6.0.33/bin +
-  cp tomcat-native.tar.gz ../.. +
-  cd ../.. +
-  tar xzf tomcat-native.tar.gz +
-  cd tomcat-native-1.1.20-src/​jni/​native +
-  ./configure --with-apr=/​usr/​bin/​apr-1-config --with-java-home=/​usr/​lib/​jvm/​java-6-sun --with-ssl=yes --prefix=/​home/​nutzer01/​workshop/​apache-tomcat-6.0.33 +
-  make +
-  make install +
-  cd ../​../​../​node74 +
- +
-Ubuntu 14.04 +
-  sudo apt-get install libapr1-dev +
-  sudo apt-get install libssl-dev +
-  cd ~/​workshop/​apache-tomcat/​bin +
-  tar xzf tomcat-native.tar.gz +
-  cd tomcat-native-1.1.31-src/​jni/​native +
-  ./configure --with-apr=/​usr/​bin/​apr-1-config --with-java-home=/​usr/​lib/​jvm/​java-1.7.0-openjdk-amd64 --with-ssl=yes --prefix=/​home/​nutzer31/​workshop/​apache-tomcat +
-  make +
-  make install +
-  cd ../​../​../​node73 +
-   +
-   +
-   +
-''​conf/​server.xml''​ +
-<​file>​ +
-  <Server ... +
-     <​Listener className="​org.apache.catalina.core.AprLifecycleListener"​ /> +
-  <Service ... +
- +
-    <​Connector port="​${port.prefix}80"​ executor="​Catalina-Threads"​ +
-               ​protocol="​org.apache.coyote.http11.Http11Protocol"​ /> +
-  +
-    <​Connector port="​${port.prefix}82"​ executor="​Catalina-Threads"​  +
-               ​protocol="​org.apache.coyote.http11.Http11AprProtocol"​ /> +
- +
-    <​Connector port="​${port.prefix}84"​ executor="​Catalina-Threads"​  +
-               ​protocol="​org.apache.coyote.http11.Http11NioProtocol"​ /> +
- +
-  <Engine ... +
-</​file> ​  +
- +
-''​bin/​startup.sh''​ +
-<​file>​ +
-  export CATALINA_HOME=/​home/​nutzer01/​workshop/​apache-tomcat-6.0.33 +
-  export LD_LIBRARY_PATH=${CATALINA_HOME}/​lib +
- +
-</​file>​ +
- +
- +
-=== Bereitstellung vieler File Pointer === +
- +
-''/​etc/​security/​limits.conf''​ anhängen!+
 <​code>​ <​code>​
-... +<​VirtualHost *:80> 
-  ​* soft nofile 1024 +  ​ProxyPass /workshop http://​localhost:​8180/​workshop 
-  ​* hard nofile 20000 +  ​ProxyPassReverse /workshop http://​localhost:​8080/​workshop 
-...+  ProxyPassReverse /workshop http://​localhost:​8180/​workshop 
 +  ProxyPreserveHost On 
 +</​VirtualHost>​
 </​code>​ </​code>​
  
-In der **''​shell''​** nachfolgende Befehle absetzen +==== 5.6 Monitoring ====
-<​code>​ +
-ulimit ​-n 20000 +
-echo 20000 > /​proc/​sys/​fs/​file-max +
-</​code>​+
  
-''/​etc/​sysctl.conf''​ anhängen! 
 <​code>​ <​code>​
-fs.file-max = 20000+   ​ProxyPass /lbmanager ! 
 +   <​Location /​lbmanager>​ 
 +      SetHandler balancer-manager 
 +      AuthType basic 
 +      AuthName "Proxy Balancer"​ 
 +      AuthBasicProvider file 
 +      AuthUserFile htpasswd.intern 
 +      Require user proxyadmin 
 +   </​Location>​
 </​code>​ </​code>​
  
-Es sollte in ''/​etc/​profiles.sh/​ulimit.sh''​ mit folgendem Inhalt erstellt werden: 
-<​code>​ 
-ulimit - n 20000 
-</​code>​ 
- 
-=== Erzeugen eines HTTPS Connetors mit APR/OpenSSL === 
- 
-<​code>​ 
-cd node73/conf 
-openssl genrsa -des3 -out tomcatkey.pem 2048 
-</​code>​ 
-Eingabe des Password "​tomcat"​ (s.u.) 
- 
-<​code>​ 
-openssl req -new -x509 -key tomcatkey.pem -out tomcatcert.pem -days 1095 
-</​code>​ 
- 
-Anlage der Zertifikatsinformationen (Common Name sollte der Name des Rechners sein!) 
-<​code>​ 
-#Eingabe 
-Country Name (2 letter code) [AU]:DE 
-State or Province Name (full name) [Some-State]:​NRW 
-Locality Name (eg, city) []:Bochum 
-Organization Name (eg, company) [Internet Widgits Pty Ltd]:​LinuxHotel 
-Organizational Unit Name (eg, section) []:​noteboo16 
-Common Name (eg, YOUR name) []:​notebook16 
-Email Address []:​pr@objektpark.de 
-</​code>​ 
- 
-''​conf/​server.xml''​ 
-<​file>​ 
-<Server ... 
-  <​Listener className="​org.apache.catalina.core.AprLifecycleListener"​ SSLEngine="​on"​ /> 
- 
-<Service ... 
-<!-- Define a SSL HTTP/1.1 Connector on port xx43 --> 
- 
-<​Connector port="​${port.prefix}43" ​ 
-    executor="​Catalina-Threads" ​ 
-    protocol="​org.apache.coyote.http11.Http11AprProtocol"​ 
-    scheme="​https"​ 
-    secure="​true"​ 
-    sslProtocol="​TLS"​ 
- SSLEnabled="​true"​ 
- SSLCertificateFile="​${catalina.base}/​conf/​tomcatcert.pem"​ 
- SSLCertificateKeyFile="​${catalina.base}/​conf/​tomcatkey.pem"​ 
- SSLPassword="​tomcat"​ 
-     /> 
-</​file>​ 
- 
-Zugang via SSL zum Tomcat mit openssl 
-<​code>​ 
- ​openssl s_client -connect notebook16:​7343 
-</​code>​ 
- * http://​www.madboa.com/​geek/​openssl/​ 
- 
-<​code>​ 
- 
-GET /​hello/​index.jsp HTTP/1.0 
- 
-HTTP/1.1 200 OK 
-Server: Apache-Coyote/​1.1 
-Set-Cookie: JSESSIONID=3035FA551AD683F6939EDFA7A2CCE3D5.node73;​ Path=/​hello/;​ Secure; HttpOnly 
-Content-Type:​ text/​html;​charset=ISO-8859-1 
-Content-Length:​ 18 
-Date: Thu, 13 Sep 2012 10:50:02 GMT 
-Connection: close 
- 
-Hello LinuxHotel! 
-</​code>​ 
- 
-Access https via url 
-<​code>​ 
-curl --insecure https://​192.168.1.218:​7343/​hello/​index.jsp 
-</​code>​ 
- 
-''​last.sh''​ 
-<​file>​ 
-#!/bin/bash 
-K=10;    ​ 
-HTTPSA='​https://​192.168.1.218:​7343/​last/​8k.bin' ​   ​ 
-date +%M-%S-%N>​curlres.txt 
-for (( c=1; c<=$K; c++ )) 
-do 
-    curl --insecure --silent $HTTPSA >/​dev/​null&​ 
-done 
-date +%M-%S-%N>>​curlres.txt 
-</​file>​ 
-===== JSSE SSL ===== 
-<​code>​ 
-keytool -keystore keystore -genkey -alias tomcat -keyalg RSA 
-</​code>​ 
- 
-  - Bitte als Password changeit wählen 
-  - Als CN bzw. "Vor- und Nachname"​ den Name des Server oder die IP angeben. 
-  - Beispieleingabe ​ 
-<​code>​ 
-Neues Kennwort erneut eingeben: ​ 
-Wie lautet Ihr Vor- und Nachname? 
-  [Unknown]: ​ localhost 
-Wie lautet der Name Ihrer organisatorischen Einheit? 
-  [Unknown]: ​ development 
-Wie lautet der Name Ihrer Organisation?​ 
-  [Unknown]: ​ tomcat 
-Wie lautet der Name Ihrer Stadt oder Gemeinde? 
-  [Unknown]: ​ Bochum 
-Wie lautet der Name Ihres Bundeslands?​ 
-  [Unknown]: ​ NRW 
-Wie lautet der Ländercode (zwei Buchstaben) für diese Einheit? 
-  [Unknown]: ​ de 
-Ist CN=localhost,​ OU=development,​ O=tomcat, L=Bochum, ST=NRW, C=de richtig? 
-  [Nein]: ​ j 
-</​code>​ 
-<​code>​ 
-<​Executor name="​Catalina-Threads"​ namePrefix="​Catalina-exec"​ maxThreads="​200"​ minSpareThreads="​50"​ /> 
- 
-<​Connector 
-           ​protocol="​org.apache.coyote.http11.Http11NioProtocol"​ 
-           ​port="​${port.prefix}43"​ 
-           ​connectionTimeout="​120000"​ 
-           ​executor="​Catalina-Threads"​ 
-           ​scheme="​https"​ 
-           ​secure="​true"​ 
-           ​SSLEnabled="​true"​ 
-           ​keystoreFile="​${catalina.base}/​conf/​keystore"​ 
-           ​keystorePass="​changeit"​ 
-           ​clientAuth="​false"​ 
-           ​sslProtocol="​TLS"/>​ 
-</​code>​ 
- 
-Aufruf 
-<​code>​ 
-https://​localhost:​7343/​hello/​index.jsp 
-</​code>​ 
- 
-Selfsign Cert mit eignem Ablaufdatum von 360 Tagen 
-<​code>​ 
-keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048 
-</​code>​ 
- 
-Links 
-  * Tomcat SSL:   ​http://​tomcat.apache.org/​tomcat-7.0-doc/​ssl-howto.html 
-  * Java Keytool: http://​www.sslshopper.com/​article-most-common-java-keytool-keystore-commands.html 
-  * Tutorial: ​    ​http://​www.torsten-horn.de/​techdocs/​ssl.htm 
-  * Beispiel eines Anbieters: https://​ssl-trust.com/​csr-erstellen/​tomcat 
- 
-===== Tomcat Tuning ===== 
-{{:​tomcat:​tomcat.png?​nolink&​600|}} 
- 
-Bild Source 
-{{:​tomcat:​tomcat.xml.zip| Source als Zip}} 
- 
-Thread Pools: 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​config/​executor.html 
- 
-Connectoren 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​connectors.html 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​config/​http.html 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​config/​ajp.html 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​web-socket-howto.html 
-  * http://​tomcat.apache.org/​tomcat-7.0-doc/​aio.html 
-===== Tomcat JSPC ===== 
- 
-Download des Packet TomcatDeployer (apache-tomcat-6.0.35-deployer.tar.gz) 
-  http://​tomcat.apache.org/​download-60.cgi 
- 
-''​apache-tomcat-6.0.35-deployer/​deployer.properties''​ 
-<​file>​ 
-url=http://​localhost:​7480/​manager 
-username=manager 
-password=tomcat 
-webapp=/​home/​nutzer01/​workshop/​node74/​webapps/​ROOT 
-path=/myapp 
-</​file>​ 
- 
-  * ant 
-  * ant deploy 
- 
-Eine neue Anwendung mit vorkompilierten JSP befindet sich in der Instanz node74. 
- 
- 
- 
-===== Monitoring ===== 
- 
-Tomcat Manager API 
- 
-[[http://​tomcat.apache.org/​tomcat-7.0-doc/​manager-howto.html#​Using_the_JMX_Proxy_Servlet||JMX_Proxy_Servlet]] ​ 
- 
-Alle MBeans 
-<​code>​curl --user manager:​tomcat http://​192.168.1.218:​7380/​manager/​jmxproxy?​qry=*:​* 
-</​code>​ 
- 
-Ein Mbean 
-<​code>​curl --user manager:​tomcat http://​192.168.1.218:​7380/​manager/​jmxproxy?​qry=tomcat.jdbc:​* 
-</​code>​ 
-<​code>​ 
-OK - Number of results: 1 
- 
-Name: tomcat.jdbc:​name="​jdbc/​DB",​type=ConnectionPool,​class=org.apache.tomcat.jdbc.pool.DataSource 
-modelerType:​ org.apache.tomcat.jdbc.pool.jmx.ConnectionPool 
-Size: 10 
-Idle: 10 
-Active: 0 
-NumIdle: 10 
-NumActive: 0 
-WaitCount: 0 
-Name: Tomcat Connection Pool[1-219730313] 
-Username: root 
-MaxAge: 0 
-MaxActive: 20 
-Password: Password not available as DataSource/​JMX operation. 
-DefaultTransactionIsolation:​ -1 
-DriverClassName:​ com.mysql.jdbc.Driver 
-MaxIdle: 10 
-MinIdle: 10 
-InitialSize:​ 10 
-MaxWait: 15000 
-TestOnBorrow:​ true 
-TestOnReturn:​ false 
-TestOnConnect:​ false 
-TimeBetweenEvictionRunsMillis:​ 10000 
-NumTestsPerEvictionRun:​ 0 
-MinEvictableIdleTimeMillis:​ 180000 
-TestWhileIdle:​ true 
-Url: jdbc:​mysql://​127.0.0.1/​tomcat?​autoReconnect=true 
-ValidationQuery:​ SELECT 1 
-ValidationInterval:​ 30000 
-AccessToUnderlyingConnectionAllowed:​ true 
-RemoveAbandoned:​ true 
-RemoveAbandonedTimeout:​ 60 
-LogAbandoned:​ false 
-DbProperties:​ {user=root} 
-JdbcInterceptors:​ org.apache.tomcat.jdbc.pool.interceptor.ConnectionState; ​            ​org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;​org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx(threshold=2,​maxQueries=1000) 
-JmxEnabled: true 
-FairQueue: true 
-UseEquals: true 
-AbandonWhenPercentageFull:​ 0 
-UseLock: false 
-SuspectTimeout:​ 0 
-AlternateUsernameAllowed:​ false 
-CommitOnReturn:​ false 
-RollbackOnReturn:​ false 
-UseDisposableConnectionFacade:​ true 
-LogValidationErrors:​ false 
-PropagateInterruptState:​ false 
-PoolName: Tomcat Connection Pool[1-219730313] 
-JdbcInterceptorsAsArray:​ Array[org.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition] of length 4 
- org.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition@46e5dce1 
- org.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition@856140c 
- org.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition@4b3e241a 
- org.apache.tomcat.jdbc.pool.PoolProperties$InterceptorDefinition@5cb44d8d 
-PoolSweeperEnabled:​ true 
-</​code>​ 
- 
-Anfrage an ein Attribute 
-<​code>​curl --user manager:​tomcat '​http://​192.168.1.218:​7380/​manager/​jmxproxy?​get=tomcat.jdbc:​name="​jdbc/​DB",​type=ConnectionPool,​class=org.apache.tomcat.jdbc.pool.DataSource&​att=NumActive'​ 
-</​code>​ 
-Result 
-<​code>​ 
-OK - Attribute get '​tomcat.jdbc:​name="​jdbc/​DB",​type=ConnectionPool,​class=org.apache.tomcat.jdbc.pool.DataSource'​ - NumActive = 0 
-</​code>​ 
- 
-Holte Anzahl der Busy Thread vom HTTP Connector 
-<​code>​ 
-curl -X GET -u manager:​tomcat "​http://​192.168.1.218:​7480/​manager/​jmxproxy?​get=Catalina:​type=ThreadPool,​name=%22http-bio-7480%22&​att=currentThreadsBusy"​ 
-</​code>​ 
-Ausgabe 
-<​code>​ 
-OK - Attribute get '​Catalina:​type=ThreadPool,​name="​http-bio-7480"'​ - currentThreadsBusy = 2 
-</​code>​ 
-==== psi-probe ==== 
-  http://​code.google.com/​p/​psi-probe 
- 
-  * Download und probe.war in die Instanz kopieren 
- 
-Manchmal gibt es Hänger beim Runterfahren von probe 
- 
- 
-Füge diese Startkonfiguration des Quartz Job Scheduler der Probe Anwendung hinzu: 
-''​bin/​setenv.sh''​ 
-<​code>​ 
-export CATALINA_OPTS="​${CATALINA_OPTS} -Dorg.quartz.scheduler.makeSchedulerThreadDaemon=true -Dorg.quartz.scheduler.skipUpdateCheck=true"​ 
-</​code>​ 
- 
-Weitere Parameter 
-http://​quartz-scheduler.org/​documentation/​quartz-1.x/​configuration/​ConfigMain 
- 
-Hat auch nicht geklappt! 
-''​webapps/​probe/​WEB-INF/​classes/​shutdown''​ 
-<​code>​ 
-package shutdown; 
-import javax.servlet.ServletContextListener;​ 
-import javax.servlet.ServletContextEvent;​ 
-import org.springframework.web.context.WebApplicationContext;​ 
-import org.springframework.web.context.ContextLoader;​ 
-import org.quartz.Scheduler;​ 
- 
-public class ShutDownHook implements ServletContextListener { 
- 
-@Override 
-public void contextDestroyed(ServletContextEvent arg0) 
-{ 
-   try { 
-      // Get a reference to the Scheduler and shut it down 
-      WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();​ 
-      Scheduler scheduler = (Scheduler) context.getBean("​scheduler"​);​ 
-      scheduler.shutdown(true);​ 
- 
-      // Sleep for a bit so that we don't get any errors 
-      Thread.sleep(1000);​ 
-   } catch (Exception e) { 
-      e.printStackTrace();​ 
-   } 
-} 
- 
-@Override 
-public void contextInitialized(ServletContextEvent arg0){ 
-} 
- 
-} 
-</​code>​ 
- 
-Compile ShutDownHook.java 
-<​code>​ 
-cd /​workshop/​node73/​webapps/​probe/​WEB-INF/​classes/​shutdown 
-javac -cp ~/​workshop/​apache-tomcat/​lib/​servlet-api.jar:​../​../​lib/​quartz-1.6.0.jar:​../​../​lib/​spring-core-2.5.6.SEC01.jar:​../​../​lib/​spring-web-2.5.6.SEC01.jar:​../​../​lib/​spring-context-2.5.6.SEC01.jar:​../​../​lib/​spring-beans-2.5.6.SEC01.jar ShutDownHook.java ​ 
-</​code>​ 
- 
-''​WEB-INF/​web.xml''​ 
-<​code>​ 
-<web-app ..> 
-       <​display-name>​PSI Probe for Apache Tomcat</​display-name>​ 
-       <​listener>​ 
-           <​listener-class>​shutdown.ShutDownHook</​listener-class>​ 
-       </​listener>​ 
-       ... 
-</​web-app> ​       
-</​code>​ 
-==== javamelody ==== 
-  * Download und javamelody.zip auspacken 
- ​http://​code.google.com/​p/​javamelody/​wiki/​UserGuide 
- 
-Installation in eine Anwendung. 
-<​file>​ 
-cd workshop 
-wget http://​javamelody.googlecode.com/​files/​javamelody-1.29.0.zip 
-mkdir javamelody-1.29.0-src 
-cd javamelody-1.29.0-src 
-unzip ../​javamelody-1.29.0.zip 
-mkdir ../​node74/​webapps/​hello/​WEB-INF/​lib 
-cp javamelody.jar ../​node74/​webapps/​hello/​WEB-INF/​lib 
-cp jrobin-1.5.9.1.jar ../​node74/​webapps/​hello/​WEB-INF/​lib 
-</​file>​ 
- 
-''​../​node74/​webapps/​hello/​WEB-INF/​web.xml''​ 
-<​file>​ 
-        <​filter>​ 
-                <​filter-name>​monitoring</​filter-name>​ 
-                <​filter-class>​net.bull.javamelody.MonitoringFilter</​filter-class>​ 
-                <​init-param>​ 
-                        <​param-name>​storage-directory</​param-name>​ 
-                        <​param-value>​${catalina.base}/​javamelody</​param-value>​ 
-                </​init-param>​ 
- 
-        </​filter>​ 
-        <​filter-mapping>​ 
-                <​filter-name>​monitoring</​filter-name>​ 
-                <​url-pattern>/​*</​url-pattern>​ 
-        </​filter-mapping>​ 
-        <​listener>​ 
-                <​listener-class>​net.bull.javamelody.SessionListener</​listener-class>​ 
-        </​listener>​ 
-        ​ 
-        <​login-config>​ 
-                <​auth-method>​BASIC</​auth-method>​ 
-                <​realm-name>​Monitoring</​realm-name>​ 
-        </​login-config>​ 
-        <​security-role>​ 
-                <​role-name>​monitoring</​role-name>​ 
-        </​security-role>​ 
-        <​security-constraint>​ 
-                <​web-resource-collection>​ 
-                        <​web-resource-name>​Monitoring</​web-resource-name>​ 
-                        <​url-pattern>/​monitoring</​url-pattern>​ 
-                </​web-resource-collection>​ 
-                <​auth-constraint>​ 
-                        <​role-name>​monitoring</​role-name>​ 
-                </​auth-constraint>​ 
-                <!-- if SSL enabled (SSL and certificate must then be configured in the server) 
-                <​user-data-constraint>​ 
-                        <​transport-guarantee>​CONFIDENTIAL</​transport-guarantee>​ 
-                </​user-data-constraint> ​ 
-                --> 
-        </​security-constraint>​ 
- 
-</​file>​ 
-Add User to Realm Database 
-''​conf/​tomcat-users.xml''​ 
-<​file>​ 
-  <role rolename="​monitoring"/>​ 
-  <user username="​monitoring"​ password="​monitoring"​ roles="​monitoring"/>​ 
-</​file>​ 
- 
-evtl. restart des Servers oder Reload der Anwendung.. 
-Zugriff auf die Monitoring-Informationen 
-<​file>​ 
-http://​localhost:​7480/​hello/​monitoring 
-</​file>​ 
- 
-<​b>​Tipp</​b>​ 
-Auf Servlet API 3.0 WebContainer wie der Tomcat 7 oder 8 kann man Java Meldody auf 
-als Plugin in einen bestehende Anwendung einbinden, da die javameldody.jar (>1.48) ein META-INF/​web-fragment.xml enthält. 
- 
-In der eigenen Anwendung wird javamelody aktive wenn es im WEB-INF/lib Verzeichnis ist. 
- 
-Für eine externe Einbindung kann man den ClassLoader der Anwendung einbinden. 
-<​code>​ 
-cd node74 
-mkdir plugin 
-cp XXX/​javamelody.jar plugins 
-cp jrobin-1.5.9.1.jar plugins 
-cd webapps/​hello/​ 
-vi META-INF/​context.xml 
-</​code>​ 
-''​META-INF/​context.xml''​ 
-<​code>​ 
-<​Context>​ 
-<Loader className="​org.apache.catalina.loader.VirtualWebappLoader"​ 
-        virtualClasspath="​${catalina.base}/​plugins/​javamelody.jar;​${catalina.base}/​plugins/​jrobin-1.5.9.1.jar"​ 
-/> 
-</​Context>​ 
-</​code>​ 
- 
-Es ist darauf zu achten, das <​code>​metadata-complete</​code>​ auf <​i>​true</​i>​ steht und bei der Wahl der 
-absoluten Reihenfolgen von Fragments JavaMelody enthalten ist. 
- 
-<​code>​ 
-cd plugins 
-mkdir javamelody 
-cd javamelody 
-jar xf ../​javamelody.jar 
-cd META-INF 
-vi web-fragment.xml 
-cd .. 
-# VORSICHT überschreibt orginal! 
-jar cf ../​javamelody.jar 
-</​code>​ 
- 
-''​web-fragment.xml''​ 
-<​code>​ 
-<​web-fragment xmlns="​http://​java.sun.com/​xml/​ns/​javaee"​ 
-        xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ 
-        xsi:​schemaLocation="​http://​java.sun.com/​xml/​ns/​javaee http://​java.sun.com/​xml/​ns/​javaee/​web-fragment_3_0.xsd"​ 
-        version="​3.0">​ 
-        <​name>​JavaMelody</​name>​ 
-        <​filter>​ 
-                <​filter-name>​javamelody</​filter-name>​ 
-                <​filter-class>​net.bull.javamelody.MonitoringFilter</​filter-class>​ 
-                <​async-supported>​true</​async-supported>​ 
-        </​filter>​ 
-        <​filter-mapping>​ 
-                <​filter-name>​javamelody</​filter-name>​ 
-                <​url-pattern>/​*</​url-pattern>​ 
-        </​filter-mapping>​ 
-        <​listener>​ 
-                <​listener-class>​net.bull.javamelody.SessionListener</​listener-class>​ 
-        </​listener>​ 
-        ​ 
-        <​security-role>​ 
-            <​role-name>​monitoring</​role-name>​ 
-        </​security-role>​ 
-        <​security-constraint>​ 
-                <​web-resource-collection>​ 
-                        <​web-resource-name>​Monitoring</​web-resource-name>​ 
-                        <​url-pattern>/​monitoring</​url-pattern>​ 
-                </​web-resource-collection>​ 
-                <​auth-constraint>​ 
-                        <​role-name>​monitoring</​role-name>​ 
-                </​auth-constraint>​ 
-        </​security-constraint>​ 
- 
-</​web-fragment>​ 
-</​code>​ 
- 
-Explizites einbinden 
-''​webapps/​hello/​WEB-INF/​web.xml''​ 
-<​code>​ 
-<web-app xmlns="​http://​java.sun.com/​xml/​ns/​javaee"​ 
-  xmlns:​xsi="​http://​www.w3.org/​2001/​XMLSchema-instance"​ 
-  xsi:​schemaLocation="​http://​java.sun.com/​xml/​ns/​javaee 
-                      http://​java.sun.com/​xml/​ns/​javaee/​web-app_3_0.xsd"​ 
-  version="​3.0"​ 
-  metadata-complete="​false">​ 
- 
- 
-        <​login-config>​ 
-                <​auth-method>​BASIC</​auth-method>​ 
-                <​realm-name>​Monitoring</​realm-name>​ 
-        </​login-config>​ 
-        <!-- only use JavaMelody --> 
-        <​absolute-ordering>​ 
-           <​name>​JavaMelody</​name> ​ 
-        </​absolute-ordering>​ 
- 
-</​web-app>​ 
-</​code>​ 
- 
-==== Jolokia ==== 
- 
-  http://​www.jolokia.org/​ 
- 
-  * Download und jolokia.war in die Instanz kopieren 
-  * Zugriff mit http und Ausgabe in JSON 
-  * Es existiert eine Perl Adpater der direkt fuer Nagios genutzt werden kann.  ​ 
- 
-==== prometheus ==== 
- 
-http://​prometheus.io/​ 
-https://​github.com/​prometheus/​jmx_exporter 
- 
-download linux 64 bit binary 
- 
-<​code>​ 
-cp jmx4prometheus.json node73/conf 
-cp -r prom node73/​webapps/​prom 
-node73/​bin/​restart.sh 
-./​prometheus -config.file prometheus.conf 
-</​code>​ 
- 
-open localhost:​9090/​graph 
- 
-''​prometheus.conf''​ 
- 
-<​file>​ 
-# Global default settings. 
-global: { 
-  scrape_interval:​ "​15s" ​    # By default, scrape targets every 15 seconds. 
-  evaluation_interval:​ "​15s"​ # By default, evaluate rules every 15 seconds. 
- 
-  # Attach these extra labels to all time series collected by this Prometheus instance. 
-  labels: { 
-    label: { 
-      name: "​monitor"​ 
-      value: "​tutorial-monitor"​ 
-    } 
-  } 
-} 
- 
-# A job definition containing exactly one endpoint to scrape: Prometheus itself. 
-job: { 
-  # The job name is added as a label `job={job-name}` to any time series scraped from this job. 
-  name: "​prometheus"​ 
-  # Override the global default and scrape targets from this job every 5 seconds. 
-  scrape_interval:​ "​5s"​ 
- 
-  # Let's define a group of static targets to scrape for this job. In this 
-  # case, only one. 
-  target_group:​ { 
-    # These endpoints are scraped via HTTP. 
-    target: "​http://​localhost:​9090/​metrics"​ 
-  } 
-} 
- 
-job: { 
-  name: "​prom4jmx"​ 
-  scrape_interval:​ "​15s"​ 
-  target_group:​ { 
-      labels: { 
-        label: { 
-            name: "​zone"​ 
-            value: "​de-berlin-1"​ 
-        } 
-        label: { 
-            name: "​env"​ 
-            value: "​dev"​ 
-        } 
-    } 
-    target: "​http://​127.0.0.1:​7380/​prom/​metrics"​ 
-  } 
-} 
-</​file>​ 
- 
- 
-jmx4prometheus.conf 
-<​file>​ 
-{ 
-  "​lowercaseOutputName":​ true, 
-  "​lowercaseOutputLabelNames":​ true, 
-  "​rules":​ [ 
-    { 
-      "​pattern":​ "​Catalina<​type=GlobalRequestProcessor,​ name=\"​(\w+-\w+)-(\d+)\"><>​(\w+):",​ 
-      "​name":​ "​tomcat_$3_total",​ 
-      "​labels":​ { 
-        "​protocol":"​$1",​ 
-        "​port":"​$2"​ }, 
-      "​help":​ "​Tomcat global $3", 
-      "​type":​ "​COUNTER",​ 
-    }, 
-    { 
-      "​pattern":​ "​Catalina<​j2eeType=Servlet,​ WebModule=//​([-a-zA-Z0-9+&​@#/​%?​=~_|!:​.,;​]*[-a-zA-Z0-9+&​@#/​%=~_|]),​ name=([-a-zA-Z0-9+/​$%~_-|!.]*),​ J2EEApplication=none,​ J2EEServer=none><>​(requestCount|maxTime|processingTime|errorCount):",​ 
-      "​name":​ "​tomcat_servlet_$3_total",​ 
-      "​labels":​ { 
-        "​module":"​$1",​ 
-        "​servlet":"​$2"​ }, 
-      "​help":​ "​Tomcat servlet $3 total",​ 
-      "​type":​ "​COUNTER",​ 
-    }, 
-    { 
-      "​pattern":​ "​Catalina<​type=ThreadPool,​ name=\"​(\w+-\w+)-(\d+)\"><>​(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount):",​ 
-      "​name":​ "​tomcat_threadpool_$3",​ 
-      "​labels":​ { 
-        "​protocol":"​$1",​ 
-        "​port":"​$2"​ }, 
-      "​help":​ "​Tomcat threadpool $3", 
-      "​type":​ "​GAUGE",​ 
-    }, 
-    { 
-      "​pattern":​ "​Catalina<​type=Manager,​ host=([-a-zA-Z0-9+&​@#/​%?​=~_|!:​.,;​]*[-a-zA-Z0-9+&​@#/​%=~_|]),​ context=([-a-zA-Z0-9+/​$%~_-|!.]*)><>​(processingTime|sessionCounter|rejectedSessions|expiredSessions):",​ 
-      "​name":​ "​tomcat_session_$3_total",​ 
-      "​labels":​ { 
-        "​host":"​$1",​ 
-        "​context":"​$2"​ }, 
-      "​help":​ "​Tomcat session $3 total",​ 
-      "​type":​ "​COUNTER",​ 
-    }, 
-  ] 
-} 
-</​file>​ 
- 
-===== DB Zugriff im Tomcat ===== 
- 
-Installation der Mysql 
- 
-  sudo aptitude install mysql-server 
-  mysql -u root -p 
-  create database tomcat ; 
-  use tomcat ; 
-  create table nutzer( firstname varchar(80),​ lastname varchar(80));​ 
-  insert into nutzer values ("​Nutzer01",​ "​linuxhotel"​ ); 
-  quit 
- 
-Im Dialog ein Password setzen. (tomcat) 
- 
-Laden des MYSQL Treibers 
-  http://​www.mysql.com/​downloads/​connector/​j/​ 
- 
-  evtl. scp mysql-connector-java-5.1.17.zip nutzer24@notebook24:/​home/​nutzer24/​workshop 
- 
-  * Kopieren des Treibers nach workshop/​node74/​lib 
- 
-  unzip mysql-connector-java-5.1.17.zip 
-  cd mysql-connector-java-5.1.17 
-  mkdir -p ../​node74/​lib 
-  cp mysql-connector-java-5.1.17-bin.jar ../​node74/​lib 
-  ​ 
-Definition einer DB-Ressource im Tomcat 
- 
-''​node74/​conf/​server.xml''​ 
-<​file>​ 
-<​GlobaleNamingResources>​ 
-... 
-  <​Resource name="​jdbc/​DB"​ auth="​Container"​ 
-          type="​javax.sql.DataSource"​ 
-          driverClassName="​com.mysql.jdbc.Driver"​ 
-          url="​jdbc:​mysql://​127.0.0.1/​tomcat"​ 
-          username="​root"​ 
-          password="​tomcat"​ 
-          maxActive="​20"​ 
-          maxIdle="​10"​ 
-          maxWait="​15000"​ 
-   removeAbandoned="​true"​ 
-          validationQuery="​SELECT 1" 
-          testOnBorrow="​true"​ 
-          testWhileIdle="​true"​ 
-          timeBetweenEvictionRunsMillis="​10000"​ 
-          minEvictableIdleTimeMillis="​180000"​ 
-          /> 
-... 
-</​GlobalNamingResources>​ 
-</​file>​ 
- 
-Anlage einer Anwendung die die Ressource nutzt 
- 
-  cd node74/​webapps 
-  mkdir nutzer 
-  mkdir nutzer/​META-INF/​ 
-  mkdir nutzer/​WEB-INF 
-  cd nutzer 
-  ​ 
-''​META-INF/​context.xml''​ 
-<​file>​ 
-<​Context>​ 
-   <​ResourceLink name="​jdbc/​DB"​ global="​jdbc/​DB"​ type="​javax.sql.Datasource"​ /> 
-</​Context>​ 
-</​file>​ 
- 
-''​WEB-INF/​web.xml''​ 
-<​file>​ 
-<​web-app>​ 
-   <​resource-ref>​ 
-  <​description>​JDBC DB</​description>​ 
-        <​res-ref-name>​jdbc/​DB</​res-ref-name>​ 
-        <​res-type>​javax.sql.DataSource</​res-type>​ 
-        <​res-auth>​Container</​res-auth>​ 
-     </​resource-ref>​ 
-</​web-app>​ 
-</​file>​ 
- 
-''​index.jsp''​ 
-<​file>​ 
-<%@ page import="​javax.sql.*,​javax.naming.*,​java.sql.*"​ session="​false"​ %> 
-<% 
-InitialContext initCtx = new InitialContext() ; 
-Context envCtx = (Context)initCtx.lookup("​java:​comp/​env/"​);​ 
-DataSource datasource = 
-     ​(DataSource) envCtx.lookup("​jdbc/​DB"​ ) ; 
-Connection con = null; 
-Statement stmt = null ; 
-ResultSet srs = null; 
- 
-try { 
-  con = datasource.getConnection();​ 
-  stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,​ 
-                                     ​ResultSet.CONCUR_READ_ONLY);​ 
-  srs = stmt.executeQuery( 
-    "​SELECT firstname, lastname FROM nutzer"​);​ 
-  while (srs.next()) { 
-        String firstName = srs.getString("​firstname"​);​ 
-        String lastName = srs.getString("​lastname"​);​ 
-        out.println(firstName + " ​    "​ + lastName); 
-  } 
-} finally { 
-  if(srs != null) srs.close();​ 
-  if(stmt != null) stmt.close();​ 
-  if(con != null) con.close();​ 
-} 
-%> 
-</​file>​ 
- 
-Test der Anwendung 
-  node74/​bin/​shutdown.sh 
-  cp apache-tomcat-6.0.32/​conf/​catalina.properties node74/conf 
-  node74/​bin/​startup.sh 
-  http://​localhost:​7480/​nutzer/​index.jsp 
- 
-''​webapps/​nutzer/​insert.jsp''​ 
-<​file>​ 
-<%@ page import="​javax.sql.*,​javax.naming.*,​java.sql.*"​ session="​false"​ %> 
-<​html>​ 
-<​body>​ 
-<​h1>​Nutzer anlegen</​h1>​ 
-<% 
-InitialContext initCtx = new InitialContext() ; 
-Context envCtx = (Context)initCtx.lookup("​java:​comp/​env/"​);​ 
-DataSource datasource = 
-     ​(DataSource) envCtx.lookup("​jdbc/​DB"​ ) ; 
-Connection con = null; 
-Statement stmt = null ; 
- 
-try { 
-  con = datasource.getConnection();​ 
-  stmt = con.createStatement();​ 
-  for(int i = 0; i < 100; i++)  
-  { 
-        String name = "​nutzer-"​ + i ; 
-  stmt.executeUpdate( 
-    "​insert into nutzer values('"​ + name + "',​ '​linuxhotel"​+ i + "'​)"​);​ 
-        out.println("​New user: " + name + "</​br>"​);​ 
-  } 
-} finally { 
-  if(stmt != null) stmt.close();​ 
-  if(con != null) con.close();​ 
-} 
-%> 
-</​body>​ 
-</​html>​ 
-</​file>​ 
- 
-restart mysql 
-<​code>​ 
-sudo /​etc/​init.d/​mysql stop 
-sudo /​etc/​init.d/​mysql start 
-</​code>​ 
- 
-  * [[http://​www.stardeveloper.com/​articles/​display.html?​article=2001072401&​page=1|Fehlerbehandlung in JSP Seite]] 
-  * [[http://​tomcat.apache.org/​tomcat-7.0-doc/​jdbc-pool.html|Alternative Tomcat 7 JDBC Pool Impl]] 
-  * [[http://​dev.mysql.com/​doc/​refman/​5.1/​en/​connector-j-reference-configuration-properties.html|MYSQL JDBC Treiber Konfiguration]] 
- 
-Parameter für Profile und Slow Query Detection ​ 
-<​code>​ 
-    <​Resource name="​jdbc/​DB"​ auth="​Container"​ 
-          type="​javax.sql.DataSource"​ 
-          driverClassName="​com.mysql.jdbc.Driver"​ 
-          url="​jdbc:​mysql://​127.0.0.1/​tomcat?​autoReconnect=true&​amp;​profileSQL=true&​amp;​logSlowQueries=true&​amp;​slowQueryThresholdMillis=2"​ 
-          username="​root"​ 
-          password="​tomcat"​ 
-          maxActive="​20"​ 
-          maxIdle="​10"​ 
-          maxWait="​15000"​ 
-   removeAbandoned="​true"​ 
-          validationQuery="​SELECT 1" 
-          testOnBorrow="​true"​ 
-          testWhileIdle="​true"​ 
-          timeBetweenEvictionRunsMillis="​10000"​ 
-          minEvictableIdleTimeMillis="​180000"​ 
-          /> 
-</​code>​ 
- 
-Result 
-<​code>​ 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 0 ms, connection-id:​ 2585, statement-id:​ 20540, resultset-id:​ 20776, message: SELECT firstname, lastname FROM nutzer 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [FETCH] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 1 ms, connection-id:​ 2585, statement-id:​ 20540, resultset-id:​ 20776 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 1 ms, connection-id:​ 2585, statement-id:​ 20541, resultset-id:​ 20777, message: SELECT 1 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [FETCH] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 0 ms, connection-id:​ 2585, statement-id:​ 20541, resultset-id:​ 20777 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [SLOW QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 5 ms, connection-id:​ 2585, statement-id:​ 20542, resultset-id:​ 20778, message: The following query was executed using no index, use '​EXPLAIN'​ for more details: SELECT firstname, lastname FROM nutzer 
-Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:​208) duration: 5 ms, connection-id:​ 2585, statement-id:​ 20542, resultset-id:​ 20778, message: SELECT firstname, lastname FROM nutzer 
-</​code>​ 
-<​code>​ 
-Download des Treibers von Maven Repo Tomcat > 7.0.19 tomcat-jdbc.jar 
-Kopieren in die Tomcat Installation node73/lib 
-Anpassen der Resource Definition durch hinzufügen von factory und jmxEnabled 
-Restart des Tomcats 
-</​code>​ 
- 
-''​conf/​server.xml''​ 
-<​file>​ 
-    <​Resource name="​jdbc/​DB"​ auth="​Container"​ 
-          factory="​org.apache.tomcat.jdbc.pool.DataSourceFactory"​ 
-          type="​javax.sql.DataSource"​ 
-          driverClassName="​com.mysql.jdbc.Driver"​ 
-          url="​jdbc:​mysql://​127.0.0.1/​tomcat?​autoReconnect=true"​ 
-          username="​root" ​         
-          password="​tomcat"​ 
-          maxActive="​20"​ 
-          maxIdle="​10"​ 
-          maxWait="​15000"​ 
-          removeAbandoned="​true"​ 
-          validationQuery="​SELECT 1" 
-          testOnBorrow="​true"​ 
-          testWhileIdle="​true"​ 
-          timeBetweenEvictionRunsMillis="​10000"​ 
-          minEvictableIdleTimeMillis="​180000"​ 
-          jmxEnabled="​true"​ 
-        jdbcInterceptors="​org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;​org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;​org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx(threshold=2,​maxQueries=1000)"​ 
-          /> 
- 
-</​file>​ 
-===== Cluster Replikaton ===== 
- 
-In zwei Instanzen muss die Konfiguration geändert werden. 
-Beide Instanzen müssen dann in einem Abstand von 30 Sekunden gestartet werden. 
-Jeder Teilnehmer sollte ein exklusiven Port in sein Startskript schreiben 
-das in den vier Instanzen node84,​node85,​node94 und node95 gleich ist. 
- 
-  node84/​bin/​startup.sh 
-  node94/​bin/​startup.sh 
- 
-  export CATALINA_OPTS="​${CATALINA_OPTS} -Dcluster.prefix=416"​ 
- 
-  node85/​bin/​startup.sh 
-  node95/​bin/​startup.sh 
- 
-  export CATALINA_OPTS="​${CATALINA_OPTS} -Dcluster.prefix=417"​ 
- 
-''​conf/​server.xml''​ 
-Einfache Konfiguration 
-<​file>​ 
-<Engine ... 
- 
-<Cluster className="​org.apache.catalina.ha.tcp.SimpleTcpCluster" ​ channelSendOptions="​8"​ > 
-          <Channel className="​org.apache.catalina.tribes.group.GroupChannel">​ 
-              <​Membership className="​org.apache.catalina.tribes.membership.McastService"​ 
-                   ​port="​${cluster.prefix}00"​ 
-                   /> 
-              <​Receiver address="​127.0.0.1"​ 
-                className="​org.apache.catalina.tribes.transport.nio.NioReceiver"​ 
-                maxThreads="​6"​ port="​${cluster.prefix}${port.prefix}"​ selectorTimeout="​5000"​ /> 
-         </​Channel>​ 
-      </​Cluster>​ 
-</​file>​ 
- 
- 
-<​file>​ 
-<​Engine>​ 
-... 
-<Cluster className="​org.apache.catalina.ha.tcp.SimpleTcpCluster"​ 
-   ​channelSendOptions="​8"> ​ 
-   <​Channel className="​org.apache.catalina.tribes.group.GroupChannel"​ > 
-        <​Membership className="​org.apache.catalina.tribes.membership.McastService"​ 
-            address="​228.0.0.4"​ 
-            port="​${cluster.prefix}00"​ 
-            frequency="​500"​ 
-            dropTime="​3000"/> ​ 
-   </​Channel>​ 
-</​Cluster>​ 
- 
-</​Engine>​ 
-</​file>​ 
- 
-''/​etc/​apache2/​mods-available/​jk.conf''​ 
-<​file>​ 
-JKWorkerProperty worker.list=loadbalancer,​jkstatus 
- 
-JKWorkerProperty worker.node84.port=8409 
-JKWorkerProperty worker.node84.host=localhost 
-JKWorkerProperty worker.node84.type=ajp13 
-JkWorkerProperty worker.node84.secret=tomcat 
-JkWorkerProperty worker.node84.domain=cl24 
- 
-JKWorkerProperty worker.node85.port=8509 
-JKWorkerProperty worker.node85.host=localhost 
-JKWorkerProperty worker.node85.type=ajp13 
-JkWorkerProperty worker.node85.secret=tomcat 
-JkWorkerProperty worker.node85.domain=cl25 
- 
-JKWorkerProperty worker.node94.port=9409 
-JKWorkerProperty worker.node94.host=localhost 
-JKWorkerProperty worker.node94.type=ajp13 
-JkWorkerProperty worker.node94.secret=tomcat 
-JkWorkerProperty worker.node94.domain=cl24 
- 
-JKWorkerProperty worker.node95.port=9509 
-JKWorkerProperty worker.node95.host=localhost 
-JKWorkerProperty worker.node95.type=ajp13 
-JkWorkerProperty worker.node95.secret=tomcat 
-JkWorkerProperty worker.node95.domain=cl25 
- 
-JKWorkerProperty worker.loadbalancer.type=lb 
-JKWorkerProperty worker.loadbalancer.balance_workers=node84,​node85,​node94,​node95 
- 
-JKWorkerProperty worker.jkstatus.type=status 
-</​file>​ 
- 
-''​nodeXX/​conf/​server.xml''​ 
-<​file>​ 
-... 
-     <​Connector port="​${port.prefix}09"​ 
-          executor="​Catalina-Threads"​ 
-          protocol="​org.apache.coyote.ajp.AjpProtocol"​ 
-          requiredSecret="​tomcat"​ /> 
-... 
-</​file>​ 
-''/​etc/​apache2/​sites-available/​default''​ 
-<​file>​ 
-JkMount /​ClusterTest* loadbalancer 
-</​file>​ 
- 
-<​file>​ 
-sudo apache2clt restart 
-cd workshop/​cluster 
-node84/​bin/​shutdown.sh -force 
-node94/​bin/​shutdown.sh -force 
-node85/​bin/​shutdown.sh -force 
-node95/​bin/​shutdown.sh -force 
-</​file>​ 
- 
-<​file>​ 
-wget http://​192.168.1.189:​2211/​cluster/​ClusterTest.war 
-cp ClusterTest.war node84/​webapps 
-cp ClusterTest.war node94/​webapps 
-cp ClusterTest.war node85/​webapps 
-cp ClusterTest.war node95/​webapps 
-</​file>​ 
- 
-Deployment der ClusterTest.war von der CD. 
-Durchstarten der beiden Instanzen hintereinander mit einer kleinen Wartezeit 10sec - 1Min. 
- 
-<​file>​ 
-node84/​bin/​startup.sh 
-node94/​bin/​startup.sh 
-node85/​bin/​startup.sh 
-node95/​bin/​startup.sh 
-</​file>​ 
- 
-''​conf/​server.xml''​ 
-<​file>​ 
-<?xml version='​1.0'​ encoding='​utf-8'?>​ 
-<Server port="​${port.prefix}05"​ shutdown="​SHUTDOWN">​ 
-  <​Listener className="​org.apache.catalina.core.AprLifecycleListener" ​ SSLEngine="​on"/>​ 
-  <​Listener className="​org.apache.catalina.core.JasperListener"​ /> 
-  <​Listener className="​org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"​ /> 
-  <​Listener className="​org.apache.catalina.core.JreMemoryLeakPreventionListener"​ /> 
- 
-  <​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" ​ 
-              readonly="​false"​ /> 
-    <​Resource name="​jdbc/​DB"​ auth="​Container"​ 
-          factory="​org.apache.tomcat.jdbc.pool.DataSourceFactory"​ 
-          type="​javax.sql.DataSource"​ 
-          driverClassName="​com.mysql.jdbc.Driver"​ 
-          url="​jdbc:​mysql://​127.0.0.1/​tomcat?​autoReconnect=true"​ 
-          username="​root"​ 
-          password="​tomcat"​ 
-          maxActive="​100"​ 
-          maxIdle="​10"​ 
-          maxWait="​15000"​ 
-   removeAbandoned="​true"​ 
-          validationQuery="​SELECT 1" 
-          testOnBorrow="​true"​ 
-          testWhileIdle="​true"​ 
-          timeBetweenEvictionRunsMillis="​10000"​ 
-          minEvictableIdleTimeMillis="​180000"​ 
-          jmxEnabled="​true"​ 
-          jdbcInterceptors="​org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;​ 
-            org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer;​org.apache.tomcat.jdbc.pool.interceptor.SlowQueryReportJmx(threshold=2,​maxQueries=1000)"​ 
-          /> 
-<!-- 
-    <​Resource name="​jdbc/​DB"​ auth="​Container"​ 
-          type="​javax.sql.DataSource"​ 
-          driverClassName="​com.mysql.jdbc.Driver"​ 
-          url="​jdbc:​mysql://​127.0.0.1/​tomcat?​autoReconnect=true&​amp;​profileSQL=true&​amp;​logSlowQueries=true&​amp;​slowQueryThresholdMillis=2"​ 
-          username="​root"​ 
-          password="​tomcat"​ 
-          maxActive="​20"​ 
-          maxIdle="​10"​ 
-          maxWait="​15000"​ 
-   removeAbandoned="​true"​ 
-          validationQuery="​SELECT 1" 
-          testOnBorrow="​true"​ 
-          testWhileIdle="​true"​ 
-          timeBetweenEvictionRunsMillis="​10000"​ 
-          minEvictableIdleTimeMillis="​180000"​ 
-          /> 
---> 
-  </​GlobalNamingResources>​ 
-    
-  <Service name="​Catalina">​ 
-     <​Executor name="​Catalina-Threads"​ namePrefix="​Catalina-exec"​ maxThreads="​200"​ minSpareThreads="​50"​ /> 
-     <​Connector port="​${port.prefix}70"​ executor="​Catalina-Threads"​ protocol="​org.apache.coyote.http11.Http11AprProtocol"​ /> 
-     <​Connector port="​${port.prefix}80"​ executor="​Catalina-Threads"​ protocol="​org.apache.coyote.http11.Http11Protocol"​ /> 
-     <​Connector port="​${port.prefix}90"​ executor="​Catalina-Threads"​ protocol="​org.apache.coyote.http11.Http11NioProtocol"​ /> 
-     <​Connector port="​${port.prefix}09"​ executor="​Catalina-Threads"​ protocol="​org.apache.coyote.ajp.AjpProtocol"​ /> 
- 
-     <​Connector port="​${port.prefix}43" ​ 
-    executor="​Catalina-Threads" ​ 
-    protocol="​org.apache.coyote.http11.Http11AprProtocol"​ 
-    scheme="​https"​ 
-    secure="​true"​ 
-    sslProtocol="​TLS"​ 
- SSLEnabled="​true"​ 
- SSLCertificateFile="​${catalina.base}/​conf/​tomcatcert.pem"​ 
- SSLCertificateKeyFile="​${catalina.base}/​conf/​tomcatkey.pem"​ 
- SSLPassword="​tomcat"​ 
-     /> 
-    <Engine name="​Catalina"​ defaultHost="​localhost"​ jvmRoute="​node${port.prefix}">​ 
-      <Realm className="​org.apache.catalina.realm.UserDatabaseRealm"​ 
-             ​resourceName="​UserDatabase"/>​ 
-      <Valve className="​org.apache.catalina.valves.AccessLogValve" ​ 
-             ​directory="​logs"  ​ 
-             ​prefix="​access-" ​ 
-             ​suffix="​.log" ​ 
-             ​pattern="​%h %l &​quot;​%u&​quot;​ &​quot;​%{begin:​yyyy-MM-dd hh:​mm:​ss.SSSZ}t&​quot;​ %{msec}t &​quot;​%r&​quot;​ %s %b %D %S" ​ 
-             ​resolveHosts="​false"​ 
-      /> 
-      <Cluster className="​org.apache.catalina.ha.tcp.SimpleTcpCluster" ​ channelSendOptions="​8"​ > 
-          <Channel className="​org.apache.catalina.tribes.group.GroupChannel">​ 
-              <​Membership className="​org.apache.catalina.tribes.membership.McastService"​ 
-                   ​port="​${cluster.prefix}00"​ 
-                   /> 
-              <​Receiver address="​127.0.0.1"​ 
-                className="​org.apache.catalina.tribes.transport.nio.NioReceiver"​ 
-                maxThreads="​6"​ port="​${cluster.prefix}${port.prefix}"​ selectorTimeout="​5000"​ /> 
-         </​Channel>​ 
-      </​Cluster>​ 
-      <Host name="​localhost" ​ appBase="​webapps"​ 
-            unpackWARs="​true"​ autoDeploy="​true"​ > 
-      </​Host>​ 
-    </​Engine>​ 
-  </​Service>​ 
-</​Server>​ 
-</​file>​ 
-==== Static Member ==== 
-<​file>​ 
-<Cluster channelSendOptions="​8"​ channelStartOptions="​3"​ className="​org.apache.catalina.ha.tcp.SimpleTcpCluster">​ 
-   <​Manager className="​org.apache.catalina.ha.session.DeltaManager" ​ 
-            expireSessionsOnShutdown="​false"​ domainReplication="​true"​ 
-            notifyListenersOnReplication="​true"​ /> 
-   <​Channel className="​org.apache.catalina.tribes.group.GroupChannel">​ 
- 
-       <​Membership className="​org.apache.catalina.tribes.membership.McastService"​ 
-                   ​port="​${cluster.prefix}00"​ 
-                   ​domain="​test-domain"/>​ 
- 
-       <​Sender className="​org.apache.catalina.tribes.transport.ReplicationTransmitter">​ 
-           <​Transport className="​org.apache.catalina.tribes.transport.nio.PooledParallelSender"​ /> 
-       </​Sender>​ 
-       <​Receiver address="​127.0.0.1"​ 
-          className="​org.apache.catalina.tribes.transport.nio.NioReceiver"​ 
-          maxThreads="​6"​ port="​${cluster.prefix}${port.prefix}"​ selectorTimeout="​5000"​ /> 
-       <​Interceptor className="​interceptors.DisableMulticastInterceptor"​ /> 
-       <​Interceptor className="​org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"​ /> 
-       <​Interceptor className="​org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">​ 
-          <Member className="​org.apache.catalina.tribes.membership.StaticMember"​ 
-             ​port="​${cluster.prefix}74"​ 
-             ​host="​127.0.0.1"​ 
-             ​domain="​test-domain"​ 
-             ​uniqueId="​{0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0,​0}"​ /> 
-       </​Interceptor>​ 
-       <​Interceptor className="​org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"​ /> 
-     </​Channel>​ 
-     <​Valve className="​org.apache.catalina.ha.tcp.ReplicationValve" ​     
-            filter="​.*\.gif;​.*\.js;​.*\.jpg;​.*\.png;​.*\.htm;​.*\.html;​.*\.css;​.*\.txt;"​ /> 
-     <​ClusterListener className="​org.apache.catalina.ha.session.ClusterSessionListener"​ /> 
-</​Cluster>​ 
- 
-</​file>​ 
- 
-<​file>​ 
-package interceptors;​ 
- 
-import org.apache.catalina.tribes.group.ChannelInterceptorBase;​ 
-import org.apache.catalina.tribes.ChannelException;​ 
-import org.apache.catalina.tribes.Channel;​ 
- 
-public class DisableMulticastInterceptor extends ChannelInterceptorBase {  
-     ​@Override 
-     ​public void start(int svc) throws ChannelException { 
-        svc = (svc & (~Channel.MBR_TX_SEQ));​ super.start(svc); ​ 
-     } 
-} 
-</​file>​ 
- 
-===== Sicherheit ===== 
-  * BSI Studie https://​www.bsi.bund.de/​DE/​Publikationen/​Studien/​tomcat/​index_htm.html 
-  * Migrationsguide http://​tomcat.apache.org/​migration.html 
-  * Security Report http://​tomcat.apache.org/​security.html 
-  * Security Manager und Tomcat http://​www.objektpark.org/​pdf/​04_04_tomcat_JM.pdf 
-  * Tipps von Mulesoft https://​www.mulesoft.com/​tcat/​tomcat-security 
- 
-Lösche Tomcat Version Numer in Fehlerreports des Tomcats 
-<​code>​ 
-cd node74 
-mkdir -p lib/​org/​apache/​catalina/​util 
-vi lib/​org/​apache/​catalina/​util/​ServerInfo.properties 
-bin/​restart.sh 
-</​code>​ 
-''​lib/​org/​apache/​catalina/​util/​ServerInfo.properties''​ 
 <​code>​ <​code>​
-server.info=Apache Tomcat +  LogFormat "%h %l %u %t \"​%r\"​ %>s %b %{BALANCER_ROUTE_CHANGED}e %{BALANCER_WORKER_ROUTE}e %{BALANCER_SESSION_ROUTE}e %D" proxyextended 
-server.number= +  ​CustomLog "​logs/​proxy_access_log"​ proxyextended
-server.built=Mar 7 2014 02:18:35+
 </​code>​ </​code>​
  
tomcat_administration/start.1439895317.txt.gz · Zuletzt geändert: 2015/08/19 08:01 (Externe Bearbeitung)