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
sudo aptitude install apache2-dev
– evtl.
apt-get install apache2-mpm-worker apt-get install apache2-threaded-dev
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
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
<Executor name="Catalina-Exe" namePrefix="Tomcat-Threads" maxThreads="200" />
Connector AJP Java IO Stack
<Connector port="${port.prefix}09"
executor="Catalina-Exe"
protocol="org.apache.coyote.ajp.AjpProtocol" />
sites-available/default :
<Location /jkstatus>
AuthType Basic
AuthName "By Invitation Only"
AuthBasicProvider file
AuthUserFile /etc/apache2/passwords
Require valid-user
</Location>
htpasswd -c /etc/apache2/passwords admin
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 :
<Location /jkread>
AuthType Basic
AuthName "By Invitation Only"
AuthBasicProvider file
AuthUserFile /etc/apache2/passwords
Require valid-user
</Location>
JkMount /jkread jkread
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()%>
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
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
/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
node73/conf/server.xml
<Engine ..>
..
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="access-"
suffix=".log"
pattern="%h %l %u %t "%r" %s %b %D %S %{UNIQUE_ID}r %{APACHE}r"
/>
..
<Host ..>
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
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>uniqueid</filter-name>
<filter-class>filters.ApacheUniqueIDFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>uniqueid</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
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
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
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
/etc/apache2/sites-available/default
<Proxy balancer://mycluster>
BalancerMember ajp://localhost:7409 route=node74
BalancerMember ajp://localhost:7509 route=node75
ProxySet stickysession=JSESSIONID
</Proxy>
ProxyPass /lllast balancer://mycluster/last
ProxyPassReverse /lllast balancer://mycluster/last
ProxyPass /llhello balancer://mycluster/hello
ProxyPassReverse /llhello balancer://mycluster/hello
mods-available/proxy.conf
<IfModule mod_proxy.c>
#turning ProxyRequests on and allowing proxying from all may allow
#spammers to use your proxy to send email.
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
#Deny from all
### Erlaubnis erteilen ###
Allow from all
#Allow from .example.com
</Proxy>
# 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
</IfModule>
#a2dismod jk a2enmod proxy a2enmod proxy_balancer a2enmod proxy_ajp apache2ctl restart
sites-available/default
<Location /balancer-manager> SetHandler balancer-manager Order deny,allow Allow from all AuthType Basic AuthName "By Invitation Only" AuthBasicProvider file AuthUserFile /etc/apache2/passwords Require valid-user </Location>