Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
tomcat_administration:start [2015/08/19 15:36] peter_rossbach1 [prometheus] |
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.2 - 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/conf$ pwd | + | |
- | + | ||
- | </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.4 - 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=""http-bio-7380""> | ||
- | <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=""ajp-bio-7309""> | ||
- | <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> | ||
- | |||
- | |||
- | http://docs.oracle.com/javase/7/docs/technotes/guides/management/agent.html | ||
- | |||
- | ===== 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 "%u" %t "%r" %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 "%{begin:yyyy-MM-dd'T'HH:mm:ss:SSSZ}t" %{begin:msec}t "%r" "%{Referer}i" "%{User-Agent}i" %s %b "%I" %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 " 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 "%{begin:yyyy-MM-dd'T'HH:mm:ss:SSSZ}t" %{begin:msec}t "%r" "%{Referer}i" "%{User-Agent}i" %s %b "%I" %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 5 ===== |
- | 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.3 - 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 | + | |
- | + | ||
- | Ubuntu 14.04 (java 8 und tomcat 8) | + | |
- | 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.33-src/jni/native | + | |
- | ./configure --with-apr=/usr/bin/apr-1-config --with-java-home=/usr/lib/jvm/java-8-oracle/ --with-ssl=yes --prefix=/home/nutzer07/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 | ||
- | https://github.com/javamelody/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> | ||
- | |||
- | More | ||
- | * https://github.com/davidB/metrics-influxdb | ||
- | * https://github.com/jmxtrans/jmxtrans/wiki | ||
- | * http://grafana.org/ | ||
- | * https://influxdb.com/ | ||
- | ===== 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&profileSQL=true&logSlowQueries=true&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&profileSQL=true&logSlowQueries=true&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 "%u" "%{begin:yyyy-MM-dd hh:mm:ss.SSSZ}t" %{msec}t "%r" %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> | ||