Advanced
Java
Services
|
Connecting Apache 2.x.xx and Tomcat 6.x.xx with mod_jk to
run Servlets and JavaServerPages
|
|
Wie der Indianer den Kater zum Schnurren bringt
|
I Download der Dateien
1) Apache 2.x.xx
Die aktuelle Version findet man auf der
Startseite von Apache. Dort sucht man
den Absatz mit dem Hinweis "best available version". und dann den Eintrag "Win32 Binary" und folgt dem Link.
2) Tomcat 6.x.xx
Für Tomcat geht man ähnlich vor. Man besucht die Startseite und informiert
sich über die aktuelle Version. Am linken Rand der Seite findet man dann unter Download einen Link auf die aktuelle
Version. Die dann folgende Seite beinhaltet eine Beschreibung der aktuellen Version. Man sucht den Absatz Binary Distributions
und dort den Link Windows Service Installer.
3) mod_jk connector
Die connectoren dienen dazu einen WebServer mit Tomcat zu verbinden. Tomcat dient dann als Servletcontainer und der WebServer reicht Sevletanfragen an Tomcat weiter. Für den Apache WebServer wird die Konfiguration dieser Verbindung hier beschrieben. Mittlerweile haben die beiden connectoren ihre Rollen vertauscht, war früher mod_jk2 state of the art, so ist es jetzt wieder mod_jk. Die Weiterentwicklung von mod_jk2 wurde bereits Ende 2004 eingestellt:
Man geht wieder zur Startseite von
Apache Tomcat. Am linken Rand findet man unter
Documentation den Link Tomcat Connectors. Folgt man dem Link, so findet man unter dem Absatz Headlines
den Link Download the binaries for selected platforms. Hier wird man auf ein Inhaltsverzeichnis geführt, in dem man
seine Betriebssystem wählen kann. Sodann sucht man sich den richtigen Connector heraus.
4) Servlet API 2.5 und Servlet packages
Die Servlet-API sowie die JSP-API ist auch Bestandteil der java Enterpriseedition, die man von der Sunseite herunterladen kann.
Wer nur Servlets und JSP entwickeln will kann die Version 2.5 hier herunterladen:
Servlet API 2.5
JSP API 2.5
Die notwendigen Packages zum Compilieren von eigenen Servlets und JSP finden sich nach der Installtion von Tomcat im
Verzeichnis
<%TOMCAT_HOME%>/lib
Es sind dies die Dateien servlet-api.jar und jsp-api.jar
II Installation
Voraussetzung für Tomcat ist eine zur Version von Tomcat passende JavaUmgebung. Für Tomcat 6 ist dies
eine JRE in der Version 1.5 oder 1.6 . Bei der Installation von Tomcat 6 mit JRE 1.6 gibt es ein kleines Problem,
weil Tomcat 6 eine Datei sucht, die in der Javaversion 1.6 nicht mehr an der gleichen Stelle liegt. Wir werden gleich
darauf hinweisen.
1) Tomcat 6.x.xx
Die Installation von Tomcat ist mittlerweile sehr komfortabel. Bei der Installation wird eine
vorhandene Javaumgebung erkannt. Die Installation schlägt als Pfad "C:\Programme\Apache Software Foundation\Tomcat 6.0"
vor. Da dieser Pfad Leerzeichen enthält muß man bei der Verbindung von Apache mit Tomcat in der Apachekonfigurationsdatei
httpd.conf den Pfad zu Tomcat in Anführungszeichen angeben, was man gerne vergißt. Wir wählen daher einen Pfad ohne
Leerzeichen.
Hier die Scrennshots der Installation:
Starten und Beenden von Tomcat
Über einen Monitor rechts in der Taskleiste kann man Tomcat als Service Starten bzw. Beenden.
Die Eingabe der Adresse http://127.0.0.1:8080 in einen Browser sollte die Startseite von
Tomcat bringen, da Tomcat auf den Port 8080 vorkonfiguriert ist. Die dort über Links zu erreichenden
Servletbeispiele bzw. JSP-Beispiele sollten dann laufen.
Falls Tomcat nicht startet
Falls Tomcat nicht startet, so kann das daran liegen, daß Tomcat 6 eine Datei nicht findet.
Tomcat 6 braucht um starten zu können die Datei msvcr71.dll.
Diese muß entweder im Verzeichnis <%TOMCAT_HOME%>/bin oder im Windows system32 Verzeichnis
liegen. Die Datei wird bei der Installation einer Javaumgebung im Verzeichnis <%JAVA_HOME%>/bin abgelegt.
Man muß sie also von diesem Verzeichnis in eines der vorher erwähnten kopieren.
Falls der Tomcatmanager nicht mehr erreichbar ist
Falls der Tomcatmanager nicht mehr erreichbar ist und die Fehlermeldung This request requires HTTP authentication
erscheint, so kann das daran liegen, daß Tomcat keine JavaServer Pages mehr starten kann. Der Tomcatmanager ist nämlich
eine JSP-Datei. Falls also auch die JSP-Beispiele nicht mehr funktionieren, dann schaut man am besten mal in die Tomcat
log-Dateien von localhost oder manager. Falls man dort die Meldung ClassNotFoundException: javax.el.ELResolver
entdeckt, dann findet Tomcat ein Javaarchiv nicht (mehr). Es handelt sich um das Archiv el-api.jar im Verzeichnis
<%TOMCAT_HOME%>/lib. Kopiert man dieses Archiv in das lib/ext Verzeichnis der aktuellen JRE, dann laufen
die JSP wieder (Aus einem mir unbekannten Grund findet Tomcat das Archiv el-api.jar nicht mehr im eigenen Verzeichnis,
kann es sich aber dann aus dem lib/ext Verzeichnis besorgen)
Tomcat konfigurieren
Die Konfigurationsdatei von Tomcat ist TOMCAT_HOME/conf/server.xml. Will man etwa den Port
8080 ändern, so geschieht das hier durch Angabe eines anderen Ports unter
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
Verzeichnis der WebApplikation, die die Servletbeispiele enthält
<%TOMCAT_HOME%>/webapps/examples
Verzeichnis der Servletdateien (Sourcen und classes)
<%TOMCAT_HOME%>/webapps/examples/WEB-INF/classes
Ort der Kondigurationsdatei web.xml (Notwendig für Servlet- und evtl. Listenereinträge)
<%TOMCAT_HOME%>/webapps/examples/WEB-INF/web.xml
Verzeichnis der Startdatei index.jsp
<%TOMCAT_HOME%>/webapps/ROOT
2) Apache 2.x.xx
Zu (irgend) einem gewählten Verzeichnis installiert sich Apache immer in ein Unterverzeichnis
Apache2. Will man also etwa Apache im Verzeichnis c:\ApacheTomcat\Apache2 installieren, so darf man
als Verzeichnis bei der Installation nur c:\ApacheTomcat angeben. Des weiteren muß man bei der
Installation eine Serveradresse der Form xxx.yyy bzw. www.xxx.yyy eingeben. Für lokale Testinstallationen
ist es egal was man hier eingibt. Zudem kann man die Eingaben später in der Konfigurierungsdatei
httpd.conf immer ändern. Die fehlerfreie Installation beendet sich mit einem automatischen Start von
Apache. Rechts unten auf der Taskleiste sollte die Apachefeder mit einem kleinen grünen Dreieck
erscheinen. Über diesen Monitor kann man den Server ein- und ausschalten. Die Umgebungsvariable
APACHE_HOME sollte gesetzt werden.
Die Eingabe der Adresse http://127.0.0.1 in einen Browser sollte die Startseite von
Apache bringen (Defaultport 80).
Pfad zur KonfigurierungsDatei httpd.conf
APACHE_HOME/conf
Verzeichnis für .html Dateien
APACHE_HOME/htdocs
cgi-bin Verzeichnis
APACHE_HOME/cgi-bin
Verzeichnis der module
APACHE_HOME/modules
III Connecting Apache 2.x.xx and Tomcat 6.x.xx
Verbindung mit mod_jk (empfohlen)
<IfModule mod_jk.c> JkWorkersFile APACHE_HOME/conf/workers.properties JkLogFile APACHE_HOME/logs/mod_jk.log JkLogLevel debug JkMount /examples/* ajp13 </IfModule>APACHE_HOME wird natürlich durch den bei der Installation gewählten Pfad ersetzt. mod_jk.log wird als leere Datei angelegt. Der Eintrag "debug" ist sehr nützlich zur Fehlersuche. Wenn die Verbindung funzt, kann man "info" statt "debug" nehmen.
### begin workers.properties ### # ================== worker list ================== # The worker that your plugins should create and work with # worker.list=ajp13 # default, Eintrag nicht notwendig # # ================== worker type ================== # Defining a worker named ajp13 and of type ajp13 # Note that the name and the type do not have to match. # worker.ajp13.type=ajp13 # default, Eintrag nicht notwendig # # ================== worker configuration ================== # worker.ajp13.port=8009 # default, Eintrag nicht notwendig # # worker.ajp13.host=localhost # default, Eintrag nicht notwendig # # ================== worker loadbalancing ================== # The loadbalancer (type lb) worker perform weighted round-robin load worker.loadbalancer.type=lb worker.loadbalancer.balanced_workers=ajp13 # # Specifies the load balance factor when used with a load balancing worker. # lbfactor must be > 0 (Low lbfactor means less work done by the worker.) worker.ajp13.lbfactor=1 # ### End workers.properties ###
Nach den Ergänzen des mappings in workers.properties sollten die folgenden URL's paarweise
das gleiche Ergebnis liefern.
Zugriff über Tomcat direkt : http://localhost:8080/examples/servlets/servlet/HelloWorldExample
Zugriff über Apache : http://localhost/examples/servlets/servlet/HelloWorldExample
oder auch
Zugriff über Tomcat direkt : http://localhost:8080/examples/
Zugriff über Apache : http://localhost/examples/
Verbindung mit mod_jk2 (seit November 2004 deprecated)
### begin workers2.properties ### # Port für Servletweiterleitung [channel.socket:localhost:8009] info=Ajp13 forwarding over socket tomcatId=localhost:8009 # worker angeben [ajp13:localhost:8009] channel=channel.socket:localhost:8009 # Apache das Verzeichnis von Tomcat in webapps bekanntgeben, in dem das Unterverzeichnis # class liegt, in dem die .class Dateien liegen [uri:/servlets-examples/*] info=Map the whole webapp worker=ajp13:localhost:8009 [shm] file=${serverRoot}/logs/shm.file size=1048576 [status:status] # Uri mapping [uri:/jkstatus/*] worker=status:status ### End workers2.properties ###
Nach den Ergänzen des mappings in workers2.properties sollten die folgenden beiden URL's dieselbe
Datei index.jsp aus
TOMCAT_HOME/webapps/servlets-examples/index.jsp bringen.
Zugriff über Tomcat direkt : http://127.0.0.1:8080/servlets-examples/
Zugriff über Apache : http://127.0.0.1:/servlets-examples/
IV Konfigurierung von webapps/examples/WEB-INF/web.xml
Im Unterschied zu den 4-er Versionen braucht man bei Tomcat 5.0.16 für jedes Servlet
zwingend zwei Einträge in der Datei web.xml, einen Eintrag im Bereich <servlet> und einen
Eintrag im Bereich <servlet-mapping> . Das folgende Beispiel zeigt die Einträge
für ein Servlet mit dem Namen MyServlet:
<!-- Define servlets that are included in the example application -->
<servlet>
<servlet-name>MyServlet<servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<!-- Eintrag im Bereich servlet-mapping -->
<servlet-mapping>
<servlet-name>MyServlet<servlet-name>
<url-pattern>/servlet/MyServlet<url-pattern>
</servlet-mapping>
Und noch eine "Kleinigkeit". web.xml reagiert sehr empfindlich auf bestimmte Kommentare. Eine
Hervorhebung des Beginns eines Abschnittes durch etwa
<!-- ---------- servlet-mapping ---------- -->
führt dazu, daß die Servlets nicht mehr gestartet werden können ! Ersetzt man - durch + oder
durch = , dann ist Tomcat zufrieden...
<!-- ========= servlet-mapping ========= -->
V Eine eigene Webapplikation einrichten
Eigene WebApplikationen sollten in einem separaten Bereich liegen. Die Servlet API Specification 2.3 legt fest, wie dieser Bereich strukturiert werden muß.
<IfModule mod_jk.c> JkWorkersFile APACHE_HOME/conf/workers.properties JkLogFile APACHE_HOME/logs/mod_jk.log JkLogLevel info JkMount /examples/* ajp13 JkMount /myWebApp/* ajp13 </IfModule>
[uri:/myWebApp/*]
Hier ein Listing einer minimalen web.xml . Die Datei muß mit dem xml-Versionseintrag beginnen, sonst
wird sie von Tomcat nicht als xml-Datei erkannt.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Beispielskonfigurierungsdatei web.xml -->
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Beispielskonfigurierungsdatei</display-name>
<description>
Beispielskonfigurierungsdatei
</description>
<!-- Define servlets that are included in the myWebApp application -->
<!-- ============================================================= -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>MyServlet</servlet-class>
</servlet>
<!-- ====================== servlet-mapping ====================== -->
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/wzlbrmpft.html</url-pattern>
</servlet-mapping>
</web-app>
Wie man am letzten Eintrag sieht, kann man über das servlet-mapping ein Servlets beliebig umbenennen.
Mit dem in servlet-mapping angegebenen URL-Pattern (und nur mit diesem!), das beliebig wählbar ist, ist
das Servlet für den Client ansprechbar.
Was bewirken diese Einträge :
VI Die Verzeichnisse /TOMCAT_HOME/common und /TOMCAT_HOME/shared
Die beiden Verzeichnisse haben eine verwandte Funktion.