Я пытаюсь реализовать схему Browser Client -> Apache2 Proxy -> Tomcat Application Server. Apache2 и Tomcat на разных серверах. Но прокси работает не так, как я ожидал. Настройка виртуального хоста Apache2:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPass /MyApp http://tomcatdomain.com/MyApp
ProxyPassReverse /MyApp tomcatdomain.com/MyApp
</VirtualHost>
если я сделаю запрос на открытие страницы в браузере, http://example.com/MyApp, приложение открывается правильно, но URL другой - http://tomcatdomain.com/MyApp. Затем я смотрю запрос Ajax и вижу, что он не работает по ожидаемой мной схеме:
12:35:20.537 GET https://example.com/MyApp/service/test [HTTP/1.1 302 41ms]
12:35:20.617 GET https://tomcatdomain.com/MyApp/service/test
Ожидается: [запрос] клиент-> apache2-> tomcat [ответ] tomcat-> apache2-> клиент
Фактически: [запрос] клиент-> apache2 [ответ] apache2-> клиент [запрос2] клиент -> tomcat [ответ2] tomcat -> клиент
Мой первый вопрос: как заставить клиента получать ответ от томката одним запросом?
Следующая проблема с параметром ProxyPreserveHost - мне нужно сохранить исходный url (example.com) при открытии приложения (а не tomcatdomain.com). Я добавляю ProxyPreserveHost в параметр appache2:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPreserveHost On
ProxyPass /MyApp http://tomcatdomain.com/MyApp
ProxyPassReverse /MyApp tomcatdomain.com/MyApp
</VirtualHost>
Я также подготовил tomkat server.xml:
<Host name="example.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias>www.example.com</Alias>
<Context path="" docBase="MyApp"/>
</Host>
Я делаю запрос и что вижу в браузере:
Страница не перенаправляет должным образом. Firefox обнаружил, что сервер перенаправляет запрос на этот адрес таким образом, который никогда не будет завершен.
Я делаю запрос AJAX и вижу 22 идентичных запроса, на которые нет ответа:
12:54:48.020 GET https://example.com/MyApp/service/test [HTTP/1.1 302 28ms]
12:54:48.042 GET https://example.com/MyApp/service/test [HTTP/1.1 302 4ms]
... 22 requests!
12:54:48.367 GET https://example.com/MyApp/service/test [HTTP/1.1 302 3ms]
Я делаю вывод, что запрос не перенаправляется на сервер tomcat.
Чтобы подтвердить свои догадки, я исправил настройки Apache2:
<VirtualHost *:80 *:443>
ServerName example.com
ServerAlias www.example.com
ProxyPreserveHost On
ProxyPass /MyApp http://tomcatdomain.com/MyApp**ABCD**
ProxyPassReverse /MyApp tomcatdomain.com/MyApp**ABCD**
</VirtualHost>
И в браузере я вижу: Not Found Запрошенный URL / MyAppABCD не был найден на этом сервере. Сервер Apache / 2.4.27 (Ubuntu) на порт 80 example.com
Apache2 ищет сопоставление URL-адресов не на tomcat, а на том же apache2?
Подскажите, пожалуйста, как реализовать схему, когда браузер откроет страницу, данные будут получены от Tomcat через прокси Apache2, а исходный URL будет сохранен? Спасибо.
Проблема заключалась в самоподписанных сертификатах на Apache2 и Tomcat. Необходимо было сделать перекрестную сертификацию. Если вы удалите шифрование (SSL или TLS) между Apache2 и Tomcat (НЕ! WWW и Apache2), никаких дополнительных настроек не потребуется.