2012-08-07 11 views
12

Folks, Wir versuchen, Apache-Setup Proxy für das folgende Szenario umkehren:ProxyPassMatch mit Proxypassreverse

  • Eingehende Anfragen in Form http://foo.com/APP/v1/main.html
  • Für einige Server die URL einen Unterschied Version verweisen wird, sagen wir, http://foo.com/APP/v2/main.html
  • Ein Upstream Load Balancer (HAProxy) sendet die Anfrage an den richtigen Server, der einen Apache2 Reverse Proxy für einen JBoss Server hat.
  • Wenn die Anforderung an Apache 2 erscheint es wird Anforderungsweg wie /APP/v1/main.html
  • Wir es wollen, müssen (rückwärts) Proxy, um http://localhost:8080/AppContext/main.html, unabhängig Version Fragment in URL (v1, v2, etc.).

Ich habe versucht, dies zu tun, wie so:

ProxyPassMatch ^/.*?/APP.*?/(.*)$ http://localhost:8080/AppContext/$1 
ProxyPassReverse /APP http://localhost:8080/AppContext 

Meine Fragen sind:

  1. Ist meine Verwendung von ProxyPassMatch richtig?
  2. Mein ProxyPassReverse ist "statisch". Wie mache ich es auf die potenziell variablen Sachen nach /APP aufmerksam?

Danke für irgendwelche Einblicke.

-Raj

Antwort

8

Sie sind in der Nähe, versuchen Sie die regex Ändern ein wenig für die Version Fragment zu berücksichtigen:

ProxyPassMatch ^/.*?/APP.*?/v[0-9]+/(.*)$ http://localhost:8080/AppContext/$1 

Die ProxyPassReverse ist meist das Umschreiben on-the-fly von Standort, um sicherzustellen, Header-Felder in den Antworten der Proxy-App. Also, wenn es eine 301 Umleitung zu, sagen wir, http://localhost:8080/AppContext/something zurückgibt, weiß Apache, es in /APP/v1/something zu ändern, so dass Informationen hinter dem Proxy nicht offengelegt werden. Da Sie eine dynamische URL im Reverse-Proxy verwenden, haben Sie hier einige Auswahlmöglichkeiten. Sie können es entweder an den HAProxy Load Balancer senden (nicht sicher, wo das für Sie ist), oder Sie können nur einen auswählen und auf das Beste hoffen. Zum Beispiel, wenn Sie einen Load Balancer an /APP/balancer/ haben, die dann sendet Anfragen an /APP/v1/, /APP/v2/, /APP/v3/ etc. Dann können Sie dies tun:

ProxyPassReverse /APP/balancer http://localhost:8080/AppContext 

Andernfalls können Sie zeigen es nur auf ein und Hoffnung für die am besten:

ProxyPassReverse /APP/v1 http://localhost:8080/AppContext 
+0

Danke Jon für die schnelle Antwort. Wir versuchen, unsere Apache-Konfiguration frei von versionsspezifischen Einträgen zu halten, um eine homogene Vorlage zu erhalten, die frei im Cluster eingesetzt werden kann. Es sieht so aus, als ob die ProxyPassReverse-Sache nicht zuverlässig durchgeführt werden kann. Würden Sie vorschlagen, dies durch eine Art Rewrite-Modul zu erreichen? – Raj

+0

@Raj Rewrite wird nicht helfen, denn das ist in die andere Richtung. Der App-Server versucht, eine Anfrage umzuleiten, er weiß nichts über die tatsächliche URL, die für den Zugriff verwendet wird, also sagt er einfach: "Gehe zu http: // localhost: 8080/AppContext/something", dem Browser gibt einen 404 zurück, da auf dem Computer, auf dem der Browser läuft, kein Anwendungsserver auf dem Port 8080 des lokalen Hosts ausgeführt wird –