===== Vorraussetzung ===== [[apache]] ===== Einfache Paket Installation (NICHT NUTZEN) ===== WARNUNG: Hiermit bekommt man meist eine veraltete Version der mod_jk vom Distributor installiert! sudo apt-get install libapache2-mod-jk sudo apt-get remove libapache2-mod-jk Aktuell gibt es ein Problem mit den mod_jk Release >1.2.32 - Dort wird das shared Memory Segment für den Austausch der mod_jk state nicht mehr korrekt behandelt. (Aktivation, Stopp einzelner Worker klappt nicht!!) Mit diesem Patch und dem nächsten Release 1.2.38 wird das Problem behoben sein: http://marc.info/?t=137086793500004&r=1&w=2 http://svn.apache.org/viewvc?view=revision&revision=1354021 ===== Installation Apache httpd Development ===== sudo aptitude install apache2-dev -- evtl. apt-get install apache2-mpm-worker apt-get install apache2-threaded-dev ===== Installation aus Quellen ===== cd ~/workshop wget http://192.168.1.171:2280/downloads/TomcatContributions_files/tomcat-connectors-1.2.40-src.tar.gz tar xzf tomcat-connectors-1.2.40-src.tar.gz cd tomcat-connectors-1.2.40-src/native dpkg -S apxs | grep bin/ ./configure --with-apxs=/usr/bin/apxs2 make sudo make install sudo -i ===== Konfiguration Apache ===== cd /etc/apache2 ''mods-available/jk.load'' : LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so ''mods-available/jk.conf'' JkShmFile "/var/log/apache2/mod_jk.shm" JkLogFile "/var/log/apache2/mod_jk.log" JkLogLevel info JKWorkerProperty worker.list=loadbalancer,jkstatus JKWorkerProperty worker.node73.port=7309 JKWorkerProperty worker.node73.host=localhost JKWorkerProperty worker.node73.type=ajp13 JKWorkerProperty worker.loadbalancer.type=lb JKWorkerProperty worker.loadbalancer.balance_workers=node73 JKWorkerProperty worker.jkstatus.type=status ''sites-available/default'' : JkMount /jkstatus jkstatus JkMount /hello* loadbalancer a2enmod jk apache2ctl -M | grep jk apache2ctl restart firefox http://localhost/jkstatus ''workshop/node74/conf/server.xml'' Connector AJP Java IO Stack ===== jkstatus Seite absichern ===== ''sites-available/default'' : AuthType Basic AuthName "By Invitation Only" AuthBasicProvider file AuthUserFile /etc/apache2/passwords Require valid-user htpasswd -c /etc/apache2/passwords admin ===== Read Only status worker ===== ''mods-available/jk.conf'' : JKWorkerProperty worker.list=loadbalancer,jkstatus,jkread ... JKWorkerProperty worker.jkread.user=radmin JKWorkerProperty worker.jkread.type=status JkWorkerProperty worker.jkread.read_only=true ''sites-available/default'' : AuthType Basic AuthName "By Invitation Only" AuthBasicProvider file AuthUserFile /etc/apache2/passwords Require valid-user JkMount /jkread jkread ===== Neuen Tomcat Node einfügen ===== ''mods-available/jk.conf'' : JKWorkerProperty worker.node74.port=7409 JKWorkerProperty worker.node74.host=localhost JKWorkerProperty worker.node74.type=ajp13 .. JKWorkerProperty worker.loadbalancer.balance_workers=node73,node74 ''webapps/hello/id.jsp'' : <%=session.getId()%> ===== Vergleich der Webserver Apache httpd und Apache Tomcat ===== Erzeugen einiger Binär Dateien dd if=/dev/urandom of=webapps/last/8k.bin bs=8k count=1 dd if=/dev/urandom of=webapps/last/25k.bin bs=25k count=1 dd if=/dev/urandom of=webapps/last/100k.bin bs=100k count=1 dd if=/dev/urandom of=webapps/last/250k.bin bs=250k count=1 Erzeugen einer Textdatei dd if=/dev/urandom | grep -ao "[A-Z,a-z]" | tr -d "\n" | dd of=webapps/last/64k.txt bs=1024 count=64 ''/etc/apache2/sites-avialable/default'' JkMount /last* loadbalancer Alias /static/ "/home/nutzer28/workshop/node74/webapps/last/" Ausführen der Last ab -c 5 -n 1000000 -k http://localhost/last/100k.bin Tomcat 6.0.32 JIO ab -c 10 -n 50000 http://localhost:7480/last/100k.bin Requests per second: 1668.56 [#/sec] (mean) Time per request: 5.993 [ms] (mean) Time per request: 0.599 [ms] (mean, across all concurrent requests) Transfer rate: 167289.32 [Kbytes/sec] received Apache 2.2.14 + mod_jk 1.2.32 via AJP (AjpProtocol) ab -c 10 -n 50000 http://localhost/last/100k.bin Requests per second: 861.88 [#/sec] (mean) Time per request: 11.603 [ms] (mean) Time per request: 1.160 [ms] (mean, across all concurrent requests) Transfer rate: 86424.88 [Kbytes/sec] received Apache 2.2.14 direkt ubuntu 10.04 ab -c 10 -n 50000 http://localhost/alast/100k.bin Requests per second: 2019.10 [#/sec] (mean) Time per request: 4.953 [ms] (mean) Time per request: 0.495 [ms] (mean, across all concurrent requests) Transfer rate: 202464.63 [Kbytes/sec] received Tomcat 6.0.32 APR ab -c 10 -n 50000 http://localhost:7470/last/100k.bin Requests per second: 2480.71 [#/sec] (mean) Time per request: 4.031 [ms] (mean) Time per request: 0.403 [ms] (mean, across all concurrent requests) Transfer rate: 248720.55 [Kbytes/sec] received Tomcat 6.0.32 NIO ab -c 10 -n 50000 http://localhost:7490/last/100k.bin Requests per second: 1613.26 [#/sec] (mean) Time per request: 6.199 [ms] (mean) Time per request: 0.620 [ms] (mean, across all concurrent requests) Transfer rate: 161744.72 [Kbytes/sec] received Tomcat 6.0.32 NIO (with keepalive) ab -c 10 -n 50000 -k http://localhost:7490/last/100k.bin Requests per second: 2292.71 [#/sec] (mean) Time per request: 4.362 [ms] (mean) Time per request: 0.436 [ms] (mean, across all concurrent requests) Transfer rate: 229897.96 [Kbytes/sec] received Apache 2.2.14 direkt ubuntu 10.04 (with keepalive) ab -c 10 -n 50000 -k http://localhost/alast/100k.bin Requests per second: 3030.16 [#/sec] (mean) Time per request: 3.300 [ms] (mean) Time per request: 0.330 [ms] (mean, across all concurrent requests) Transfer rate: 303974.78 [Kbytes/sec] received Tomcat 6.0.32 APR (with keepalive) ab -c 10 -n 50000 -k http://localhost:7470/last/100k.bin Requests per second: 3220.51 [#/sec] (mean) Time per request: 3.105 [ms] (mean) Time per request: 0.311 [ms] (mean, across all concurrent requests) Transfer rate: 322931.23 [Kbytes/sec] received The Winner is: Apache Tomcat 6.0.32 with APR and KeepAlive :-) Beim überschreiten der File Limits: ''/etc/security/limits.conf'' * soft files 0 * hard files 0 kill -HUP 1 ===== Templates für mehrere nodes ===== JkShmFile "/var/log/apache2/mod_jk.shm" JkLogFile "/var/log/apache2/mod_jk.log" JkLogLevel info JKWorkerProperty worker.list=loadbalancer,jkstatus JKWatchDogInterval 30 # template worker mod_jk apache JkWorkerProperty worker.template.type=ajp13 # used for MPM worker mode with CPING/CPONG JkWorkerProperty worker.template.connection_pool_timeout=300 JkWorkerProperty worker.template.connection_pool_minsize=0 #JkWorkerProperty worker.template.socket_keepalive=1 #JkWorkerProperty worker.template.socket_timeout=300 JkWorkerProperty worker.template.ping_mode=A JkWorkerProperty worker.template.ping_timeout=10000 #JkWorkerProperty worker.template.max_reply_timeouts=10 #JkWorkerProperty worker.template.reply_timeout=300000 JkWorkerProperty worker.template.lbfactor=1 JkWorkerProperty worker.template.retries=2 JkWorkerProperty worker.template.activation=A JkWorkerProperty worker.template.recovery_options=7 JKWorkerProperty worker.list=loadbalancer,jkstatus JKWorkerProperty worker.node73.port=7309 JKWorkerProperty worker.node73.host=localhost JKWorkerProperty worker.node73.reference=worker.template JKWorkerProperty worker.node74.port=7409 JKWorkerProperty worker.node74.host=localhost JKWorkerProperty worker.node74.reference=worker.template JKWorkerProperty worker.loadbalancer.type=lb JKWorkerProperty worker.loadbalancer.error_escalation_time=0 JKWorkerProperty worker.loadbalancer.balance_workers=node73,node74 JKWorkerProperty worker.jkstatus.type=status ===== AccessLogging ===== ''/etc/apache2/sites-avialable/default'' LogFormat "%h %l %u %t \"%r\" %>s %b %D %{pid}P %{tid}P %{JK_WORKER_NAME}n %{JK_LB_FIRST_NAME}n \ %{JK_LB_FIRST_BUSY}n %{JK_LB_FIRST_STATE}n %{JK_LB_LAST_NAME}n \ %{JK_LB_LAST_BUSY}n %{JK_LB_LAST_STATE}n %{UNIQUE_ID}e %{JSESSIONID}C" mod_jk_log CustomLog /var/log/apache2/access_jk.log mod_jk_log JkEnvVar UNIQUE_ID JkEnvVar APACHE notebook14 sudo a2enmod unique_id sudo apache2ctl restart Links * http://tomcat.apache.org/connectors-doc/reference/apache.html * http://httpd.apache.org/docs/current/mod/mod_log_config.html ==== Tomcat AccessLog ==== ''node73/conf/server.xml'' .. .. ==== Log4J Ausgabe mit Unique ID ==== ''Vorbereitung in webapps'' mkdir -p logging/WEB-INF/classes/filters mkdir -p logging/WEB-INF/lib ''WEB-INF/classes/filters/ApacheUniqueIDFilter.java'' package filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.log4j.MDC; public final class ApacheUniqueIDFilter implements Filter { private String uniqueID = "UNIQUE_ID"; private String apache = "APACHE"; private FilterConfig filterConfig = null; public void destroy() { this.uniqueID = null; this.apache = null ; this.filterConfig = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String uidvalue =(String) request.getAttribute(uniqueID); String apachevalue = (String)request.getAttribute(apache); try { MDC.put("UNIQUE_ID", uidvalue + "-" + apachevalue) ; chain.doFilter(request, response); } finally { MDC.remove("UNIQUE_ID") ; } } public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; //this.uniqueID = filterConfig.getInitParameter("UNIQUE_ID"); //this.apache = filterConfig.getInitParameter("APACHE"); } } ''WEB-INF/classes/log4j.properties'' log4j.rootLogger=INFO, CATALINA # Define all the appenders log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender log4j.appender.CATALINA.file=${catalina.base}/logs/logging.log log4j.appender.CATALINA.encoding=UTF-8 # Roll-over the log once per day log4j.appender.CATALINA.datePattern='.'yyyy-MM-dd log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout log4j.appender.CATALINA.layout.conversionPattern = %d [%t] %-5p %X{UNIQUE_ID} %c- %m%n log4j.appender.CATALINA.append=true ''WEB-INF/web.xml'' uniqueid filters.ApacheUniqueIDFilter uniqueid /* ''log.jsp'' <%@ page import="org.apache.log4j.*" %> <% Logger logger = Logger.getRootLogger(); logger.info("Info"); logger.debug("Fine"); application.log("context log"); System.out.println("system.out"); System.err.println("system.err"); %> s.h Logging Handler ''download und kompilieren'' cd workshop wget http://archive.apache.org/dist/logging/log4j/1.2.16/apache-log4j-1.2.16.tar.gz tar xzf apache-log4j-1.2.16.tar.gz cp apache-log4j-1.2.16/log4j-1.2.16.jar node74/webapps/logging/WEB-INF/lib cd node74/webapps/logging/WEB-INF/classes/filters javac -cp ~/workshop/apache-tomcat-6.0.32/lib/servlet-api.jar:../../lib/log4j-1.2.16.jar *.java cd ../.. touch web.xml sudo -i cd /etc/apache2 vi sites-available/default JkMount /logging* loadbalancer apache2ctl restart Access log.jsp via apache (http://localhost/logging/log.jsp;jsessionid=sdada.node74 Nachschauen in node74/logs/logging.log logging.log 2011-07-14 16:48:40,060 [ajp-7409-1] INFO Th8Bx38AAQEAAHWhAP4AAAAQ-notebook24 root- Info tomcat access.log 192.168.1.189 - "-" [14/Jul/2011:16:48:45 +0200] "GET /last/log.jsp;jesssionid=sdsad.node74 HTTP/1.1" 200 22 473 756A0329E5BD1CDFF8CC93DF777B5BC7.node74 Th8Bx38AAQEAAHWhAP4AAAAQ notebook24 apache access_jk.log 192.168.1.189 - - [14/Jul/2011:16:48:39 +0200] "GET /last/log.jsp;jsessionid=sda.node74 HTTP/1.1" 200 42 131179 30113 2900253552 loadbalancer node74 0 OK node74 0 OK Th8Bx38AAQEAAHWhAP4AAAAQ 756A0329E5BD1CDFF8CC93DF777B5BC7.node74 * http://www.torsten-horn.de/techdocs/java-log4j.htm ===== Dokumentation ===== * http://tomcat.apache.org/connectors-doc/reference/apache.html ===== Distance ===== ''mods-available/jk.conf'' JKWorkerProperty worker.node73.port=7309 JKWorkerProperty worker.node73.host=localhost JKWorkerProperty worker.node73.reference=worker.template JKWorkerProperty worker.node73.distance=0 JKWorkerProperty worker.node74.port=7409 JKWorkerProperty worker.node74.host=localhost JKWorkerProperty worker.node74.reference=worker.template JkWorkerProperty worker.node74.distance=0 JKWorkerProperty worker.node75.port=7509 JKWorkerProperty worker.node75.host=notebook05 JKWorkerProperty worker.node75.reference=worker.template JkWorkerProperty worker.node75.distance=1 JKWorkerProperty worker.node76.port=7609 JKWorkerProperty worker.node76.host=notebook05 JKWorkerProperty worker.node76.reference=worker.template JKWorkerProperty worker.node76.distance=1 JKWorkerProperty worker.list=loadbalancer,jkstatus,jkread JKWorkerProperty worker.loadbalancer.type=lb JKWorkerProperty worker.loadbalancer.error_escalation_time=0 JKWorkerProperty worker.loadbalancer.balance_workers=node73 JKWorkerProperty worker.loadbalancer.balance_workers=node74 JKWorkerProperty worker.loadbalancer.balance_workers=node75 JKWorkerProperty worker.loadbalancer.balance_workers=node76 ===== More Loadbalancer uri.map ===== ''mods-available/jk.conf'' JKWorkerProperty worker.node73.port=7309 JKWorkerProperty worker.node73.host=localhost JKWorkerProperty worker.node73.reference=worker.template JKWorkerProperty worker.node73.distance=0 JKWorkerProperty worker.node74.port=7409 JKWorkerProperty worker.node74.host=localhost JKWorkerProperty worker.node74.reference=worker.template JkWorkerProperty worker.node74.distance=0 JKWorkerProperty worker.node75.port=7509 JKWorkerProperty worker.node75.host=notebook05 JKWorkerProperty worker.node75.reference=worker.template JkWorkerProperty worker.node75.distance=1 JKWorkerProperty worker.node76.port=7609 JKWorkerProperty worker.node76.host=notebook05 JKWorkerProperty worker.node76.reference=worker.template JKWorkerProperty worker.node76.distance=1 JKWorkerProperty worker.list=loadbalancer,jkstatus,jkread, lb2 JKWorkerProperty worker.loadbalancer.type=lb JKWorkerProperty worker.loadbalancer.error_escalation_time=0 JKWorkerProperty worker.loadbalancer.balance_workers=node73 JKWorkerProperty worker.loadbalancer.balance_workers=node74 JKWorkerProperty worker.lb2.type=lb JKWorkerProperty worker.lb2.error_escalation_time=0 JKWorkerProperty worker.lb2.balance_workers=node75 JKWorkerProperty worker.lb2.balance_workers=node76 ''sites-avaialble/default'' JkMountFile /etc/apache2/uriworkermap.properties ''uriworkermap.properties'' /nutzer*=loadbalancer Wechsel auf einen anderen Loadbalancer ohne Restart auf lb2(node75/node76) ''uriworkermap.properties'' /nutzer*=lb2 ===== Mod_proxy ===== ''/etc/apache2/sites-available/default'' BalancerMember ajp://localhost:7409 route=node74 BalancerMember ajp://localhost:7509 route=node75 ProxySet stickysession=JSESSIONID ProxyPass /lllast balancer://mycluster/last ProxyPassReverse /lllast balancer://mycluster/last ProxyPass /llhello balancer://mycluster/hello ProxyPassReverse /llhello balancer://mycluster/hello ''mods-available/proxy.conf'' #turning ProxyRequests on and allowing proxying from all may allow #spammers to use your proxy to send email. ProxyRequests Off AddDefaultCharset off Order deny,allow #Deny from all ### Erlaubnis erteilen ### Allow from all #Allow from .example.com # Enable/disable the handling of HTTP/1.1 "Via:" headers. # ("Full" adds the server version; "Block" removes all outgoing Via: headers) # Set to one of: Off | On | Full | Block ProxyVia On #a2dismod jk a2enmod proxy a2enmod proxy_balancer a2enmod proxy_ajp apache2ctl restart ''sites-available/default'' SetHandler balancer-manager Order deny,allow Allow from all AuthType Basic AuthName "By Invitation Only" AuthBasicProvider file AuthUserFile /etc/apache2/passwords Require valid-user