Wie kann ich die Verwendung von mod_proxy_ajp mit Apache und Tomcat einstellen?

Wie kann ich die Verwendung von mod_proxy_ajp mit Apache und Tomcat einstellen?

Ich möchte Apache und Tomcat auf einem RHEL 5-Server ausführen, wobei Apache die Ruby on Rails-Apps (über mod_rails/Passenger) und Tomcat die Java-Apps verwaltet.

Unter Apache verfügt jede Rails-App über eine URL und einen virtuellen Host. Die URLs sind in unserem DNS-Server bereits so konfiguriert, dass sie auf die Maschine verweisen.

Unter Tomcat hat jede Java-App eine URL wie diese: ourserver.ourcompany.com/app1, ourserver.ourcompany.com/app2, usw.

Der Server ist bereits einsatzbereit, Tomcat 6 läuft auf Port 80 und stellt mehrere Java-Apps bereit. Ich möchte Apache hinzufügen und neu konfigurieren. Ich weiß, wie man einen einzelnen Apache-Server konfiguriert, um RoR-Apps mit Passenger zu hosten. Ich weiß nur nicht, wie ich Apache und Tomcat dazu bringe, so zusammenzuarbeiten.

Ich habe durch Googeln verschiedene Ressourcen und Diskussionen gefunden (zum BeispielDieses hier), aber sie sind oft etwas skizzenhaft und unvollständig oder scheinen nicht wirklich zu dem zu passen, was ich versuche. Die von mir verlinkte scheint dafür gedacht zu sein, wenn Sie alle Anfragen an Tomcat senden möchten, nicht nur bestimmte, und die anderen von Apache bearbeiten lassen möchten.

Könnte jemand eine Beispielkonfiguration für server.xmlund vorschlagen httpd.confoder mich vielleicht auf einige detailliertere Ressourcen verweisen?

Antwort1

Sie müssen keine Änderungen vornehmen, server.xmlaußer Tomcat auf die Standardports zurückzusetzen, damit Apache Port 80 verarbeiten kann. Der Großteil der Arbeit wird über die Apache-Konfigurationsdateien erledigt. Normalerweise lasse ich diese außerhalb httpd.confund füge sie stattdessen in kleinere Konfigurationsausschnitte im <ServerRoot>/conf.d/Unterverzeichnis ein.

Angesichts Ihres ourserver.ourcompany.com/app1& -Beispiels ourserver.ourcompany.com/app2würde ich etwa folgende Konfiguration annehmen:

<VirtualHost *:80>
    ServerName ourserver.ourcompany.com
    ErrorLog ...
    CustomLog ...

    [other VHost configurations]

    ProxyPass /app1 ajp://tomcat_hostname:8009/app1
    ProxyPassReverse /app1 ajp://tomcat_hostname:8009/app1

    ProxyPass /app2 ajp://tomcat_hostname:8009/app2
    ProxyPassReverse /app2 ajp://tomcat_hostname:8009/app2
</VirtualHost>

Wenn Sie mehrere Tomcat-Server im Hintergrund haben, sollten Sie mod_balancer einrichten und ajp://diemod_balancer BalancerMemberund ersetzen Sie durch die balancer://URL, die auf die Balancer-Konfiguration verweist.

Antwort2

Ich persönlich mag mod_proxy_ajp nicht; wenn ich Tomcat unter Apache ausführe, installiere ich sofort mod_jk (das Modul von Tomcat-Programmierern), um die AJP-Verbindung bereitzustellen. Sie können mod_jk auf fünf verschiedene Arten optimieren, um die Leistung Ihrer Apps zu verbessern (Threads, Timeouts, Knocks usw.).

  1. Stellen Sie sicher, dass httpd-devel installiert ist
  2. Entpacken Sie das echte JDK in einen Pfad wie /usr/local/jdk1.6.0_18/
  3. Holen Sie sich die Quelle „tomcat-connectors“ von tomcat.apache.org und kompilieren Sie sie

    cd tomcat-connectors-1.2.28-src/native

    ./configure --with-apxs=/usr/sbin/apxs --with-java=/usr/local/jdk1.6.0_18 --enable-prefork

    machen

    cp apache-2.0/mod_jk.so /usr/local/lib/

Jetzt müssen Sie es in Ihre Apache-Konfiguration im Allgemeinen und dann in jeden virtuellen Host entsprechend einfügen. In der Gesamtkonfiguration fügen Sie etwas wie Folgendes hinzu:

LoadModule jk_module /usr/local/lib/mod_jk.so
JkWorkersFile  /usr/local/tomcat/conf/workers.properties
JkShmFile      /var/log/httpd/mod_jk.shm
JkLogFile      /var/log/httpd/mod_jk.log
JkLogLevel     error

Sie müssen die grundlegende Datei worker.properties erstellen. Hier sind die Dokumente:http://tomcat.apache.org/connectors-doc/reference/workers.htmlEin ganz einfaches Beispiel könnte so aussehen:

workers.tomcat_home=/usr/local/tomcat
workers.java_home=/usr/local/jdk1.6.0_18
ps=/
worker.list=ajp13
worker.maintain=60
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=ajp13

Dabei wird die Standardkonfiguration für Port 8009 aus server.xml verwendet. Hier gibt es eine Million Knöpfe, an denen Sie drehen können, um die Leistung endlos zu optimieren. Anschließend „mounten“ Sie in jedem virtuellen Host die gewünschten Apps:

<VirtualHost *:80>
 ServerName foo.bar.com
 ...other options ...

 JkMount /app1/* ajp13
 <Location "/app1/WEB-INF/">
    deny from all
 </Location>

 JkMount /app2/* ajp13
 <Location "/app2/WEB-INF/">
    deny from all
 </Location>

</VirtualHost>

Wie Sie unten sehen, vergessen Sie nicht ein wenig Sicherheit und verweigern Sie jeglichen Zugriff auf Ihren WEB-INF-Ordner – die meisten Webanwendungen haben ihren Datenbank-DSN mit dem Passwort web.xml, wenn sie als Warball bereitgestellt werden.

verwandte Informationen