
Ich habe ein Infrastruktur-Setup konfiguriert, bei dem ein Apache-Reverse-Proxy SSL-Anfragen beendet. Dann werden die Anfragen an einen anderen Frontend-Apache-Webserver weitergeleitet und dieser wiederum ist über mod_jk/AJP mit einem Tomcat verbunden. Das Setup scheint ohne Ausnahme reibungslos zu laufen. Der Tomcat bedient WSDL-Webdienste und in diesen XML-Dateien enthält ein Tag den Host-Standort, der mit der angeforderten URL identisch sein sollte.
Aufgrund der aktuellen Konfiguration stellt der Host-Standort die interne URL des (mit AJP verbundenen) Frontend-Webservers dar und nicht die angeforderte externe URL. Ein erster Versuch, dieses Problem zu lösen, bestand darin, die externe URL als Proxy-URL in Tomcats server.xml anzulegen, aber diese Methode erkennt keine HTTP- oder HTTPS-Anfragen. Ich muss eine finden.
Darüber hinaus sind die Dienste derzeit auch über andere Frontend-Server mit völlig anderen URLs erreichbar (ein einfacheres Setup ohne Reverse-Proxy).
Ich hoffe, ich habe mein Problem verständlich beschrieben. Wie kann ich den Tomcat auf die angeforderte URL aufmerksam machen oder sollte ich die angeforderte URL vielleicht an das Frontend Apache weitergeben? Ich bin im Moment etwas ratlos.
Dank im Voraus.
/bearbeiten
Ein kurzer Überblick über den Anforderungsablauf:
**customerX** -- REQUEST HTTP|HTTPS -- **host.external/customerX** -- PASS HTTP -- **customerX.internal** -- AJP -- **tomcat**
ProxyPreserveHost Einfunktioniert nicht, da es host.external an das Frontend-Apache übergibt und es keinen virtuellen Host gibt, der mit diesem virtuellen Host übereinstimmt, was zu einem 404-Fehler führt – selbsterklärend.
Die Konfiguration ist überhaupt nicht speziell. Der von außen zugängliche Reverse-Proxy hat 2 virtuelle Hosts (HTTP|HTTPS). Beide virtuellen Hosts kennen jeden Kunden, den wir über den Kontext /customerX, /customerY usw. bedienen. Beispiel: der virtuelle HTTP-Host:
<VirtualHost *:80>
ServerName host.external
ProxyPass /customerX http://customerX.internal
ProxyPassReverse /customerX http://customerX.internal
ProxyPass /customerY http://customerY.internal
ProxyPassReverse /customerY http://customerY.internal
...
</VirtualHost>
Ich weiß, die zweite Zeile ist implizit.
Auf dem zweiten Apache gibt es für jeden Kunden einen virtuellen Host (nur HTTP) mit dem entsprechenden Servernamen und den notwendigen JkMounts für Tomcat-Webanwendungen:
<VirtualHost *:80>
ServerName customerX.internal
JkMount ...
</VirtualHost>