Обратный прокси и запрошенный URL-адрес
Я настроил настройку инфраструктуры, в которой обратный прокси-сервер apache завершает запросы SSL. Затем запросы передаются на другой веб-сервер Apache внешнего интерфейса, а затем снова этот подключается через mod_jk/AJP к коту. Кажется, что установка проходит гладко без единого исключения. Tomcat обслуживает веб-сервисы WSDL, и в этих XML-файлах один тег содержит местоположение хоста, которое должно быть идентично запрошенному URL-адресу.
Из-за текущей настройки расположение хоста представляет собой внутренний URL-адрес (подключенного через ajp) веб-сервера, а не запрошенный внешний URL-адрес. Первой попыткой решить эту проблему было размещение внешнего URL-адреса как URL-адреса прокси в tomcats server.xml, но этот метод не знает о запросах HTTP или HTTPS. Я должен определить один.
Кроме того, службы в настоящее время также доступны через другие внешние серверы с совершенно другими URL-адресами (более простая настройка без обратного прокси-сервера).
Надеюсь, я описал свою проблему понятной. Как я могу сообщить коту о запрошенном URL или, может быть, я должен передать запрошенный URL внешнему Apache? Я немного застрял на данный момент.
Заранее спасибо.
/редактировать
Краткий обзор последовательности запросов:
**customerX** -- REQUEST HTTP|HTTPS -- **host.external/customerX** -- PASS HTTP -- **customerX.internal** -- AJP -- **tomcat**
ProxyPreserveHost On не работает, потому что он передает host.external внешнему Apache, и нет виртуального хоста, который соответствует этому виртуальному хосту, что приводит к ошибке 404 - самоочевидно.
Конфиг совсем не особенный. Внешний доступный обратный прокси-сервер имеет 2 виртуальных хоста (HTTP|HTTPS). Оба виртуальных хоста знают о каждом клиенте, которого мы обслуживаем, в контексте /customerX, /customerY и так далее. Например, виртуальный хост HTTP:
<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>
Я знаю, вторая строка неявная.
На втором apache есть один виртуальный хост (только HTTP) для каждого клиента с соответствующим именем сервера и необходимыми JkMounts для веб-приложений tomcats:
<VirtualHost *:80>
ServerName customerX.internal
JkMount ...
</VirtualHost>