Назад | Перейти на главную страницу

Прокси-сервер Apache2 сохраняет доменное имя

Я пытаюсь реализовать схему 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), никаких дополнительных настроек не потребуется.