Apache: ProxyPass не работает, если запрос уже был обработан ProxyPass предыдущим сервером.

Вопрос или проблема

В нашей интрасети у меня есть два сервера в двух разных зонах.

Сервер 1 предоставляет лабораторную среду через веб-сервис ShellInABox.
ShellInABox открывает локальные порты, к которым Apache может подключаться через функцию прокси.

httpd.conf:

<VirtualHost *:443>
 DocumentRoot "/srv/www/htdocs"
 ServerName mydomain1.intranet1.de
 SSLEngine on
 SSLCertificateFile mycert.pem
 SSLCertificateKeyFile mycert.key
 SSLCertificateChainFile mycertchain.pem
 <IfModule mod_proxy.c>
  <Location /cola/siab/2001>
   ProxyPass http://127.0.0.1:4000/2001 timeout=900
  </Location>
  <Location /cola/siab/2002>
   ProxyPass http://127.0.0.1:4000/2002 timeout=900
  </Location>
...
 </IfModule>
</VirtualHost>

Когда я подключаюсь к https://mydomain1.intranet1.de/cola/siab/2001, все работает нормально, я подключаюсь к сервису ShellInABox.

На втором сервере с другим доменом я хочу (должен) использовать этот сервис с первого сервера через функцию прокси.

<VirtualHost *:443>
 DocumentRoot "/srv/www/htdocs"
 ServerName mydomain2.intranet2.de
 SSLEngine on
 SSLCertificateFile mycert.pem
 SSLCertificateKeyFile mycert.key
 SSLProxyEngine On
 <IfModule mod_proxy.c>
  <Location /cola>
   ProxyPass https://mydomain1.intranet1.de/cola timeout=900
  </Location>
 </IfModule>
</VirtualHost>

Теперь поведение следующее:

  • Из intranet1 я могу получить доступ ко всем файлам, доступным напрямую в подкаталоге /cola
  • Из intranet1 я могу получить доступ ко всем экземплярам ShellInABox в подкаталогах /cola/siab (2001, 2002, …)
  • Из intranet2 я могу получить доступ ко всем файлам, доступным напрямую в подкаталоге /cola
  • Из intranet2 я НЕ могу получить доступ к экземплярам ShellInABox в подкаталогах /cola/siab
    Я получаю HTTP404 от Apache на intranet1, Apache не использует указания ProxyPass и обращается к конфигурации вне VirtualHost.
    Apache на intranet2 вызывает правильный URL, если я использую этот URL на intranet1, он работает

В чем проблема и как ее можно исправить?

Спасибо/с уважением

Ответ или решение

Для решения проблемы с использованием ProxyPass в Apache между двумя серверами, где одна и та же служба передается через два прокси-сервера, важно понять основу настройки ProxyPass в Apache и возможные причины, по которым повторное проксирование может не сработать.

Теория

Apache HTTP Server предоставляет модуль mod_proxy, который позволяет настраивать сервер как прокси, передавая запросы от клиента к другому серверу. В частности, ProxyPass используется для маршрутизации части запросов, приходящих на определенные URL, к другому серверу или к другому ресурсу на том же сервере.

В вашей конфигурации первое проксирование происходит на сервере intranet1, где Apache перенаправляет запросы на локальные адреса (127.0.0.1) к службам, которые предоставляет ShellInABox. Вторичное проксирование пытается перенаправить запросы через сервер инстанции intranet2 к инстанции на intranet1, используя аналогичную ProxyPass конфигурацию.

Вот основные моменты, которые могут вызывать проблемное поведение:

  1. Сопоставление путей и проксирование: Одним из возможных источников проблем является неправильное сопоставление путей при использовании ProxyPass. Ваша настройка на intranet2 пытается проксировать запросы на https://mydomain1.intranet1.de/cola, но не все запросы могут быть правильно переданы к subdirectory точкам назначения, таким как /cola/siab/2001.

  2. SSL и безопасность: Поскольку оба сервера настроены для работы с SSL, возможно, необходимо убедиться, что конфигурация SSLProxyEngine правильно настроена и на обоих серверах разрешено перенаправление.

  3. Кеширование и распространение заголовков: При передаче через несколько прокси могут происходить проблемы, связанные с кешированием или изменением заголовков, которые могут влиять на авторизацию или перенаправление.

Примеры

Рассмотрим конкретный пример настройки, который, возможно, может исправить данное поведение. На стороне intranet1, убедитесь, что проксирование настроено на правильные субдиректории и включено ProxyPreserveHost:

<VirtualHost *:443>
    ...
    <Location /cola/siab/2001>
        ProxyPass http://127.0.0.1:4000/2001
        ProxyPassReverse http://127.0.0.1:4000/2001
    </Location>
    ...
</VirtualHost>

На сервере intranet2 примените следующее:

<VirtualHost *:443>
    DocumentRoot "/srv/www/htdocs"
    ServerName mydomain2.intranet2.de
    SSLEngine on
    SSLCertificateFile mycert.pem
    SSLCertificateKeyFile mycert.key
    SSLProxyEngine On

    <IfModule mod_proxy.c>
        <Location /cola/siab/>
            ProxyPass https://mydomain1.intranet1.de/cola/siab/
            ProxyPassReverse https://mydomain1.intranet1.de/cola/siab/
        </Location>
    </IfModule>
</VirtualHost>

Применение

  1. Проверьте правильность URL и путей: Убедитесь, что пути, указанные в ProxyPass и ProxyPassReverse, точно соответствуют путям на обоих серверах, поскольку любые несоответствия могут привести к ошибкам 404.

  2. Используйте директивы ProxyPassReverse: Присутствие ProxyPassReverse помогает справляться с изменениями в заголовках, возвращаемых backend сервером, чтобы клиенты могли вернуться к ожидаемым URL.

  3. Отладка и логи: Включите расширенное логирование на обоих серверах для изучения поведения запросов и для понимания, где и почему происходит сбой на каждом этапе маршрутизации.

  4. Конфигурация хостов и DNS: Убедитесь, что оба сервера могут разрешать имена друг друга и нет проблем с DNS. Используйте IP адреса, если это возможно и допустимо в пределах вашей сети.

  5. Обновления и совместимость: Убедитесь, что используемая версия Apache поддерживает все ваши текущие настройки и модификации, так как старые версии могут иметь баги или недостаточную поддержку новых функций.

Заключая, многоуровневое проксирование требует тщательного подхода к настройке периферийного сервера (точек маршрутизации), чтобы убедиться, что все запросы направляются и маршрутизируются корректно. Малейшие ошибки в пути или настройке SSL могут значительно повлиять на функциональность и доступность служб.

Оцените материал
Добавить комментарий

Капча загружается...