Я пытаюсь реализовать схему Клиент браузера -> Прокси Apache2 -> Сервер приложений Tomcat. 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-> client
Собственно: [запрос] клиент-> apache2 [ответ] apache2-> клиент [запрос2] клиент -> tomcat [ответ2] tomcat -> клиент
Мой первый вопрос - как заставить клиента получать ответ от tomkat с одним query?
Следующая проблема с параметром 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>
И в браузере я вижу: не обнаружена Запрошенный URL / MyAppABCD не найден на этом сервере. Сервер Apache / 2.4.27 (Ubuntu) на example.com Порт 80
Apache2 ищет отображение URL не на tomcat, а на том же apache2?
Подскажите, пожалуйста, как реализовать схему, когда браузер открыть страницу, данные будут получены от Tomcat через прокси Apache2, и исходный URL будет сохранен? Спасибо.
Проблема заключалась в самозаверяющих сертификатах на Apache2 и Tomcat. Пришлось сделать перекрестную сертификацию. Если вы удалите шифрование (SSL или TLS) между Apache2 и Tomcat (НЕ! WWW и Apache2), никаких дополнительных настроек не потребуется.