Обратный прокси-сервер и запрошенный URL-адрес, поддерживающий Tomcat

Обратный прокси-сервер и запрошенный URL-адрес, поддерживающий Tomcat

Я настроил инфраструктурную установку, в которой обратный прокси Apache завершает запросы SSL. Затем запросы проксируются на другой веб-сервер Apache frontend, а затем этот снова подключается через mod_jk/AJP к tomcat. Настройка, похоже, проходит гладко без единого исключения. Tomcat обслуживает веб-сервисы WSDL, и в этих файлах XML один тег включает местоположение хоста, которое должно быть идентично запрошенному URL.

Из-за текущей настройки местоположение хоста представляет внутренний URL-адрес (подключенного через ajp) фронтенд-сервера, а не запрошенный внешний URL-адрес. Первой попыткой решить эту проблему было размещение внешнего URL-адреса в качестве прокси-URL-адреса в tomcats server.xml, но этот метод не распознает запросы HTTP или HTTPS. Мне нужно определить один из них.

Кроме того, в настоящее время сервисы также доступны через другие фронтенд-серверы с совершенно другими URL-адресами (более простая настройка без обратного прокси-сервера).

Надеюсь, я описал свою проблему понятно. Как мне сообщить tomcat о запрошенном URL или, может быть, мне следует передать запрошенный URL на frontend apache? Я немного застрял на данный момент.

Заранее спасибо.

/редактировать

Краткий обзор последовательности запроса:

**customerX** -- REQUEST HTTP|HTTPS -- **host.external/customerX** -- PASS HTTP -- **customerX.internal** -- AJP -- **tomcat**

ProxyPreserveHost включенне срабатывает, поскольку передает 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>

Связанный контент