tomcat_administration:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| tomcat_administration:start [2016/11/21 07:57] – [Tomcat] marco.staub | tomcat_administration:start [2024/04/11 06:55] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== Tomcat ====== | + | ====== Tomcat |
| ===== Tag 1 ===== | ===== Tag 1 ===== | ||
| - | ===== Pre Installation ===== | + | ==== 1.2 - tomcat.sh ==== |
| - | + | ||
| - | + | ||
| - | sudo add-apt-repository "deb http:// | + | |
| - | sudo apt-get update | + | |
| - | sudo apt-get install tree | + | |
| - | sudo apt-get install curl | + | |
| - | + | ||
| - | ===== Java Installation ===== | + | |
| - | ==== Pakete ==== | + | |
| - | Ubuntu 8.04, Debian Lenny: | + | |
| - | sun-java6-jdk | + | |
| - | + | ||
| - | Ubuntu 10.04: | + | |
| - | openjdk-6-jdk | + | |
| - | \\ | + | |
| - | \\ | + | |
| - | Aufgrund der geänderten Oracle Lizenzbestimmungen, | + | |
| - | Java Packete aus den Standard-Repositories entfernt. non-free wird | + | |
| - | für die bequeme Installation benötigt, / | + | |
| - | + | ||
| - | Debian 6 Squeeze: | + | |
| - | deb http:// | + | |
| - | deb-src http:// | + | |
| - | + | ||
| - | deb http:// | + | |
| - | deb-src http:// | + | |
| - | + | ||
| - | # squeeze-updates, | + | |
| - | deb http:// | + | |
| - | deb-src http:// | + | |
| - | + | ||
| - | + | ||
| - | Mint 13: | + | |
| - | deb http:// | + | |
| - | ===== Java Konfiguration ===== | + | |
| - | Debian / Ubuntu: | + | |
| - | update-alternatives --config java | + | |
| - | '' | + | |
| - | + | ||
| - | ===== Oracle Java 7 Installation ===== | + | |
| - | java -version | + | |
| - | sudo apt-get purge openjdk* | + | |
| - | sudo add-apt-repository ppa: | + | |
| - | sudo apt-get update | + | |
| - | sudo apt-get install oracle-java7-installer | + | |
| - | java -version | + | |
| - | + | ||
| - | ===== Alternative Oracle Java 7 Installation ===== | + | |
| - | + | ||
| - | sudo mkdir -p / | + | |
| - | cd ~/ | + | |
| - | sudo cp jdk-7u21-linux-i586.tar.gz / | + | |
| - | cd / | + | |
| - | sudo tar zxvf jdk-7u21-linux-i586.tar.gz | + | |
| - | sudo rm jdk-7u21-linux-i586.tar.gz | + | |
| - | ls -l | + | |
| - | # | + | |
| - | sudo update-alternatives --install "/ | + | |
| - | sudo update-alternatives --install "/ | + | |
| - | sudo update-alternatives --set " | + | |
| - | sudo update-alternatives --set " | + | |
| - | + | ||
| - | sudo nano / | + | |
| - | ''/ | + | |
| - | <code bash> | + | |
| - | JAVA_HOME=/ | + | |
| - | PATH=$PATH: | + | |
| - | export JAVA_HOME | + | |
| - | export PATH | + | |
| - | </ | + | |
| - | . / | + | |
| - | 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 | + | |
| - | + | ||
| - | ===== Alternative Oracle Java 8 Installation ===== | + | |
| - | + | ||
| < | < | ||
| - | echo "deb http:// | + | #!/bin/sh |
| - | tee / | + | |
| - | echo " | + | |
| - | tee -a / | + | |
| - | apt-key adv --keyserver hkp:// | + | |
| - | apt-get update | + | |
| - | echo oracle-java8-installer shared/ | + | |
| - | /usr/bin/debconf-set-selections | + | |
| - | apt-get install -yq oracle-java8-installer | + | |
| - | apt-get install -yq oracle-java8-set-default | + | |
| - | </ | + | |
| - | ===== Tomcat Installation von Hand ===== | + | ### Start Config ### |
| - | Tomcat 6: Linux .tar.gz runterladen von: | + | |
| - | http:// | + | |
| - | cd | + | |
| - | mkdir workshop | + | |
| - | cd workshop | + | |
| - | wget http:// | + | |
| - | 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: | + | TOMCAT_VERSION=10.1.20 |
| - | http:// | + | INSTANCE_NAME=workshop |
| - | cd | + | |
| - | mkdir workshop | + | |
| - | cd workshop | + | |
| - | wget http:// | + | |
| - | 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: | + | ### End Config #### |
| - | http:// | + | |
| - | cd | + | |
| - | mkdir workshop | + | |
| - | cd workshop | + | |
| - | wget http:// | + | |
| - | tar xzf apache-tomcat-8.0.32.tar.gz | + | |
| - | ln -s apache-tomcat-8.0.32 apache-tomcat | + | |
| - | ===== Tomcat Minimal Konfiguration ===== | + | CATALINA_HOME=/opt/tomcat/products/${TOMCAT_VERSION} |
| - | cd | + | CATALINA_BASE=/opt/tomcat/ |
| - | 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/ | + | |
| - | '' | + | |
| - | <code xml> | + | |
| - | <?xml version=' | + | |
| - | <Server port="${port.prefix}05" shutdown=" | + | |
| - | < | + | |
| - | < | + | |
| - | <Service name=" | + | export CATALINA_HOME |
| - | < | + | export CATALINA_BASE |
| - | | + | |
| - | /> | + | |
| - | <Engine name=" | + | |
| - | <Host name=" | + | |
| - | unpackWARs=" | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | case " | |
| - | '' | + | start) |
| - | <code xml> | + | $CATALINA_HOME/ |
| - | <?xml version=' | + | |
| - | <Server port="${port.prefix}05" | + | |
| - | < | + | |
| - | < | + | |
| - | + | ||
| - | <Service name=" | + | |
| - | < | + | |
| - | protocol=" | + | |
| - | /> | + | |
| - | <Engine name=" | + | |
| - | defaultHost=" | + | |
| - | <Host name=" | + | |
| - | appBase=" | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | export JAVA_OPTS=" | + | |
| - | export CATALINA_OPTS=" | + | |
| - | export CATALINA_PID=" | + | |
| - | ${CATALINA_HOME}/ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | export JAVA_OPTS=" | + | |
| - | export CATALINA_PID=" | + | |
| - | ${CATALINA_HOME}/bin/ | + | |
| - | </ | + | |
| - | Startfähigkeit herstellen | + | |
| - | <code bash> | + | |
| - | chmod +x bin/ | + | |
| - | #cp -a bin/ | + | |
| - | chmod +x bin/ | + | |
| - | </ | + | |
| - | + | ||
| - | Verzeichnisbaum nach dem Start | + | |
| - | < | + | |
| - | ├── bin | + | |
| - | │ ├── shutdown.sh | + | |
| - | │ └── startup.sh | + | |
| - | ├── conf | + | |
| - | │ ├── Catalina | + | |
| - | │ │ └── localhost | + | |
| - | │ └── server.xml | + | |
| - | ├── logs | + | |
| - | │ ├── catalina.out | + | |
| - | │ └── tomcat.pid | + | |
| - | ├── temp | + | |
| - | ├── webapps | + | |
| - | └── work | + | |
| - | </ | + | |
| - | Check der server.xml ab Apache Tomcat 7 | + | |
| - | + | ||
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | export JAVA_OPTS=" | + | |
| - | ${CATALINA_HOME}/ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | <code xml> | + | |
| - | <web-app xmlns=" | + | |
| - | xmlns: | + | |
| - | xsi: | + | |
| - | http:// | + | |
| - | version=" | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | mkdir webapps/ | + | |
| - | echo " | + | |
| - | </ | + | |
| - | + | ||
| - | Ergebnis einer index.html Auslieferung | + | |
| - | < | + | |
| - | 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 | + | |
| - | Server: Apache-Coyote/ | + | |
| - | Accept-Ranges: | + | |
| - | ETag: W/" | + | |
| - | Last-Modified: | + | |
| - | Content-Length: | + | |
| - | Date: Mon, 10 Mar 2014 13:59:42 GMT | + | |
| - | Connection: close | + | |
| - | + | ||
| - | hello | + | |
| - | Connection closed by foreign host. | + | |
| - | nutzer18@notebook18: | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | Mimetypes | + | |
| - | '' | + | |
| - | < | + | |
| - | <web-app ....> | + | |
| - | ... | + | |
| - | <!-- Nach servlet-mapping --> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | ... | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | oder einfacher alles aus der Distribution übernehmen: | + | |
| - | + | ||
| - | < | + | |
| - | cd workshop/ | + | |
| - | cp ../ | + | |
| - | bin/ | + | |
| - | bin/ | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Hinweis zur server.xml Konfiguration ==== | + | |
| - | Der Connector Parameter " | + | |
| - | + | ||
| - | ==== Testen ==== | + | |
| - | Tomcat starten: | + | |
| - | ./ | + | |
| - | + | ||
| - | Prozesse sehen: | + | |
| - | jps | + | |
| - | jps -v | + | |
| - | lsof -a -i -c java | + | |
| - | lsof -i | grep java | + | |
| - | lsof -i | grep $(cat ../ | + | |
| - | + | ||
| - | Speicherbelegung der Prozesse: | + | |
| - | jstat -gc $(cat logs/ | + | |
| - | + | ||
| - | Free Memory | + | |
| - | + | ||
| - | jstat -gc $(cat logs/ | + | |
| - | jstat -gc $(cat logs/ | + | |
| - | + | ||
| - | Stacktrace ausgeben lassen: | + | |
| - | kill -3 $(cat logs/ | + | |
| - | less logs/ | + | |
| - | #stacktrace snapshot erzeugen | + | |
| - | jstack -l $(cat logs/ | + | |
| - | + | ||
| - | firefox http:// | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | # | + | |
| - | ~/ | + | |
| - | ~/ | + | |
| - | </ | + | |
| - | ===== Checks ===== | + | |
| - | + | ||
| - | '' | + | |
| - | [[http:// | + | |
| - | [[http:// | + | |
| - | [[http:// | + | |
| - | + | ||
| - | ==== Check Pid, Ports, Alive ==== | + | |
| - | <code bash> | + | |
| - | if [ -f ~/ | + | |
| - | pid_no=`cat ~/ | + | |
| - | 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 ': | + | |
| - | port_7309=`lsof -i | grep $pid_no | grep -q ': | + | |
| - | port_7305=`lsof -i | grep $pid_no | grep -q ': | + | |
| - | + | ||
| - | for x in " | + | |
| - | echo "$DATE - $x" | + | |
| - | done | + | |
| - | + | ||
| - | temp=`curl --silent http:// | + | |
| - | if [ $temp -eq 1 ]; then | + | |
| - | echo "$DATE - Ok - AliveCheck" | + | |
| - | else | + | |
| - | echo "$DATE - Err - AliveCheck" | + | |
| - | fi | + | |
| - | else | + | |
| - | echo "$DATE - Err: pid existiert nicht!" | + | |
| - | fi | + | |
| - | </ | + | |
| - | + | ||
| - | mkdir -p webapps/ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <%@ page session=" | + | |
| - | </ | + | |
| - | + | ||
| - | ==== Check JVM Free Mem ==== | + | |
| - | Prüfen ob noch genügend freier Speicher vorhanden ist: | + | |
| - | + | ||
| - | + | ||
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | # resolve links - $0 may be a softlink | + | |
| - | case $0 in | + | |
| - | /*) | + | |
| - | PRG=" | + | |
| ;; | ;; | ||
| - | *) | + | stop) |
| - | | + | |
| - | | + | |
| + | *) | ||
| + | echo "Usage: | ||
| + | exit 1 | ||
| ;; | ;; | ||
| - | esac | ||
| - | |||
| - | while [ -h " | ||
| - | ls=`ls -ld " | ||
| - | link=`expr " | ||
| - | if expr " | ||
| - | PRG=" | ||
| - | else | ||
| - | PRG=`dirname " | ||
| - | fi | ||
| - | done | ||
| - | cd " | ||
| - | PWD=`pwd` | ||
| - | PRGDIR=`dirname " | ||
| - | PID=$(cat ${PRGDIR}/ | ||
| - | DATE=`date --rfc-3339=ns` | ||
| - | |||
| - | MEMOLDUSAGE=$(jstat -gc $PID | tail -1 | awk ' | ||
| - | PERFOLDDATA=$(jstat -gcoldcapacity $PID | tail -1 | awk -v usage=$MEMOLDUSAGE ' | ||
| - | MEMPERMUSAGE=$(jstat -gc $PID | tail -1 | awk ' | ||
| - | PERFPERMDATA=$(jstat -gcpermcapacity $PID | tail -1 | awk -v usage=$MEMPERMUSAGE ' | ||
| - | |||
| - | VALUE=$(echo $PERFOLDDATA | awk ' | ||
| - | |||
| - | STATUS=OK | ||
| - | if [ $VALUE -lt $1 ] ; then | ||
| - | STATUS=WARNING | ||
| - | elif [ $VALUE -lt $2 ] ; then | ||
| - | STATUS=CRITICAL | ||
| - | fi | ||
| - | |||
| - | echo $STATUS | ||
| - | |||
| - | if [ $STATUS != " | ||
| - | VALUE=$(echo $PERFPERMDATA | awk ' | ||
| - | |||
| - | if [ $VALUE -lt $3 ] ; then | ||
| - | STATUS=WARNING | ||
| - | elif [ $VALUE -lt $4 ] ; then | ||
| - | STATUS=CRITICAL | ||
| - | fi | ||
| - | fi | ||
| - | |||
| - | echo " | ||
| - | case $STATUS in | ||
| - | OK) exit 0 ;; | ||
| - | WARNING) exit 1 ;; | ||
| - | CRTICAL) exit 2 ;; | ||
| - | *) exit 3;; | ||
| esac | esac | ||
| </ | </ | ||
| - | ==== Check TomcatStartup State | + | ==== 1.3 - Erweiterung setenv.sh |
| - | Als Parameter benötigt das Skript den Pfad zur Logdatei. | ||
| - | |||
| - | '' | ||
| - | <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 | ||
| - | | ||
| - | echo "File not found" | ||
| - | exit $RESPONSE_CODE_UNKNOWN | ||
| - | fi | ||
| - | |||
| - | for x in $(tac $LOGFILE) ; | ||
| - | do | ||
| - | if [ `echo $x | grep ' | ||
| - | ANALYSE_STATE=1 | ||
| - | fi; | ||
| - | |||
| - | if [ ${ANAlYSE_STATE}=" | ||
| - | if [ `echo $x | grep ' | ||
| - | ERROR_COUNT=$(($ERROR_COUNT+1)) | ||
| - | fi; | ||
| - | if [ `echo $x | grep ' | ||
| - | WARN_COUNT=$(($WARN_COUNT+1)) | ||
| - | fi; | ||
| - | |||
| - | if [ `echo $x | grep ' | ||
| - | break | ||
| - | fi; | ||
| - | fi; | ||
| - | done ; | ||
| - | |||
| - | IFS=$OIFS | ||
| - | |||
| - | if [ $ERROR_COUNT -ge " | ||
| - | echo " | ||
| - | echo "WARN COUNT: $WARN_COUNT" | ||
| - | echo "ERROR COUNT: $ERROR_COUNT | " | ||
| - | exit $RESPONSE_CODE_CRITICAL | ||
| - | fi | ||
| - | |||
| - | if [ $WARN_COUNT -ge " | ||
| - | echo " | ||
| - | echo "WARN COUNT: $WARN_COUNT" | ||
| - | echo "ERROR COUNT: $ERROR_COUNT | " | ||
| - | exit $RESPONSE_CODE_WARNING | ||
| - | fi | ||
| - | |||
| - | if [ ${ANAlYSE_STATE}=" | ||
| - | then | ||
| - | echo " | ||
| - | echo "WARN COUNT: $WARN_COUNT" | ||
| - | echo "ERROR COUNT: $ERROR_COUNT | " | ||
| - | exit $RESPONSE_CODE_OK | ||
| - | else | ||
| - | echo " | ||
| - | echo "WARN COUNT: $WARN_COUNT" | ||
| - | echo "ERROR COUNT: $ERROR_COUNT | " | ||
| - | exit $RESPONSE_CODE_UNKNOWN | ||
| - | fi | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Applikationen ===== | ||
| - | ==== Hello World ==== | ||
| - | mkdir webapps/ | ||
| - | '' | ||
| - | < | ||
| - | hello! <br> | ||
| - | es ist <%=new java.util.Date() %> Uhr! | ||
| - | </ | ||
| - | |||
| - | firefox http:// | ||
| - | |||
| - | ==== Hello World Servlet ==== | ||
| - | mkdir -p webapps/ | ||
| - | cd webapps/ | ||
| - | vi HelloWorld.java | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | import java.io.*; | ||
| - | import javax.servlet.*; | ||
| - | import javax.servlet.http.*; | ||
| - | |||
| - | public class HelloWorld extends HttpServlet { | ||
| - | |||
| - | public void doGet(HttpServletRequest request, HttpServletResponse response) | ||
| - | throws IOException, | ||
| - | { | ||
| - | response.setContentType(" | ||
| - | PrintWriter out = response.getWriter(); | ||
| - | out.println("< | ||
| - | out.println("< | ||
| - | out.println("< | ||
| - | out.println("</ | ||
| - | out.println("< | ||
| - | out.println("< | ||
| - | out.println("</ | ||
| - | out.println("</ | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | javac -cp ~/ | ||
| - | cd .. | ||
| - | vi web.xml | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Restart des Servers | ||
| - | cd ~/ | ||
| - | bin/ | ||
| - | bin/ | ||
| - | firefox http:// | ||
| - | |||
| - | Test mit telnet | ||
| - | | ||
| < | < | ||
| - | nutzer20@notebook20: | + | 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 / | + | |
| - | + | ||
| - | HTTP/1.1 200 OK | + | |
| - | Server: Apache-Coyote/ | + | |
| - | Content-Type: | + | |
| - | Content-Length: | + | |
| - | Date: Thu, 08 Mar 2012 14:10:34 GMT | + | |
| - | Connection: close | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | Connection closed by foreign host. | + | |
| - | </ | + | |
| - | + | ||
| - | Autoreload auf WEB-INF/ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | Autoreload für Änderungen von Klassen aller Anwendungen | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <Context reloadable="true"> | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | 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 ~/ | + | |
| - | mkdir world | + | |
| - | mkdir world/ | + | |
| - | mkdir world/ | + | |
| - | mkdir world/ | + | |
| - | cd world/ | + | |
| - | vi Hello.java | + | |
| - | javac -cp ~/ | + | |
| - | # restart des Servers | + | |
| - | + | ||
| - | + | ||
| - | < | + | |
| - | + | ||
| - | package world; | + | |
| - | + | ||
| - | import java.io.*; | + | |
| - | import javax.servlet.*; | + | |
| - | import javax.servlet.http.*; | + | |
| - | import javax.servlet.annotation.WebServlet ; | + | |
| - | + | ||
| - | @WebServlet("/ | + | |
| - | public class Hello extends HttpServlet | + | |
| - | + | ||
| - | public void doGet(HttpServletRequest request, HttpServletResponse response) | + | |
| - | throws IOException, | + | |
| - | { | + | |
| - | response.setContentType(" | + | |
| - | | + | |
| - | out.println("< | + | |
| - | out.println("< | + | |
| - | out.println("< | + | |
| - | out.println("</ | + | |
| - | out.println("< | + | |
| - | out.println("< | + | |
| - | out.println("</ | + | |
| - | out.println("</ | + | |
| - | | + | |
| - | } | + | |
| - | </file> | + | |
| - | ==== .war ==== | + | |
| - | mkdir /tmp/ | + | |
| - | ''/ | + | |
| - | < | + | |
| - | hello2! < | + | |
| - | es ist <%=new java.util.Date() %> Uhr! | + | |
| - | </ | + | |
| - | + | ||
| - | jar cf hello2.war -C / | + | |
| - | cp hello2.war webapps/ | + | |
| - | + | ||
| - | firefox http:// | + | |
| - | + | ||
| - | ==== Tomcat 8: hinzufügen statischer Dateien ==== | + | |
| - | + | ||
| - | mkdir -f webapps/ | + | |
| - | mkdir files | + | |
| - | echo "hello" > | + | |
| - | vi webapps/ | + | |
| - | bin/ | + | |
| - | curl 127.0.0.1: | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <Context reloadable=" | + | |
| - | < | + | |
| - | < | + | |
| - | className=" | + | |
| - | base="${catalina.base}/files" | + | |
| - | webAppMount=" | + | |
| - | /> | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | ===== Tomcat 6 Installation mit Ubuntu ===== | + | |
| - | Ubuntu Standard Tomcat Installation | + | |
| - | < | + | |
| - | sudo apt-get install tomcat6 | + | |
| - | sudo apt-get install tomcat6-admin | + | |
| - | </ | + | |
| - | + | ||
| - | User Node Installation für Test | + | |
| - | < | + | |
| - | sudo apt-get install tomcat6-user | + | |
| - | tomcat6-instance-create node91 -p 9180 -c 9105 -w qwewqeiq879qewq | + | |
| - | node91/ | + | |
| - | node91/ | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Basic Authentication ===== | + | |
| - | Application '' | + | |
| - | + | ||
| - | '' | + | |
| - | <code xml> | + | |
| - | <Server ..> | + | |
| - | .. | + | |
| - | < | + | |
| - | < | + | |
| - | auth=" | + | |
| - | type=" | + | |
| - | | + | |
| - | factory=" | + | |
| - | pathname=" | + | |
| - | </ | + | |
| - | + | ||
| - | <Service ..> | + | |
| - | <Engine ..> | + | |
| - | <Realm className="org.apache.catalina.realm.UserDatabaseRealm" | + | |
| - | | + | |
| - | .. | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| </ | </ | ||
| - | '' | + | ==== 1.4 - OOM ==== |
| - | <code xml> | + | |
| - | < | + | |
| - | <user username=" | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | + | ||
| - | < | + | |
| - | <?xml version="1.0" encoding=" | + | |
| - | <web-app xmlns=" | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | Tolle Hello World Application | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | <!-- Define a Security Constraint on this Application --> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | + | ||
| - | <!-- < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | <!-- Define the Login Configuration for this Application --> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | <!-- Security roles referenced by this web application --> | + | |
| - | < | + | |
| - | < | + | |
| - | The role that is required to log in to the Hello Application | + | |
| - | </ | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| - | Syntax Tomcat 6 Servlet Api 2.5 checken: | + | |
| - | xmllint --noout --schema http:// | + | |
| - | Syntax Tomcat 7 - Servlet API 3.0 checken: | + | |
| - | xmllint --noout --schema http:// | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | hello error 401 | + | |
| - | </ | + | |
| - | + | ||
| - | Setzen einer kontrollierten Fehlerreaktion für "File not found" Status Code 404 | + | |
| - | '' | + | |
| < | < | ||
| - | <web-app> | + | JAVA_OOM=" |
| - | .. | + | CATALINA_OPTS=" |
| - | < | + | |
| - | <error-code> | + | |
| - | < | + | |
| - | </error-page> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | .. | + | |
| - | </ | + | |
| </ | </ | ||
| - | Für Tomcat 7 ist das web-app Schema folgendes. | + | ==== 1.4 - action.bash ==== |
| - | '' | ||
| - | < | ||
| - | <web-app xmlns=" | ||
| - | xmlns: | ||
| - | xsi: | ||
| - | http:// | ||
| - | version=" | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | '' | ||
| - | < | ||
| - | |||
| - | <%@ page session=" | ||
| - | |||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | |||
| - | The url < | ||
| - | was not found. | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | 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| | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <%@ page session=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | <% | ||
| - | if(true) { | ||
| - | throw new RuntimeException(" | ||
| - | } | ||
| - | %> | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | |||
| - | '' | ||
| - | < | ||
| - | <%@ page session=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | body, p { font-family: | ||
| - | pre { font-size: | ||
| - | </ | ||
| - | </ | ||
| - | < | ||
| - | |||
| - | <%-- Exception Handler --%> | ||
| - | <font color=" | ||
| - | <%= exception.toString() %>< | ||
| - | </ | ||
| - | |||
| - | <% | ||
| - | 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()); | ||
| - | |||
| - | %> | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | ===== Digest password ===== | ||
| - | Generierung des Password mit Digest | ||
| < | < | ||
| - | apache-tomcat/ | ||
| - | </ | ||
| - | |||
| - | Eintragen der Password in die tomcat-users.xml | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | < | ||
| - | <user username=" | ||
| - | <user username=" | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Eintragen des Digest Algo im Realm | ||
| - | '' | ||
| - | < | ||
| - | .. | ||
| - | <Engine name=" | ||
| - | <Realm className=" | ||
| - | | ||
| - | | ||
| - | .. | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | Restart des Servers | ||
| - | |||
| - | ===== Manager Application ===== | ||
| - | Erste Option ist die Übernahme der manager Anwendung in die Node. | ||
| - | cp -a ../ | ||
| - | |||
| - | Besser wäre eine Referenz der Manager Anwendung in den Node zuvereinbaren. | ||
| - | |||
| - | '' | ||
| - | <code xml> | ||
| - | <Context docBase=" | ||
| - | </ | ||
| - | |||
| - | firefox http:// | ||
| - | Benutzername: | ||
| - | Password: tomcat | ||
| - | ( siehe '' | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | < | ||
| - | <user name=" | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Tomcat 8: | ||
| - | '' | ||
| - | |||
| - | < | ||
| - | <?xml version=' | ||
| - | < | ||
| - | xmlns: | ||
| - | xsi: | ||
| - | version=" | ||
| - | <role rolename=" | ||
| - | <user username=" | ||
| - | </ | ||
| - | </ | ||
| - | ---- | ||
| - | |||
| - | |||
| - | 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!!! | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <Server .. > | ||
| - | < | ||
| - | |||
| - | < | ||
| - | < | ||
| - | auth=" | ||
| - | type=" | ||
| - | description=" | ||
| - | factory=" | ||
| - | pathname=" | ||
| - | readonly=" | ||
| - | </ | ||
| - | <Service ..> | ||
| - | <Engine ..> | ||
| - | <Realm className=" | ||
| - | | ||
| - | .. | ||
| - | </ | ||
| - | </ | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | Zur Installation von Anwendungen auf dem Server kann man auch curl nutzen. | ||
| - | Dazu ist es notwendig das der " | ||
| - | < | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <Context docBase=" | ||
| - | </ | ||
| - | |||
| - | Einschränkung des Zugriffs auf die Manager Anwendung nur vom lokalen Host | ||
| - | '' | ||
| - | < | ||
| - | <Context docBase=" | ||
| - | <Valve className=" | ||
| - | | ||
| - | </ | ||
| - | |||
| - | |||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <Engine ...> | ||
| - | | ||
| - | | ||
| - | <Realm className=" | ||
| - | < | ||
| - | resourceName=" | ||
| - | |||
| - | </ | ||
| - | |||
| - | ... | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | ==== Weitere Manager Berechtigungen ==== | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | < | ||
| - | <user name=" | ||
| - | <user name=" | ||
| - | <user name=" | ||
| - | <user name=" | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | < | ||
| - | curl -u status: | ||
| - | </ | ||
| - | |||
| - | Ergebnis | ||
| - | < | ||
| - | <?xml version=" | ||
| - | <? | ||
| - | < | ||
| - | <jvm> | ||
| - | <memory free=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | <worker stage=" | ||
| - | <worker stage=" | ||
| - | <worker stage=" | ||
| - | </ | ||
| - | </ | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | * [[http:// | ||
| - | * [[http:// | ||
| - | * [[http:// | ||
| - | ===== Monitoring mit der Jconsole ===== | ||
| - | |||
| - | Remote Monitoring mit dem Befehl jconsole | ||
| - | |||
| - | '' | ||
| - | <code java> | ||
| - | |||
| - | export CATALINA_OPTS=" | ||
| - | -Dcom.sun.management.jmxremote.port=7304 \ | ||
| - | -Dcom.sun.management.jmxremote.rmi.port=7304 \ | ||
| - | -Dcom.sun.management.jmxremote.authenticate=false \ | ||
| - | -Dcom.sun.management.jmxremote.ssl=false \ | ||
| - | -Djava.rmi.server.hostname=$(hostname) \ | ||
| - | -Djava.rmi.server.useLocalHostname=true" | ||
| - | </ | ||
| - | |||
| - | Ab Java > 7.0.32 und Java 8 kann man mit diesem Parameter das Port binding auf einen Port zwingen. | ||
| - | |||
| - | < | ||
| - | -Dcom.sun.management.jmxremote.rmi.port=7304 \ | ||
| - | </ | ||
| - | |||
| - | Wenn eine Autorisierung nötig ist geht das mit: | ||
| - | < | ||
| - | -Dcom.sun.management.jmxremote.authenticate=true \ | ||
| - | -Dcom.sun.management.jmxremote.password.file=../ | ||
| - | -Dcom.sun.management.jmxremote.access.file=../ | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | monitorRole readonly | ||
| - | controlRole readwrite | ||
| - | </ | ||
| - | |||
| - | |||
| - | '' | ||
| - | < | ||
| - | monitorRole tomcat | ||
| - | controlRole tomcat | ||
| - | </ | ||
| - | |||
| - | 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:// | ||
| - | * http:// | ||
| - | |||
| - | download jmx remote download | ||
| - | http:// | ||
| - | |||
| - | cp catalina-jmx-remote.jar node73/lib | ||
| - | |||
| - | < | ||
| - | <Server ...> | ||
| - | < | ||
| - | | ||
| - | | ||
| - | | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Freischaltung der Firewall | ||
| - | < | ||
| - | sudo iptables -A INPUT -p tcp --dport 7303 -j ACCEPT | ||
| - | sudo iptables -A INPUT -p tcp --dport 7304 -j ACCEPT | ||
| - | </ | ||
| - | |||
| - | |||
| - | Access URL | ||
| - | < | ||
| - | service: | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <?xml version=' | ||
| - | < | ||
| - | <role rolename=" | ||
| - | <role rolename=" | ||
| - | <user username=" | ||
| - | <user username=" | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Access MBean Attribute WebModule stateName | ||
| - | < | ||
| - | http:// | ||
| - | </ | ||
| - | |||
| - | Access with curl | ||
| - | < | ||
| - | $curl --user " | ||
| - | OK - Attribute get ' | ||
| - | |||
| - | </ | ||
| - | |||
| - | < | ||
| - | $ curl --user " | ||
| - | OK STARTED | ||
| - | </ | ||
| - | |||
| - | |||
| - | http:// | ||
| - | |||
| - | ===== Logging ===== | ||
| - | Hinweise | ||
| - | - [[http:// | ||
| - | - [[http:// | ||
| - | - [[http:// | ||
| - | ==== Logging: Minimale Konfiguration ==== | ||
| - | '' | ||
| - | < | ||
| - | 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}/ | ||
| - | 1catalina.org.apache.juli.FileHandler.prefix = catalina. | ||
| - | |||
| - | # | ||
| - | # | ||
| - | </ | ||
| - | ==== Anwendung mit eigener Log- Konfiguration ==== | ||
| - | |||
| - | '' | ||
| - | < | ||
| #!/bin/bash | #!/bin/bash | ||
| - | JAVA_OPTS=" | + | dumps=`ls -1rt /var/tomcat/java_pid*.hprof | tail -1`; |
| - | </file> | + | printf " |
| - | + | # printf " | |
| - | <code> | + | |
| - | cd bin | + | |
| - | chmod +x setenv.sh | + | |
| - | cd .. | + | |
| - | mkdir -p webapps/ROOT/WEB-INF/ | + | |
| - | vi webapps/ | + | |
| </ | </ | ||
| - | '' | + | ==== 1.8 - Valve und Filter ==== |
| - | < | + | |
| - | 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- | + | |
| - | </ | + | |
| - | Level : | ||
| - | * OFF | ||
| - | * SEVERE | ||
| - | * WARNING | ||
| - | * INFO | ||
| - | * CONFIG | ||
| - | * FINE | ||
| - | * FINER | ||
| - | * FINEST | ||
| - | * ALL | ||
| - | |||
| - | Unterdrücken der WebSocket Meldung bei Verwendung von Java 6 | ||
| - | '' | ||
| < | < | ||
| - | org.apache.tomcat.websocket.server.WsSci.level = OFF | ||
| - | </ | ||
| - | |||
| - | Autoreloading Anwendung nachdem die logging.properties geändert wurde | ||
| - | |||
| - | '' | ||
| - | < | ||
| < | < | ||
| - | <WatchedResource> | + | <Valve className=" |
| </ | </ | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <%@ page import=" | ||
| - | <% | ||
| - | |||
| - | Logger logger = Logger.getLogger("" | ||
| - | logger.info(" | ||
| - | logger.fine(" | ||
| - | |||
| - | application.log(" | ||
| - | System.out.println(" | ||
| - | System.err.println(" | ||
| - | %> | ||
| - | see logfiles | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | curl http:// | ||
| </ | </ | ||
| - | Ausgabe | ||
| - | / | ||
| - | |||
| - | 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: | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | 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 | ||
| - | </ | ||
| - | |||
| - | Ausgabe des Tomcat8 | ||
| - | |||
| - | 05-May-2015 10: | ||
| - | 05-May-2015 10: | ||
| - | 05-May-2015 10: | ||
| - | |||
| - | |||
| - | Änderung der Sprache für die LogAusgabe | ||
| - | |||
| - | check : | ||
| - | <code bash> | ||
| - | echo $LANG | ||
| - | de_DE.UTF-8 | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | export LANG=" | ||
| - | export JAVA_OPTS=" | ||
| - | </ | ||
| - | |||
| - | Ausgabe | ||
| - | / | ||
| - | 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 | ||
| - | |||
| - | / | ||
| - | |||
| - | system.out | ||
| - | system.err | ||
| - | |||
| - | Umlenkung der Ausgabe von System.out und System.err in das Appliction.log | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <Context swallowOutput=" | ||
| - | </ | ||
| - | ==== logrotate ==== | ||
| - | ''/ | ||
| - | < | ||
| - | / | ||
| - | size=+10 | ||
| - | compress | ||
| - | create 640 nutzer01 nutzer01 | ||
| - | copytruncate | ||
| - | # Achtung: hierbei können einzelne Logmeldungen während des Kopier/ | ||
| - | } | ||
| - | </ | ||
| - | === testen === | ||
| - | logrotate / | ||
| - | |||
| - | oder etwas ernsthafter | ||
| - | |||
| - | ''/ | ||
| - | < | ||
| - | / | ||
| - | rotate 8 | ||
| - | daily | ||
| - | compress | ||
| - | create 640 nutzer01 nutzer01 | ||
| - | copytruncate | ||
| - | # Achtung: hierbei können einzelne Logmeldungen während des Kopier/ | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | === Ausschalten der Rotierung eines FileHandlers === | ||
| - | '' | ||
| - | < | ||
| - | .. | ||
| - | 1root.org.apache.juli.FileHandler.rotatable=false | ||
| - | </ | ||
| - | |||
| - | http:// | ||
| - | |||
| - | |||
| - | |||
| - | ==== /var fuer log-files nutzen ==== | ||
| - | < | ||
| - | sudo mkdir / | ||
| - | sudo mkdir / | ||
| - | sudo mkdir / | ||
| - | sudo chown nutzer01: | ||
| - | sudo chown -R nutzer01: | ||
| - | </ | ||
| - | '' | ||
| - | < | ||
| - | ... | ||
| - | export CATALINA_OUT=/ | ||
| - | export CATALINA_TMPDIR=/ | ||
| - | export JAVA_OPTS=-Dport.prefix=73 -Dcatalina.workdir=/ | ||
| - | ... | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | ... | ||
| - | export CATALINA_OUT=/ | ||
| - | export CATALINA_TMPDIR=/ | ||
| - | export JAVA_OPTS=-Dport.prefix=73 -Dcatalina.workdir=/ | ||
| - | ... | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <Engine ...> | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Anpassung der / | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | ==== Nutzen von Logback für Tomcat ==== | ||
| - | |||
| - | mkdir -p ~/ | ||
| - | cd ~/ | ||
| - | mkdir -p ../ | ||
| - | wget https:// | ||
| - | unzip tomcat-juli-8.0.32-slf4j-1.7.16-logback-1.1.5.zip | ||
| - | cp lib/ | ||
| - | cp lib tomcat-juli ../ | ||
| - | cd ../node73 | ||
| - | vi setenv.sh | ||
| - | vi ../ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | CLASSPATH=${CATALINA_BASE}/ | ||
| - | JAVA_OPTS=" | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <?xml version=" | ||
| - | |||
| - | < | ||
| - | |||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | <root level=" | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | * https:// | ||
| - | * https:// | ||
| - | |||
| - | ==== Java 7 und Tomcat >7.0.42 formatting ==== | ||
| - | |||
| - | * SimpleFormatter http:// | ||
| - | * Formatter Pattern syntax http:// | ||
| - | |||
| - | |||
| - | '' | ||
| - | < | ||
| - | .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: | ||
| - | org.apache.tomcat.util.digester.Digester.level=OFF | ||
| - | |||
| - | </ | ||
| - | |||
| - | Ausgabe | ||
| - | < | ||
| - | Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/ | ||
| - | Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina load WARNING: Catalina.start using conf/ | ||
| - | Sep 02, 2014 12:02:23 PM org.apache.catalina.startup.Catalina start SEVERE: Cannot start server. Server instance is not configured. | ||
| - | </ | ||
| - | |||
| - | * ISO_8601 http:// | ||
| - | < | ||
| - | .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: | ||
| - | |||
| - | org.apache.tomcat.util.digester.Digester.level=OFF | ||
| - | |||
| - | </ | ||
| - | |||
| - | Ausgabe | ||
| - | < | ||
| - | 2014-09-02T12: | ||
| - | 2014-09-02T12: | ||
| - | 2014-09-02T12: | ||
| - | </ | ||
| - | |||
| - | 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. | ||
| - | |||
| - | < | ||
| - | mkdir -p workshop/ | ||
| - | cd workshop/ | ||
| - | wget http:// | ||
| - | wget http:// | ||
| - | javac -cp ../ | ||
| - | cd ../../.. | ||
| - | jar -cf ../ | ||
| - | cp ../ | ||
| - | cd ../ | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | #!/bin/bash | ||
| - | export CLASSPATH=$CLASSPATH: | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | 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}/ | ||
| - | 1catalina.org.apache.juli.FileHandler.prefix = catalina. | ||
| - | 1catalina.org.apache.juli.FileHandler.formatter = org.apache.juli.OneLineFormatter | ||
| - | </ | ||
| - | |||
| - | restart des Servers und Kontrolle des Log Files | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | 12-Jul-2011 12: | ||
| - | 12-Jul-2011 12: | ||
| - | 12-Jul-2011 12: | ||
| - | 12-Jul-2011 12: | ||
| - | </ | ||
| - | |||
| - | Im Tomcat 7 existiert noch ein AsyncFileHandler der sich für High Traffic Sites eignet. | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | 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}/ | ||
| - | 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: | ||
| - | |||
| - | org.apache.tomcat.util.digester.Digester.level=OFF | ||
| - | |||
| - | </ | ||
| - | |||
| - | |||
| - | |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 | ||
| - | |OVERFLOW_DROP_CURRENT | 4 | | ||
| - | |||
| - | Referenz der Properties: http:// | ||
| - | |||
| - | ==== Links zu Java Logging API's ==== | ||
| - | |||
| - | ^ Beschreibung ^ Link ^ | ||
| - | | commons-logging | ||
| - | | log4j | http:// | ||
| - | | tomcat logging | ||
| - | | logback (Nachfolger von log4j) | ||
| - | | logback AccessLog and Filter | ||
| - | | SLF4J logback Tomcat Binding | ||
| - | | SLF4J logback Tomcat Download | ||
| - | | Log4j Tutorial | ||
| - | | Java Logging API Erweiterung X4Juli | http:// | ||
| - | | Syslog4j | ||
| - | ==== Access Log ==== | ||
| - | '' | ||
| - | < | ||
| - | <Valve className=" | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | /> | ||
| - | </ | ||
| - | |||
| - | 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. | ||
| - | '' | ||
| - | < | ||
| - | <Valve className=" | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | </ | ||
| - | |||
| - | === testen === | ||
| - | 100 Anfragen schicken: | ||
| - | ab -c 5 -n 100 -k http:// | ||
| - | Anfragen größer 70 Millisekunden filter: | ||
| - | awk ' | ||
| - | perl -a -n -e 'print $F[-2],$/ if $F[-2] > 70' logs/ | ||
| - | |||
| - | === Dokumentation === | ||
| - | * http:// | ||
| - | |||
| - | === 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! | ||
| - | |||
| - | '' | ||
| < | < | ||
| - | <Server ..> | + | <filter> |
| - | | + | <filter-name> |
| - | .. | + | < |
| - | + | < | |
| - | <Service ..> | + | < |
| - | .. | + | < |
| - | | + | </ |
| - | </Server> | + | </filter> |
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| </ | </ | ||
| - | Attribute Pattern für das AccesLogValve mit einer erweiterten Ausgabe | + | ===== Tag 2 ===== |
| - | < | + | |
| - | %h %l " | + | |
| - | </ | + | |
| - | Vorsicht: In der server.xml die Doppelten Anführungsstriche bitte durch " ersetzen. | + | |
| - | Mit dem Attribute < | + | ==== 2.4 - SSL Connector ==== |
| - | kann der JMX Zugang via jconsole genutzt werden. | + | |
| - | Dynamisch kann man diese Umschaltung auf via Manager App folgendermassen bewirken. | ||
| < | < | ||
| - | http:// | + | < |
| + | | ||
| + | < | ||
| + | ciphers=" | ||
| + | honorCipherOrder=" | ||
| + | < | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| - | ==== ELK-Stack for tomcat accesslog | + | ==== 2.5 - Anpassungen logging.properties |
| - | + | ||
| - | === Logstash === | + | |
| - | + | ||
| - | http:// | + | |
| < | < | ||
| - | curl -O https:// | + | 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, |
| - | bin/ | + | org.apache.juli.AsyncFileHandler, |
| - | bin/ | + | 5workshop1.org.apache.juli.AsyncFileHandler, |
| + | 6workshop2.org.apache.juli.AsyncFileHandler | ||
| </ | </ | ||
| - | |||
| - | Bald 1.5.x | ||
| - | |||
| - | Auf jeder Maschine sollten die Logs mit dem logstashforwarder abgeholt werden. | ||
| - | |||
| - | https:// | ||
| - | |||
| - | 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:// | ||
| - | |||
| < | < | ||
| - | curl -O https:// | + | 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/ | + | |
| - | curl ' | + | |
| - | </ | + | |
| - | '' | + | 6workshop2.org.apache.juli.AsyncFileHandler.level |
| - | + | 6workshop2.org.apache.juli.AsyncFileHandler.directory | |
| - | < | + | 6workshop2.org.apache.juli.AsyncFileHandler.prefix |
| - | input { stdin { } } | + | 6workshop2.org.apache.juli.AsyncFileHandler.maxDays = 90 |
| - | + | 6workshop2.org.apache.juli.AsyncFileHandler.encoding = UTF-8 | |
| - | filter { | + | |
| - | grok { | + | |
| - | match => { " | + | |
| - | } | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | output { | + | |
| - | elasticsearch { host => localhost } | + | |
| - | | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | Parse all access logs | + | |
| - | + | ||
| - | < | + | |
| - | input { | + | |
| - | file { | + | |
| - | path => "/ | + | |
| - | start_position | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | + | ||
| - | filter | + | |
| - | grok { | + | |
| - | match => { " | + | |
| - | } | + | |
| - | } | + | |
| - | + | ||
| - | output { | + | |
| - | elasticsearch { host => localhost } | + | |
| - | stdout { codec => rubydebug } | + | |
| - | } | + | |
| - | </file> | + | |
| - | + | ||
| - | Install HQ Plugin | + | |
| - | + | ||
| - | http:// | + | |
| - | + | ||
| - | open http:// | + | |
| - | + | ||
| - | Aufgaben | + | |
| - | + | ||
| - | * Erlernen der Query Sprache ist komplex und aufwendig | + | |
| - | * Cluster | + | |
| - | * Backup und Restore von Indexen | + | |
| - | + | ||
| - | === Kibana === | + | |
| - | + | ||
| - | + | ||
| - | https:// | + | |
| - | + | ||
| - | < | + | |
| - | curl -O https:// | + | |
| - | tar zxvf kibana-4.0.2-linux-x64.tar.gz | + | |
| - | cd kibana-4.0.2/bin | + | |
| - | ./kibana | + | |
| - | open http:// | + | |
| </ | </ | ||
| - | |||
| - | Änderungen in config/ | ||
| - | |||
| - | Aufgaben | ||
| - | |||
| - | * Erstellen eines Dashboards | ||
| - | * Sollen Metriken auch in Elasticsearch gespeichert werden? (Volumen) | ||
| - | |||
| - | ===== Speicher einstellen ===== | ||
| - | '' | ||
| - | < | ||
| - | export CATALINA_OPTS=" | ||
| - | </ | ||
| - | |||
| - | Perm Heap vergössern | ||
| < | < | ||
| - | -XX: | + | ws_log.handlers |
| + | de.kippdata.workshop.handlers = 6workshop2.org.apache.juli.AsyncFileHandler | ||
| </ | </ | ||
| - | + | ==== 2.6 - log4j.xml ==== | |
| - | GC Logging | + | |
| < | < | ||
| - | DATE=`date +'%y-%m-%d-%H-%M-%S'` | + | <?xml version=" |
| - | 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 | + | to the Configuration element for hot config reloading, |
| + | for example: < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| + | filePattern="${sys:catalina.var}/ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <!-- Daily Rotation, schedule is cron style | ||
| + | with columns seconds, minutes, hours, day-of-month, | ||
| + | | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | <Root level=" | ||
| + | < | ||
| + | </ | ||
| + | <!-- Example for changing a log level | ||
| + | <Logger name=" | ||
| + | level=" | ||
| + | < | ||
| + | </ | ||
| + | <Logger name=" | ||
| + | level=" | ||
| + | < | ||
| + | </ | ||
| + | <Logger name=" | ||
| + | level=" | ||
| + | < | ||
| + | </ | ||
| + | --> | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| - | Jstat Memory Trace | + | ==== 2.7 - JMX Remote ==== |
| < | < | ||
| - | jstat -gc `cat logs/tomcat.pid` 5000 | + | JMX_OPTS_NOSSL_NOAUTH=" |
| - | </ | + | -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:// | + | -Dcom.sun.management.jmxremote=true \ |
| - | * https:// | + | -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 < | + | -Dcom.sun.management.jmxremote.port=1090 |
| - | * http:// | + | -Dcom.sun.management.jmxremote.ssl=true \ |
| - | ===== Sessions ===== | + | |
| - | http:// | + | |
| - | + | ||
| - | Eine alternativer Tomcat Manager ist psi-probe. | + | |
| - | + | ||
| - | Schicker: http:// | + | |
| - | runterladen und | + | |
| - | unzip probe-2.3.3.zip | + | |
| - | cp probe.war webapps | + | |
| - | + | ||
| - | ===== Weitere Tomcat Instanz ===== | + | |
| - | cd | + | |
| - | cp -a node73/ node74 | + | |
| - | cd node74/ | + | |
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | export JAVA_OPTS="-Dport.prefix=74" | + | |
| - | export CATALINA_OPTS=" | + | |
| - | export CATALINA_PID=" | + | |
| - | ${CATALINA_HOME}/ | + | |
| - | </ | + | |
| - | '' | + | |
| - | <code bash> | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | export JAVA_OPTS=" | + | |
| - | export CATALINA_PID=" | + | |
| - | ${CATALINA_HOME}/ | + | |
| - | </ | + | |
| - | ./ | + | |
| - | + | ||
| - | + | ||
| - | oder:: | + | |
| - | + | ||
| - | < | + | |
| - | vi start | + | |
| - | ln -s start stop | + | |
| - | vi setenv.sh | + | |
| - | vi restart | + | |
| - | chmod 700 start stop restart | + | |
| - | </ | + | |
| - | '' | + | |
| - | < | + | |
| - | # | + | |
| - | export CATALINA_HOME=~/ | + | |
| - | export CATALINA_BASE=~/ | + | |
| - | ${CATALINA_HOME}/ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | export JAVA_OPTS=" | + | |
| - | export CATALINA_PID=" | + | |
| - | export CATALINA_OPTS=" | + | |
| - | export CATALINA_OPTS=" | + | |
| - | -Dcom.sun.management.jmxremote.ssl=false \ | + | |
| -Dcom.sun.management.jmxremote.authenticate=true \ | -Dcom.sun.management.jmxremote.authenticate=true \ | ||
| - | -Dcom.sun.management.jmxremote.password.file=../ | + | -Dcom.sun.management.jmxremote.access.file=${CATALINA_BASE}/ |
| - | -Dcom.sun.management.jmxremote.access.file=../ | + | -Dcom.sun.management.jmxremote.password.file=${CATALINA_BASE}/ |
| - | -Djava.rmi.server.hostname=$(hostname) | + | -Djavax.net.ssl.keyStorePassword=workshop |
| - | -Djava.rmi.server.useLocalHostname=true" | + | -Djavax.net.ssl.keyStore=${CATALINA_BASE}/ |
| - | export CATALINA_OPTS=" | + | " |
| - | </ | + | |
| - | '' | + | CATALINA_OPTS=" |
| - | < | + | |
| - | # | + | |
| - | ~/ | + | |
| - | sleep 2 | + | |
| - | ~/ | + | |
| </ | </ | ||
| - | ===== Praktischere Minimale Konfiguration ===== | ||
| - | cp -a ../ | ||
| - | Änderungen ( nicht vollständig ): | + | ===== Tag 3 ===== |
| - | '' | + | ==== 3.7 - Ressources |
| - | <code xml> | + | |
| - | <Server port=" | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | ===== Universelles Start Skript ===== | ||
| - | |||
| - | ermittelt seinen Namen aus dem Verzeichnis node< | ||
| - | |||
| - | '' | ||
| - | <code bash> | ||
| - | #!/bin/bash | ||
| - | # Get the fully qualified path to the script | ||
| - | case $0 in | ||
| - | /*) | ||
| - | SCRIPT=" | ||
| - | ;; | ||
| - | *) | ||
| - | PWD=`pwd` | ||
| - | SCRIPT=" | ||
| - | ;; | ||
| - | esac | ||
| - | |||
| - | # Change spaces to ":" | ||
| - | 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=" | ||
| - | while [ -h " | ||
| - | LS=" | ||
| - | LINK=" | ||
| - | if expr " | ||
| - | REALPATH=" | ||
| - | else | ||
| - | REALPATH=" | ||
| - | fi | ||
| - | done | ||
| - | done | ||
| - | # Change ":" | ||
| - | REALPATH=`echo $REALPATH | sed -e 's;:; ;g'` | ||
| - | |||
| - | # Change the current directory to the location of the script | ||
| - | cd " | ||
| - | cd " | ||
| - | REALDIR=`pwd` | ||
| - | parentdir=`dirname $REALDIR` | ||
| - | export CATALINA_BASE=$parentdir | ||
| - | |||
| - | INSTANCE_NAME=`basename $parentdir` | ||
| - | PORT_PREFIX=`echo $INSTANCE_NAME | awk '{ printf substr($1, | ||
| - | |||
| - | export CATALINA_HOME=/ | ||
| - | export CATALINA_OUT=/ | ||
| - | mkdir -p / | ||
| - | export CATALINA_TMPDIR=/ | ||
| - | mkdir -p / | ||
| - | export JAVA_OPTS=" | ||
| - | export CATALINA_OPTS=" | ||
| - | export CATALINA_PID=/ | ||
| - | $CATALINA_HOME/ | ||
| - | |||
| - | </ | ||
| - | |||
| - | ===== Dokumentation ===== | ||
| - | http:// | ||
| - | |||
| - | |||
| - | |||
| - | ===== 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=/ | ||
| - | 8295 sun.tools.jps.Jps -vml -Dapplication.home=/ | ||
| - | 8244 org.apache.catalina.startup.Bootstrap start -Dnop -DjvmRoute=node74 -Dport.prefix=74 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dcatalina.workdir=/ | ||
| - | |||
| - | Protokollierung des Speicherverbrauchs eines Java Prozesses | ||
| - | |||
| - | jstat -gc < | ||
| - | |||
| - | Ausgabe | ||
| - | |||
| - | S0C S1C S0U S1U EC | ||
| - | | ||
| - | | ||
| - | | ||
| - | |||
| - | |||
| - | ===== 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. | ||
| < | < | ||
| - | <Executor name=" | + | <Context docBase="/opt/ |
| - | < | + | |
| - | < | + | <PreResources |
| - | + | | |
| - | < | + | </Resources> |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | ==== server.xml ==== | + | |
| - | + | ||
| - | < | + | |
| - | <?xml version=' | + | |
| - | <Server port=" | + | |
| - | < | + | |
| - | < | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | auth=" | + | |
| - | type=" | + | |
| - | description=" | + | |
| - | factory=" | + | |
| - | pathname=" | + | |
| - | </ | + | |
| - | <Service name=" | + | |
| - | < | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | < | + | |
| - | | + | |
| - | | + | |
| - | < | + | |
| - | | + | |
| - | | + | |
| - | < | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | <Engine name=" | + | |
| - | <Valve className=" | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | <Realm className=" | + | |
| - | | + | |
| - | <Host name=" | + | |
| - | </Host> | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | ==== Lasttest ==== | + | |
| - | + | ||
| - | sudo apt-get install apache2-utils | + | |
| - | + | ||
| - | Erzeugung von statischen Dateien | + | |
| - | cd webapps | + | |
| - | mkdir last | + | |
| - | cd last | + | |
| - | dd if=/ | + | |
| - | dd if=/ | + | |
| - | dd if=/ | + | |
| - | dd if=/ | + | |
| - | dd if=/ | + | |
| - | + | ||
| - | Ausführen der Test mit ab einer Testserie mit 5, | + | |
| - | ab -c 5 -n 50000 -k http:// | + | |
| - | ab -c 10 -n 50000 -k http:// | + | |
| - | ... | + | |
| - | + | ||
| - | Ausführung eines Tests | + | |
| - | < | + | |
| - | cd workshop/node74 | + | |
| - | mkdir stat | + | |
| - | vi last.sh | + | |
| - | chmod 750 last.sh | + | |
| - | </ | + | |
| - | '' | + | |
| - | < | + | |
| - | #!/bin/sh | + | |
| - | _host=localhost | + | |
| - | mkdir -p stat | + | |
| - | req=50000 | + | |
| - | for port in 7380 7381 7382 7383 ; do \ | + | |
| - | for con in 25 50 100 250 500; 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 \ | + | |
| - | | + | |
| - | done ; | + | |
| - | done ; | + | |
| - | done ; | + | |
| - | done | + | |
| - | </ | + | |
| - | + | ||
| - | Beispielskript zur Erzeugung einer .csv Datei mit den Ergebnissen: | + | |
| - | < | + | |
| - | # | + | |
| - | + | ||
| - | req=50000 | + | |
| - | ip=192.168.1.232 | + | |
| - | function fetchfile { | + | |
| - | echo -n " | + | |
| - | for datei in 8 25 64 100 250; do \ | + | |
| - | sleep 1 | + | |
| - | var=`ab -c ${con} | + | |
| - | val=`echo $var|cut -f 4,8 -d ' '|sed 's/ / | + | |
| - | echo -n " | + | |
| - | done; | + | |
| - | echo " " >> stat/ | + | |
| - | } | + | |
| - | for con in 25 50 200 500; do \ | + | |
| - | echo " | + | |
| - | for port in 3280 3281 3282 3283 80 81; do \ | + | |
| - | case " | + | |
| - | 3280) | + | |
| - | fetchfile ${con} ${port} | + | |
| - | ;; | + | |
| - | 3281) | + | |
| - | fetchfile ${con} ${port} | + | |
| - | ;; | + | |
| - | 3282) | + | |
| - | fetchfile ${con} ${port} | + | |
| - | ;; | + | |
| - | 3283) | + | |
| - | fetchfile ${con} ${port} | + | |
| - | ;; | + | |
| - | esac | + | |
| - | done; | + | |
| - | done; | + | |
| - | </ | + | |
| - | + | ||
| - | Beispielskript zur Erzeugung von ascii-Tabelle mit den Ergebnissen: | + | |
| - | < | + | |
| - | # | + | |
| - | + | ||
| - | prefix=73 | + | |
| - | ip=192.168.1.229 | + | |
| - | ports=" | + | |
| - | req=50000 | + | |
| - | cons=" | + | |
| - | files=" | + | |
| - | + | ||
| - | function doFile { | + | |
| - | echo -e -n " (port: $2): | + | |
| - | + | ||
| - | for file in $5 ; do \ | + | |
| - | | + | |
| - | | + | |
| - | if [ " | + | |
| - | | + | |
| - | echo -e -n "\t | failed\t" | + | |
| - | elif [ " | + | |
| - | | + | |
| - | echo -e -n "\t | $values\t" | + | |
| - | | + | |
| - | echo -e -n "\t | $values" | + | |
| - | fi | + | |
| - | sleep 1 | + | |
| - | done ; | + | |
| - | echo " " | + | |
| - | } | + | |
| - | + | ||
| - | for con in $cons; do \ | + | |
| - | echo -e -n " | + | |
| - | for f in $files ; do \ | + | |
| - | echo -e -n " | ${f}k(req\\s / 99%)\t" | + | |
| - | done ; | + | |
| - | echo " " | + | |
| - | echo -n " | + | |
| - | for f in $files ; do \ | + | |
| - | echo -n " + ---------------------" | + | |
| - | done ; | + | |
| - | echo " " | + | |
| - | + | ||
| - | for port in $ports ; do \ | + | |
| - | case " | + | |
| - | ${prefix}81) | + | |
| - | echo -n "bio " | + | |
| - | doFile $ip $port $req $con " | + | |
| - | ;; | + | |
| - | ${prefix}80) | + | |
| - | echo -n "nio " | + | |
| - | doFile $ip $port $req $con " | + | |
| - | ;; | + | |
| - | ${prefix}82) | + | |
| - | echo -n "nio2 " | + | |
| - | doFile $ip $port $req $con " | + | |
| - | ;; | + | |
| - | ${prefix}83) | + | |
| - | echo -n "apr " | + | |
| - | doFile $ip $port $req $con " | + | |
| - | ;; | + | |
| - | *) | + | |
| - | echo -n "unk " | + | |
| - | doFile $ip $port $req $con " | + | |
| - | | + | |
| - | done ; | + | |
| - | echo " " | + | |
| - | done | + | |
| - | </ | + | |
| - | + | ||
| - | Auswertung der Dateien | + | |
| - | < | + | |
| - | cd stat | + | |
| - | find . -exec grep -H " | + | |
| - | </ | + | |
| - | + | ||
| - | * http:// | + | |
| - | * http:// | + | |
| - | * http:// | + | |
| - | + | ||
| - | Start visualVM remote | + | |
| - | < | + | |
| - | ssh -X nutzer18@192.168.1.218 | + | |
| - | jvisualvm --jdkhome / | + | |
| - | </ | + | |
| - | + | ||
| - | gnuplot | + | |
| - | + | ||
| - | http:// | + | |
| - | + | ||
| - | sudo -i | + | |
| - | vi / | + | |
| - | sudo apt-get update | + | |
| - | sudo apt-get install gnuplot | + | |
| - | vi plot.p | + | |
| - | ab -c 5 -n 50000 -g data.dat http:// | + | |
| - | + | ||
| - | ''/ | + | |
| - | < | + | |
| - | deb [arch=amd64] http:// | + | |
| - | deb [arch=amd64] http:// | + | |
| - | deb [arch=amd64] http:// | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | #output as png image | + | |
| - | set terminal png | + | |
| - | + | ||
| - | #save file to " | + | |
| - | set output " | + | |
| - | + | ||
| - | #graph title | + | |
| - | set title "ab -n 50000 -c 5" | + | |
| - | + | ||
| - | #nicer aspect ratio for image size | + | |
| - | set size 1,0.7 | + | |
| - | + | ||
| - | # y-axis grid | + | |
| - | set grid y | + | |
| - | + | ||
| - | #x-axis label | + | |
| - | set xlabel " | + | |
| - | + | ||
| - | #y-axis label | + | |
| - | set ylabel " | + | |
| - | + | ||
| - | #plot data from " | + | |
| - | #and title of " | + | |
| - | plot " | + | |
| - | </ | + | |
| - | + | ||
| - | gnuplot < | + | |
| - | ls -l data.* | + | |
| - | -rw-rw-r-- 1 nutzer31 nutzer31 2200170 Sep 3 17:47 data.dat | + | |
| - | -rw-rw-r-- 1 nutzer31 nutzer31 | + | |
| - | + | ||
| - | ==== APR Connector bereitstellen ==== | + | |
| - | + | ||
| - | sudo aptitude install libapr1-dev | + | |
| - | sudo aptitude install libssl-dev | + | |
| - | cd apache-tomcat-6.0.33/ | + | |
| - | cp tomcat-native.tar.gz ../.. | + | |
| - | cd ../.. | + | |
| - | tar xzf tomcat-native.tar.gz | + | |
| - | cd tomcat-native-1.1.20-src/ | + | |
| - | ./configure --with-apr=/ | + | |
| - | make | + | |
| - | make install | + | |
| - | cd ../ | + | |
| - | + | ||
| - | Ubuntu 14.04 | + | |
| - | sudo apt-get install libapr1-dev | + | |
| - | sudo apt-get install libssl-dev | + | |
| - | cd ~/ | + | |
| - | tar xzf tomcat-native.tar.gz | + | |
| - | cd tomcat-native-1.1.31-src/ | + | |
| - | ./configure --with-apr=/ | + | |
| - | make | + | |
| - | make install | + | |
| - | cd ../ | + | |
| - | + | ||
| - | Ubuntu 14.04 (java 8 und tomcat 8) | + | |
| - | sudo apt-get install libapr1-dev | + | |
| - | sudo apt-get install libssl-dev | + | |
| - | cd ~/ | + | |
| - | tar xzf tomcat-native.tar.gz | + | |
| - | cd tomcat-native-1.2.4-src/ | + | |
| - | # | + | |
| - | ./configure --with-apr=/ | + | |
| - | make | + | |
| - | make install | + | |
| - | cd ../ | + | |
| - | + | ||
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <Server ... | + | |
| - | < | + | |
| - | <!-- | + | |
| - | < | + | |
| - | --> | + | |
| - | + | ||
| - | <Service ... | + | |
| - | + | ||
| - | < | + | |
| - | | + | |
| - | + | ||
| - | < | + | |
| - | | + | |
| - | + | ||
| - | < | + | |
| - | | + | |
| - | + | ||
| - | <Engine ... | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | export CATALINA_HOME=/ | + | |
| - | export LD_LIBRARY_PATH=${CATALINA_HOME}/ | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | + | ||
| - | === Bereitstellung vieler File Pointer === | + | |
| - | + | ||
| - | ''/ | + | |
| - | < | + | |
| - | ... | + | |
| - | * soft nofile 1024 | + | |
| - | * hard nofile 20000 | + | |
| - | ... | + | |
| - | </ | + | |
| - | + | ||
| - | In der **'' | + | |
| - | < | + | |
| - | ulimit -n 20000 | + | |
| - | echo 20000 > / | + | |
| - | </ | + | |
| - | + | ||
| - | ''/ | + | |
| - | < | + | |
| - | fs.file-max = 20000 | + | |
| - | </ | + | |
| - | + | ||
| - | Es sollte in ''/ | + | |
| - | < | + | |
| - | ulimit - n 20000 | + | |
| - | </ | + | |
| - | + | ||
| - | === Erzeugen eines HTTPS Connetors mit APR/OpenSSL === | + | |
| - | + | ||
| - | < | + | |
| - | cd node73/ | + | |
| - | openssl genrsa -des3 -out tomcatkey.pem 2048 | + | |
| - | </ | + | |
| - | Eingabe des Password " | + | |
| - | + | ||
| - | < | + | |
| - | openssl req -new -x509 -key tomcatkey.pem -out tomcatcert.pem -days 1095 | + | |
| - | </ | + | |
| - | + | ||
| - | Anlage der Zertifikatsinformationen (Common Name sollte der Name des Rechners sein!) | + | |
| - | < | + | |
| - | #Eingabe | + | |
| - | Country Name (2 letter code) [AU]:DE | + | |
| - | State or Province Name (full name) [Some-State]: | + | |
| - | Locality Name (eg, city) []:Bochum | + | |
| - | Organization Name (eg, company) [Internet Widgits Pty Ltd]: | + | |
| - | Organizational Unit Name (eg, section) []: | + | |
| - | Common Name (eg, YOUR name) []: | + | |
| - | Email Address []: | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <Server ... | + | |
| - | | + | |
| - | + | ||
| - | <Service ... | + | |
| - | <!-- Define a SSL HTTP/1.1 Connector on port xx43 --> | + | |
| - | + | ||
| - | < | + | |
| - | executor=" | + | |
| - | protocol=" | + | |
| - | scheme=" | + | |
| - | secure=" | + | |
| - | sslProtocol=" | + | |
| - | SSLEnabled=" | + | |
| - | SSLCertificateFile=" | + | |
| - | SSLCertificateKeyFile=" | + | |
| - | SSLPassword=" | + | |
| - | /> | + | |
| - | </ | + | |
| - | + | ||
| - | Zugang via SSL zum Tomcat mit openssl | + | |
| - | < | + | |
| - | | + | |
| - | </ | + | |
| - | * http:// | + | |
| - | + | ||
| - | < | + | |
| - | + | ||
| - | GET / | + | |
| - | + | ||
| - | HTTP/1.1 200 OK | + | |
| - | Server: Apache-Coyote/ | + | |
| - | Set-Cookie: JSESSIONID=3035FA551AD683F6939EDFA7A2CCE3D5.node73; | + | |
| - | Content-Type: | + | |
| - | Content-Length: | + | |
| - | Date: Thu, 13 Sep 2012 10:50:02 GMT | + | |
| - | Connection: close | + | |
| - | + | ||
| - | Hello LinuxHotel! | + | |
| - | </ | + | |
| - | + | ||
| - | Access https via url | + | |
| - | < | + | |
| - | curl --insecure https:// | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | # | + | |
| - | K=10; | + | |
| - | HTTPSA=' | + | |
| - | date +%M-%S-%N> | + | |
| - | for (( c=1; c<=$K; c++ )) | + | |
| - | do | + | |
| - | curl --insecure --silent $HTTPSA >/ | + | |
| - | done | + | |
| - | date +%M-%S-%N>> | + | |
| - | </ | + | |
| - | ===== JSSE SSL ===== | + | |
| - | < | + | |
| - | keytool -keystore keystore -genkey -alias tomcat -keyalg RSA | + | |
| - | </ | + | |
| - | + | ||
| - | - Bitte als Password changeit wählen | + | |
| - | - Als CN bzw. "Vor- und Nachname" | + | |
| - | - Beispieleingabe | + | |
| - | < | + | |
| - | Neues Kennwort erneut eingeben: | + | |
| - | Wie lautet Ihr Vor- und Nachname? | + | |
| - | [Unknown]: | + | |
| - | Wie lautet der Name Ihrer organisatorischen Einheit? | + | |
| - | [Unknown]: | + | |
| - | Wie lautet der Name Ihrer Organisation? | + | |
| - | [Unknown]: | + | |
| - | Wie lautet der Name Ihrer Stadt oder Gemeinde? | + | |
| - | [Unknown]: | + | |
| - | Wie lautet der Name Ihres Bundeslands? | + | |
| - | [Unknown]: | + | |
| - | Wie lautet der Ländercode (zwei Buchstaben) für diese Einheit? | + | |
| - | [Unknown]: | + | |
| - | Ist CN=localhost, | + | |
| - | [Nein]: | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | + | ||
| - | < | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | </ | + | |
| - | + | ||
| - | Aufruf | + | |
| - | < | + | |
| - | https:// | + | |
| - | </ | + | |
| - | + | ||
| - | Selfsign Cert mit eignem Ablaufdatum von 360 Tagen | + | |
| - | < | + | |
| - | keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048 | + | |
| - | </ | + | |
| - | + | ||
| - | Links | + | |
| - | * Tomcat SSL: | + | |
| - | * Java Keytool: http:// | + | |
| - | * Tutorial: | + | |
| - | * Beispiel eines Anbieters: https:// | + | |
| - | + | ||
| - | ===== Tomcat Tuning ===== | + | |
| - | {{: | + | |
| - | + | ||
| - | Bild Source | + | |
| - | {{: | + | |
| - | + | ||
| - | Thread Pools: | + | |
| - | * http:// | + | |
| - | + | ||
| - | Connectoren | + | |
| - | * http:// | + | |
| - | * http:// | + | |
| - | * http:// | + | |
| - | * http:// | + | |
| - | * http:// | + | |
| - | ===== Tomcat JSPC ===== | + | |
| - | + | ||
| - | Download des Packet TomcatDeployer (apache-tomcat-6.0.35-deployer.tar.gz) | + | |
| - | http:// | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | url=http:// | + | |
| - | username=manager | + | |
| - | password=tomcat | + | |
| - | webapp=/ | + | |
| - | path=/ | + | |
| - | </ | + | |
| - | + | ||
| - | * ant | + | |
| - | * ant deploy | + | |
| - | + | ||
| - | Eine neue Anwendung mit vorkompilierten JSP befindet sich in der Instanz node74. | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | ===== Monitoring ===== | + | |
| - | + | ||
| - | Tomcat Manager API | + | |
| - | + | ||
| - | [[http:// | + | |
| - | + | ||
| - | Alle MBeans | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | Ein Mbean | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | OK - Number of results: 1 | + | |
| - | + | ||
| - | Name: tomcat.jdbc: | + | |
| - | modelerType: | + | |
| - | 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/ | + | |
| - | DefaultTransactionIsolation: | + | |
| - | DriverClassName: | + | |
| - | MaxIdle: 10 | + | |
| - | MinIdle: 10 | + | |
| - | InitialSize: | + | |
| - | MaxWait: 15000 | + | |
| - | TestOnBorrow: | + | |
| - | TestOnReturn: | + | |
| - | TestOnConnect: | + | |
| - | TimeBetweenEvictionRunsMillis: | + | |
| - | NumTestsPerEvictionRun: | + | |
| - | MinEvictableIdleTimeMillis: | + | |
| - | TestWhileIdle: | + | |
| - | Url: jdbc: | + | |
| - | ValidationQuery: | + | |
| - | ValidationInterval: | + | |
| - | AccessToUnderlyingConnectionAllowed: | + | |
| - | RemoveAbandoned: | + | |
| - | RemoveAbandonedTimeout: | + | |
| - | LogAbandoned: | + | |
| - | DbProperties: | + | |
| - | JdbcInterceptors: | + | |
| - | JmxEnabled: true | + | |
| - | FairQueue: true | + | |
| - | UseEquals: true | + | |
| - | AbandonWhenPercentageFull: | + | |
| - | UseLock: false | + | |
| - | SuspectTimeout: | + | |
| - | AlternateUsernameAllowed: | + | |
| - | CommitOnReturn: | + | |
| - | RollbackOnReturn: | + | |
| - | UseDisposableConnectionFacade: | + | |
| - | LogValidationErrors: | + | |
| - | PropagateInterruptState: | + | |
| - | PoolName: Tomcat Connection Pool[1-219730313] | + | |
| - | JdbcInterceptorsAsArray: | + | |
| - | 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: | + | |
| - | </ | + | |
| - | + | ||
| - | Anfrage an ein Attribute | + | |
| - | < | + | |
| - | </ | + | |
| - | Result | + | |
| - | < | + | |
| - | OK - Attribute get ' | + | |
| - | </ | + | |
| - | + | ||
| - | Holte Anzahl der Busy Thread vom HTTP Connector | + | |
| - | < | + | |
| - | curl -X GET -u manager: | + | |
| - | </ | + | |
| - | Ausgabe | + | |
| - | < | + | |
| - | OK - Attribute get ' | + | |
| - | </ | + | |
| - | ==== psi-probe ==== | + | |
| - | http:// | + | |
| - | + | ||
| - | * 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: | + | |
| - | '' | + | |
| - | < | + | |
| - | export CATALINA_OPTS=" | + | |
| - | </ | + | |
| - | + | ||
| - | Weitere Parameter | + | |
| - | http:// | + | |
| - | + | ||
| - | Hat auch nicht geklappt! | + | |
| - | '' | + | |
| - | <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.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 | + | |
| - | < | + | |
| - | cd / | + | |
| - | javac -cp ~/ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <web-app ..> | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | ... | + | |
| - | </ | + | |
| - | </ | + | |
| - | ==== javamelody ==== | + | |
| - | * Download und javamelody.zip auspacken | + | |
| - | https:// | + | |
| - | + | ||
| - | Installation in eine Anwendung. | + | |
| - | < | + | |
| - | cd workshop | + | |
| - | wget http:// | + | |
| - | mkdir javamelody-1.29.0-src | + | |
| - | cd javamelody-1.29.0-src | + | |
| - | unzip ../ | + | |
| - | mkdir ../ | + | |
| - | cp javamelody.jar ../ | + | |
| - | cp jrobin-1.5.9.1.jar ../ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | <!-- if SSL enabled (SSL and certificate must then be configured in the server) | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | --> | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | Add User to Realm Database | + | |
| - | '' | + | |
| - | < | + | |
| - | <role rolename=" | + | |
| - | <user username=" | + | |
| - | </ | + | |
| - | + | ||
| - | evtl. restart des Servers oder Reload der Anwendung.. | + | |
| - | Zugriff auf die Monitoring-Informationen | + | |
| - | < | + | |
| - | http:// | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | 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/ | + | |
| - | + | ||
| - | 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. | + | |
| - | < | + | |
| - | cd node74 | + | |
| - | mkdir plugin | + | |
| - | cp XXX/ | + | |
| - | cp jrobin-1.5.9.1.jar plugins | + | |
| - | cd webapps/ | + | |
| - | vi META-INF/ | + | |
| - | </ | + | |
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | <Loader className=" | + | |
| - | virtualClasspath=" | + | |
| - | /> | + | |
| </ | </ | ||
| </ | </ | ||
| - | Es ist darauf zu achten, das < | + | ==== 3.8 - LDAP Realm ==== |
| - | absoluten Reihenfolgen von Fragments JavaMelody enthalten ist. | + | |
| < | < | ||
| - | 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 | + | |
| + | roleName=" | ||
| + | roleSearch=" | ||
| + | | ||
| </ | </ | ||
| - | '' | + | ===== Tag 4 ===== |
| - | < | + | |
| - | < | + | |
| - | xmlns:xsi=" | + | |
| - | xsi: | + | |
| - | version=" | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | ||
| - | </ | ||
| - | Explizites einbinden | + | ===== Tag 5 ===== |
| - | '' | + | |
| - | < | + | |
| - | <web-app xmlns=" | + | |
| - | xmlns:xsi=" | + | |
| - | xsi: | + | |
| - | http:// | + | |
| - | version=" | + | |
| - | metadata-complete=" | + | |
| - | + | ==== 5.1 - docker | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | <!-- only use JavaMelody --> | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | ==== 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:// | + | |
| - | https:// | + | |
| - | + | ||
| - | download linux 64 bit binary | + | |
| < | < | ||
| - | cp jmx4prometheus.json node73/ | + | FROM alpine:3.15 |
| - | cp -r prom node73/ | + | |
| - | node73/ | + | |
| - | ./ | + | |
| - | </ | + | |
| - | open localhost: | + | #### OpenJDK 17 |
| + | RUN apk update | ||
| + | RUN apk add openjdk17-jre-headless | ||
| + | ENV JAVA_HOME | ||
| - | '' | + | #### tcnative |
| + | #ENV TCNATIVE 1.2.33 | ||
| + | #RUN apk add openjdk17-jdk apr-dev openssl-dev gcc make musl-dev | ||
| + | #RUN wget -O / | ||
| + | # cd /tmp; \ | ||
| + | # tar -zxf tomcat-native-${TCNATIVE}-src.tar.gz; | ||
| + | # cd tomcat-native-${TCNATIVE}-src/ | ||
| + | # ./configure --prefix=/ | ||
| + | # make; \ | ||
| + | # make install; \ | ||
| + | # cd /tmp; \ | ||
| + | # rm -rf / | ||
| - | < | + | #### tomcat |
| - | # Global default settings. | + | ENV TOMCATVERSION 10.0.20 |
| - | global: { | + | ENV INSTANCENAME workshop |
| - | | + | ENV TOMCATDIR / |
| - | | + | ENV WARFILE workshop.war |
| + | ENV APPVERSION 3.1.0 | ||
| + | ENV CATALINA_HOME ${TOMCATDIR}/ | ||
| + | ENV CATALINA_BASE ${TOMCATDIR}/ | ||
| + | ENV CATALINA_VAR / | ||
| + | ENV PATH $CATALINA_HOME/ | ||
| + | ENV TCUSER tcrun | ||
| + | ENV TCGROUP tcgroup | ||
| - | | + | # create CATALINA_HOME |
| - | | + | RUN mkdir -p "${TOMCATDIR}/ |
| - | | + | cd ${TOMCATDIR}/ |
| - | name: " | + | wget -O / |
| - | value: " | + | |
| - | } | + | rm / |
| - | | + | |
| - | } | + | |
| - | # A job definition containing exactly one endpoint to scrape: Prometheus itself. | + | # create CATALINA_BASE |
| - | job: { | + | COPY ${INSTANCENAME}.tar / |
| - | | + | RUN mkdir -p ${TOMCATDIR}/ |
| - | | + | |
| - | # Override the global default and scrape targets from this job every 5 seconds. | + | |
| - | | + | |
| - | | + | # create CATALINA_VAR |
| - | # case, only one. | + | RUN mkdir -p / |
| - | | + | |
| - | # These endpoints are scraped via HTTP. | + | |
| - | target: "http://localhost: | + | |
| - | | + | |
| - | } | + | |
| - | job: { | + | # create webappdir |
| - | name: " | + | RUN mkdir -p / |
| - | scrape_interval: | + | COPY $WARFILE |
| - | target_group: | + | |
| - | labels: { | + | |
| - | label: { | + | |
| - | name: " | + | |
| - | value: " | + | |
| - | | + | |
| - | label: | + | |
| - | name: " | + | |
| - | value: " | + | |
| - | | + | |
| - | } | + | |
| - | target: "http://127.0.0.1: | + | |
| - | | + | |
| - | } | + | |
| - | </file> | + | |
| + | # create runtime user and change rights | ||
| + | RUN addgroup $TCGROUP; \ | ||
| + | adduser -h /opt/tomcat -H -G $TCGROUP -s /bin/sh -D $TCUSER; \ | ||
| + | chown -R $TCUSER: | ||
| + | chown -R $TCUSER: | ||
| + | chown -R $TCUSER: | ||
| - | jmx4prometheus.conf | + | WORKDIR |
| - | < | + | EXPOSE 8080 8443 |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | }, | + | |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | }, | + | |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | }, | + | |
| - | { | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | " | + | |
| - | }, | + | |
| - | ] | + | |
| - | } | + | |
| - | </ | + | |
| - | More | + | USER $TCUSER |
| - | * https:// | + | CMD [" |
| - | * https:// | + | |
| - | * http:// | + | |
| - | * https:// | + | |
| - | * https:// | + | |
| - | ===== 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), | + | |
| - | insert into nutzer values ("Nutzer01", | + | |
| - | quit | + | |
| - | + | ||
| - | Im Dialog ein Password setzen. (tomcat) | + | |
| - | + | ||
| - | Laden des MYSQL Treibers | + | |
| - | http:// | + | |
| - | + | ||
| - | evtl. scp mysql-connector-java-5.1.17.zip nutzer24@notebook24:/ | + | |
| - | + | ||
| - | * Kopieren des Treibers nach workshop/ | + | |
| - | + | ||
| - | unzip mysql-connector-java-5.1.17.zip | + | |
| - | cd mysql-connector-java-5.1.17 | + | |
| - | mkdir -p ../ | + | |
| - | cp mysql-connector-java-5.1.17-bin.jar ../ | + | |
| - | + | ||
| - | Definition einer DB-Ressource im Tomcat | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | ... | + | |
| - | < | + | |
| - | type=" | + | |
| - | driverClassName=" | + | |
| - | url=" | + | |
| - | username=" | + | |
| - | password=" | + | |
| - | maxActive=" | + | |
| - | maxIdle=" | + | |
| - | maxWait=" | + | |
| - | removeAbandoned=" | + | |
| - | validationQuery=" | + | |
| - | testOnBorrow=" | + | |
| - | testWhileIdle=" | + | |
| - | timeBetweenEvictionRunsMillis=" | + | |
| - | minEvictableIdleTimeMillis=" | + | |
| - | /> | + | |
| - | ... | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | Tomcat 8 DBCP 2 | + | |
| - | + | ||
| - | '' | + | |
| - | + | ||
| - | < | + | |
| - | < | + | |
| - | ... | + | |
| - | < | + | |
| - | type=" | + | |
| - | driverClassName=" | + | |
| - | url=" | + | |
| - | username=" | + | |
| - | password="" | + | |
| - | maxTotal=" | + | |
| - | maxIdle=" | + | |
| - | maxWaitMillis=" | + | |
| - | removeAbandonedOnBorrow=" | + | |
| - | removeAbandonedOnMaintenance=" | + | |
| - | validationQuery=" | + | |
| - | testOnBorrow=" | + | |
| - | testWhileIdle=" | + | |
| - | timeBetweenEvictionRunsMillis=" | + | |
| - | minEvictableIdleTimeMillis=" | + | |
| - | /> | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | Anlage einer Anwendung die die Ressource nutzt | + | |
| - | + | ||
| - | cd node74/ | + | |
| - | mkdir nutzer | + | |
| - | mkdir nutzer/ | + | |
| - | mkdir nutzer/ | + | |
| - | cd nutzer | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <%@ page import=" | + | |
| - | <% | + | |
| - | InitialContext initCtx = new InitialContext() ; | + | |
| - | Context envCtx = (Context)initCtx.lookup(" | + | |
| - | DataSource datasource = | + | |
| - | | + | |
| - | Connection con = null; | + | |
| - | Statement stmt = null ; | + | |
| - | ResultSet srs = null; | + | |
| - | + | ||
| - | try { | + | |
| - | con = datasource.getConnection(); | + | |
| - | stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, | + | |
| - | | + | |
| - | srs = stmt.executeQuery( | + | |
| - | " | + | |
| - | while (srs.next()) { | + | |
| - | String firstName = srs.getString(" | + | |
| - | String lastName = srs.getString(" | + | |
| - | out.println(firstName + " | + | |
| - | } | + | |
| - | } finally { | + | |
| - | if(srs != null) srs.close(); | + | |
| - | if(stmt != null) stmt.close(); | + | |
| - | if(con != null) con.close(); | + | |
| - | } | + | |
| - | %> | + | |
| - | </ | + | |
| - | + | ||
| - | Test der Anwendung | + | |
| - | node74/ | + | |
| - | cp apache-tomcat-6.0.32/ | + | |
| - | node74/ | + | |
| - | http:// | + | |
| - | + | ||
| - | '' | + | |
| - | < | + | |
| - | <%@ page import="javax.sql.*,javax.naming.*, | + | |
| - | < | + | |
| - | < | + | |
| - | < | + | |
| - | <% | + | |
| - | InitialContext initCtx = new InitialContext() ; | + | |
| - | Context envCtx = (Context)initCtx.lookup(" | + | |
| - | DataSource datasource = | + | |
| - | | + | |
| - | Connection con = null; | + | |
| - | Statement stmt = null ; | + | |
| - | + | ||
| - | try { | + | |
| - | con = datasource.getConnection(); | + | |
| - | stmt = con.createStatement(); | + | |
| - | for(int i = 0; i < 100; i++) | + | |
| - | { | + | |
| - | String name = " | + | |
| - | stmt.executeUpdate( | + | |
| - | " | + | |
| - | out.println(" | + | |
| - | } | + | |
| - | } finally { | + | |
| - | if(stmt != null) stmt.close(); | + | |
| - | if(con != null) con.close(); | + | |
| - | } | + | |
| - | %> | + | |
| - | </ | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | restart mysql | + | |
| - | < | + | |
| - | sudo service mysql stop | + | |
| - | sudo service mysql start | + | |
| </ | </ | ||
| - | * [[http:// | + | ==== 5.3 - einfacher Proxy ==== |
| - | * [[http:// | + | |
| - | * [[http:// | + | |
| - | + | ||
| - | Zugriff mit TagLib (schööönnn) | + | |
| < | < | ||
| - | cd ~/workshop/node73 | + | < |
| - | mkdir -p webapps/nutzer/WEB-INF/lib | + | ProxyPass |
| - | cp ../apache-tomcat/webapps/examples/ | + | |
| - | webapps/nutzer/ | + | |
| - | # create taglibs examples with | + | ProxyPreserveHost On |
| - | # vi webapps/ | + | </VirtualHost> |
| - | bin/ | + | |
| - | curl -sL http://127.0.0.1:7380/nutzer/db.jsp | + | |
| </ | </ | ||
| - | '' | + | ==== 5.6 - Monitoring ==== |
| - | < | ||
| - | <%@ taglib uri=" | ||
| - | <%@ taglib uri=" | ||
| - | |||
| - | < | ||
| - | SELECT firstname, lastname FROM nutzer | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | < | ||
| - | |||
| - | < | ||
| - | <table border=" | ||
| - | <tr> < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | Parameter für Profile und Slow Query Detection | ||
| < | < | ||
| - | | + | |
| - | | + | <Location |
| - | | + | |
| - | url="jdbc: | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | maxIdle=" | + | |
| - | maxWait=" | + | </Location> |
| - | | + | |
| - | validationQuery=" | + | |
| - | testOnBorrow=" | + | |
| - | testWhileIdle=" | + | |
| - | timeBetweenEvictionRunsMillis=" | + | |
| - | minEvictableIdleTimeMillis=" | + | |
| - | | + | |
| </ | </ | ||
| - | Result | ||
| - | < | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [FETCH] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [FETCH] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [SLOW QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | Thu Sep 13 15:19:03 CEST 2012 INFO: Profiler Event: [QUERY] at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java: | ||
| - | </ | ||
| - | < | ||
| - | 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 | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | < | ||
| - | factory=" | ||
| - | type=" | ||
| - | driverClassName=" | ||
| - | url=" | ||
| - | username=" | ||
| - | password=" | ||
| - | maxActive=" | ||
| - | maxIdle=" | ||
| - | maxWait=" | ||
| - | removeAbandoned=" | ||
| - | validationQuery=" | ||
| - | testOnBorrow=" | ||
| - | testWhileIdle=" | ||
| - | timeBetweenEvictionRunsMillis=" | ||
| - | minEvictableIdleTimeMillis=" | ||
| - | jmxEnabled=" | ||
| - | jdbcInterceptors=" | ||
| - | /> | ||
| - | |||
| - | </ | ||
| - | ===== Cluster Replikation ===== | ||
| - | |||
| - | 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, | ||
| - | |||
| - | node84/ | ||
| - | node94/ | ||
| - | |||
| - | export CATALINA_OPTS=" | ||
| - | |||
| - | node85/ | ||
| - | node95/ | ||
| - | |||
| - | export CATALINA_OPTS=" | ||
| - | |||
| - | '' | ||
| - | Einfache Konfiguration | ||
| - | < | ||
| - | <Engine ... | ||
| - | |||
| - | <Cluster className=" | ||
| - | <Channel className=" | ||
| - | < | ||
| - | | ||
| - | /> | ||
| - | < | ||
| - | className=" | ||
| - | maxThreads=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | |||
| - | < | ||
| - | < | ||
| - | ... | ||
| - | <Cluster className=" | ||
| - | | ||
| - | < | ||
| - | < | ||
| - | address=" | ||
| - | port=" | ||
| - | frequency=" | ||
| - | dropTime=" | ||
| - | </ | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | </ | ||
| - | |||
| - | ''/ | ||
| - | < | ||
| - | JKWorkerProperty worker.list=loadbalancer, | ||
| - | |||
| - | 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, | ||
| - | |||
| - | JKWorkerProperty worker.jkstatus.type=status | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | ... | ||
| - | < | ||
| - | executor=" | ||
| - | protocol=" | ||
| - | requiredSecret=" | ||
| - | ... | ||
| - | </ | ||
| - | ''/ | ||
| - | < | ||
| - | JkMount / | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | sudo apache2clt restart | ||
| - | cd workshop/ | ||
| - | node84/ | ||
| - | node94/ | ||
| - | node85/ | ||
| - | node95/ | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | wget http:// | ||
| - | cp ClusterTest.war node84/ | ||
| - | cp ClusterTest.war node94/ | ||
| - | cp ClusterTest.war node85/ | ||
| - | cp ClusterTest.war node95/ | ||
| - | </ | ||
| - | |||
| - | Deployment der ClusterTest.war von der CD. | ||
| - | Durchstarten der beiden Instanzen hintereinander mit einer kleinen Wartezeit 10sec - 1Min. | ||
| - | |||
| - | < | ||
| - | node84/ | ||
| - | node94/ | ||
| - | node85/ | ||
| - | node95/ | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | < | ||
| - | <?xml version=' | ||
| - | <Server port=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | |||
| - | < | ||
| - | < | ||
| - | auth=" | ||
| - | type=" | ||
| - | description=" | ||
| - | factory=" | ||
| - | pathname=" | ||
| - | readonly=" | ||
| - | < | ||
| - | factory=" | ||
| - | type=" | ||
| - | driverClassName=" | ||
| - | url=" | ||
| - | username=" | ||
| - | password=" | ||
| - | maxActive=" | ||
| - | maxIdle=" | ||
| - | maxWait=" | ||
| - | removeAbandoned=" | ||
| - | validationQuery=" | ||
| - | testOnBorrow=" | ||
| - | testWhileIdle=" | ||
| - | timeBetweenEvictionRunsMillis=" | ||
| - | minEvictableIdleTimeMillis=" | ||
| - | jmxEnabled=" | ||
| - | jdbcInterceptors=" | ||
| - | org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer; | ||
| - | /> | ||
| - | <!-- | ||
| - | < | ||
| - | type=" | ||
| - | driverClassName=" | ||
| - | url=" | ||
| - | username=" | ||
| - | password=" | ||
| - | maxActive=" | ||
| - | maxIdle=" | ||
| - | maxWait=" | ||
| - | removeAbandoned=" | ||
| - | validationQuery=" | ||
| - | testOnBorrow=" | ||
| - | testWhileIdle=" | ||
| - | timeBetweenEvictionRunsMillis=" | ||
| - | minEvictableIdleTimeMillis=" | ||
| - | /> | ||
| - | --> | ||
| - | </ | ||
| - | |||
| - | <Service name=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | |||
| - | < | ||
| - | executor=" | ||
| - | protocol=" | ||
| - | scheme=" | ||
| - | secure=" | ||
| - | sslProtocol=" | ||
| - | SSLEnabled=" | ||
| - | SSLCertificateFile=" | ||
| - | SSLCertificateKeyFile=" | ||
| - | SSLPassword=" | ||
| - | /> | ||
| - | <Engine name=" | ||
| - | <Realm className=" | ||
| - | | ||
| - | <Valve className=" | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | /> | ||
| - | <Cluster className=" | ||
| - | <Channel className=" | ||
| - | < | ||
| - | | ||
| - | /> | ||
| - | < | ||
| - | className=" | ||
| - | maxThreads=" | ||
| - | </ | ||
| - | </ | ||
| - | <Host name=" | ||
| - | unpackWARs=" | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | </ | ||
| - | ==== Static Member ==== | ||
| - | < | ||
| - | <Cluster channelSendOptions=" | ||
| - | < | ||
| - | expireSessionsOnShutdown=" | ||
| - | notifyListenersOnReplication=" | ||
| - | < | ||
| - | |||
| - | < | ||
| - | | ||
| - | | ||
| - | |||
| - | < | ||
| - | < | ||
| - | </ | ||
| - | < | ||
| - | className=" | ||
| - | maxThreads=" | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | <Member className=" | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | </ | ||
| - | < | ||
| - | </ | ||
| - | < | ||
| - | filter=" | ||
| - | < | ||
| - | </ | ||
| - | |||
| - | </ | ||
| - | |||
| - | < | ||
| - | 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 { | ||
| - | | ||
| - | | ||
| - | svc = (svc & (~Channel.MBR_TX_SEQ)); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | ===== Sicherheit ===== | ||
| - | * BSI Studie https:// | ||
| - | * Migrationsguide http:// | ||
| - | * Security Report http:// | ||
| - | * Security Manager und Tomcat http:// | ||
| - | * Tipps von Mulesoft https:// | ||
| - | |||
| - | Lösche Tomcat Version Numer in Fehlerreports des Tomcats | ||
| - | < | ||
| - | cd node74 | ||
| - | mkdir -p lib/ | ||
| - | vi lib/ | ||
| - | bin/ | ||
| - | </ | ||
| - | '' | ||
| < | < | ||
| - | server.info=Apache Tomcat | + | LogFormat "%h %l %u %t \" |
| - | server.number= | + | |
| - | server.built=Mar 7 2014 02:18:35 | + | |
| </ | </ | ||
tomcat_administration/start.1479715053.txt.gz · Zuletzt geändert: 2016/11/21 07:57 von marco.staub
