webentwicklung-frage-antwort-db.com.de

Apache + Tomcat: Verwenden von mod_proxy anstelle von AJP

Gibt es eine Möglichkeit, Apache über einen HTTP-Proxy mit Tomcat zu verbinden, sodass Tomcat den korrekten eingehenden Hostnamen anstelle von localhost erhält? Ich verwende diese Direktive in Apache:

ProxyPass /path http://localhost:8080/path

Es kommt jedoch als localhost durch, was nutzlos ist, wenn wir mehrere Websites auf demselben Server haben. Ich könnte den Host manuell in der Serverkonfiguration einstellen:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           proxyName="pretend.Host" proxyPort="80" />

Aber das dient wiederum nicht mehr als einer Site. Und ich mag nicht die Idee, für jede Site einen anderen internen Port zu verwenden. Das hört sich wirklich hässlich an.

Gibt es keine Möglichkeit, den Port zu übertragen, wenn ich ihn vertrete?

(Wenn Sie fragen, warum ich nicht einfach AJP benutze, lautet die Antwort dieser Fehler . Ich versuche alles, was ich kann, bevor Sie Tomcat und Apache vollständig aufgeben )

20
Marcus Downing

Die Einstellungen, nach denen Sie suchen, sind:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://localhost:8080/
  ProxyPassReverse / http://localhost:8080/
</VirtualHost>

Beachten Sie, dass wir localhost als Proxy-Ziel verwenden. Wir können dies tun, da wir ProxyPreserveHost aktivieren. Die Dokumentation sagt das aus 

Dies ist vor allem in speziellen Konfigurationen nützlich, z. B. auf Proxy-Massennamen basierenden virtuellen Hosts, bei denen der ursprüngliche Hostheader vom Backend-Server ausgewertet werden muss.

das klingt genau so, wie Sie es tun.

38
Robert Munteanu

Wenn Sie mehrere Sites auf demselben Server wünschen, sollten Sie virtuelle Hosts in Ihrer Apache-Konfiguration verwenden. Hier ist ein Beispiel:

<VirtualHost *:80>
ServerName server.domain.com

ProxyRequests Off
<Proxy *>
    Order deny,allow
    Allow from all
</Proxy>

ProxyPass / http://server.domain.com:8080/
ProxyPassReverse / http://server.domain.com:8080/
<Location />
    Order allow,deny
    Allow from all
</Location>

Solange Sie server.domain.com in Ihrem externen DNS registriert haben, wird der Name des eingehenden Hosts in Client-URLs angezeigt. Ich verwende einen einzelnen Server, auf dem 6 separate Sites gehostet werden, einschließlich 3, die von Tomcat zurückgegeben werden, und verwenden diese Methode.

5
gareth_bowles

Sie können AJP weiterhin verwenden, und Sie sollten dies tun, da es schneller als HTTP ist. Stellen Sie sicher, dass Sie es in http.conf aktivieren:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

In diesem Fall funktioniert diese Konfiguration für mich:

<VirtualHost *:80>
  ServerName public.server.name

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / ajp://localhost:8080/
# ProxyPassReverse might not be needed,
# it's only for redirecting from inside.
#  ProxyPassReverse / ajp://localhost:8080/
</VirtualHost>
0
John Mikic