# Verständnisfrage zu Tomcat, Apache & mod_jk



## foxylion (27. Sep 2010)

Hallo,
ich hab nach nervenaufreibenden Stunden, vermute ich zumindest, es geschafft einen Tomcat-Server mittels mod_jk über einen Apache zum laufen bekommen.

Jetzt frag ich mich aber wie ich auf dem Server etwas deploye. Ich kann ja meine Eclipse-Projekte entweder als war exportieren -> Wo muss die dann hin?

Oder ich kann das Verzeichnis wie es ist nehmen und irgendwo hinkopieren -> Wo muss das hin?

Und wie muss ich dann den Tomcat-Server / den Apache konfigurieren, dass die mir das Projekt direkt in dem Virtuellen Apache-Verzeichnis anzeigen?

Gruß
foxylion


----------



## Gast2 (27. Sep 2010)

foxylion hat gesagt.:


> Jetzt frag ich mich aber wie ich auf dem Server etwas deploye. Ich kann ja meine Eclipse-Projekte entweder als war exportieren -> Wo muss die dann hin?



Standardmäßig in den Folder "webapp"


----------



## foxylion (27. Sep 2010)

fassy hat gesagt.:


> Standardmäßig in den Folder "webapp"


Und wie konfigurier ich dann Apache, dass er die Anfragen an die war korrekt weiterleitet und die war nicht aus dem Web downloadbar ist? Weil das webapp Verzeichnis ist ja im Document-Root des VirtualHosts, oder?


----------



## Noctarius (28. Sep 2010)

Man sollte Apache und Tomcat nicht mehr über mod_jk verbinden, da dieses Plugin geschwindigkeitstechnisch nicht gut ist.

Running Confluence behind Apache - Confluence 3.3 - Atlassian Documentation - Confluence

Auch wenn es für Confluence gedacht ist, die Einrichtung ist gleich da auch Confluence nur einen Standalone-Tomcat nutzt


----------



## stareagle (28. Sep 2010)

Moin,

ob der Tomcat direkt über Port 8080 (oder welchen Port auch immer man konfiguriert) angesprochen wird, oder über mod_jk und den Apache, spielt für das Deployen keine Rolle.

Die WAR-Datei kommt weiterhin in das webapp-Verzeichnis des Tomcat. mod_jk sorgt nur dafür, dass der Apache Webserver alle Anfragen an eine oder mehrere bestimmte Adressen an den Tomcat weiterleitet.  Dafür wird normalerweise Port 8009 verwendet.

Im Apache musst du zwei Sachen konfigurieren:

Einen oder mehrere Worker
Eine mehere JkMount-Direktiven in der Konfiguration des jeweiligen VirtualHosts.

Wo diese Einstellungen liegen ist leider recht unterschiedlich, je nachdem welches Betriebssystem bzw. welche Linux-Distribution du verwendest. Bei Debian liegen die Einstellungen für die Worker z.B. direkt in /etc/apache2, in der Datei worker.properties. Diese Datei sieht dort wie folgt aus (wird automatisch angelegt, wenn du mod_jk über das Paketmanagement installierst):

```
# Define 1 real worker using ajp13
  worker.list=worker1
  # Set properties for worker1 (ajp13)
  worker.worker1.type=ajp13
  worker.worker1.host=localhost
  worker.worker1.port=8009
```

Das heißt, das alle Adressen, die per JkMount-Direktive an diesen Worker gebunden werden, an einen Tomcat auf dem gleichen Rechner weitergeleitet werden, und dieser auf Port 8009 auf Anfragen von mod_jk lauschen sollte. ajp13 ist das Protokoll, das für die Kommunikation zwischen Apache und Tomcat verwendet wird.

In der Konfiguration des VirtualHosts musst du über JkMount-Direktiven festlegen, welche Adressen an den Tomcat weitergeleitet werden sollen. Das könnte zum Beispiel wie folgt aussehen:


```
JkMount /examples/* worker1
JkMount /examples worker1
JkMount /hudson/* worker1
JkMount /hudson worker1
```

Angenommen, der Server ist unter Example Web Page erreichbar, heißt das, dass alle Anfragen, die an www.example.net/examples, www.example.net/hudson und alle untergeordneten Adressen, z.B. www.example.net/ein-tolles-beispiel, gehen an den Tomcat weitergeleitet werden.

Der Tomcat verhält sich genauso, als ob die Adressen direkt über den eingebauten HTTP-Server aufgerufen worden wären, z.B. http://www.example.net:8080/examples.

Weitere Fragen solle die Dokumentation von mod_jk beantworten, die unter The Apache Tomcat Connector - Documentation Index verfügbar ist.

Gruß

Stareagle


----------



## FArt (28. Sep 2010)

Noctarius hat gesagt.:


> Man sollte Apache und Tomcat nicht mehr über mod_jk verbinden, da dieses Plugin geschwindigkeitstechnisch nicht gut ist.


Hast du mehr Informationen dazu?
Meines Wissens nach ist AJP ein schlankeres, weil binäres Protokoll (gegenüber HTTP) und wird in der Regel als Verbindung von Apache und Tomcat empfohlen.


----------



## Noctarius (28. Sep 2010)

Hm nach der Suche muss ich mich scheinbar ein wenig korrigieren. Hatte zuletzt eine Anwendung auf Jetty-Basis geschrieben. Diese sagen ganz klar, dass mod_proxy der bessere Weg ist und immer vor mod_jk genutzt werden sollte. Dies scheint aber eher an dem internen Jetty-Aufbau zu liegen.

Tomcat sagt in seiner Doku, dass man mod_jk wählen sollte.

Im Netz gehen die Meinungen scheinbar nach Benchmarks und Tests auseinander. Die einen empfehlen den reinen mod_proxy, Andere mod_jk und einige wenige (den derzeit noch recht neuen, aber nativen) mod_proxy_ajp.

Ich denke diese Aussage hier trifft das Hin-und-Her am Besten: Deciding between mod_jk, mod_proxy_http and mod_proxy_ajp | TomcatExpert

Scheinbar nehmen sich die Module nicht viel und sind eher für bestimmte Einsatzgebiete zu empfehlen.

Ich nehme daher meine etwas vorschnelle (und aus der Erinnerung gegebene ^^) Aussage zurück. Danke FArt, dass du mich noch mal hast nach der Aussage suchen lassen. Dadurch, dass es Jetty und nicht Tomcat war dauerte das nämlich ein paar Minuten


----------



## foxylion (29. Sep 2010)

Danke euch vieren, ich glaub jetzt hat sich mein Horizont ein bisschen gehoben und ich versteh wie das ganze funktioniert, werd das nachher mal testen, sollte es nicht klappen werdet ihr wieder von mir hören


----------



## foxylion (29. Sep 2010)

So jetzt klappt es sogar was anzeigen zu lassen, allerdings grübel ich warum so ein paar Sachen nicht tun.

Mein Konfiguration sieht so aus:
apache-vHost:

```
<VirtualHost *:80>
     ServerName tomcat.foxylion.de
	
     JkMount /* worker1
     JkLogLevel trace
	
     DocumentRoot ...
     <Directory ...>...</Directory>
</VirtualHost>
```
server.xml:

```
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">

<Host name="tomcat.foxylion.de" appBase="webapps/examples"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
```

Im examples Ordner sind die normales Standard-Examples von tomcat drin.

Ruf ich jetzt tomcat.foxylion.de auf bleibt die Seite weiß.
Rufe ich hingegen foxylion.de:8080 auf, kommt eine Seite mit der Möglichkeit jsp/servlet zu wählen.

Rufe ich tomcat.foxylion.de/jsp/ auf kommt die gewünschte Seite (die äquivalente zum Direktaufruf).

Rufe ich jetzt http://tomcat.foxylion.de/jsp/jsp2/el/functions.jsp auf, bekomme ich eine Exception:

```
org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/functions cannot be resolved in either web.xml or the jar files deployed with this application
	usw...
```
Beim Direktaufruf hingegen nicht.

Wo liegt der Hund begraben? 
Ich bin dankbar für jede Hilfe.


----------

