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

Apache: прокси на основе суффиксов URL

Моя команда написала внутренний BI-сервер, который генерирует отчеты в формате HTML по таким ссылкам, как /users/daily или /updates/questions.

Сервер написан на Грааль, и он отлично работает с классической настройкой Apache-Tomcat:

ProxyPass         /     http://localhost:8080/ nocanon
ProxyPassReverse  /     http://localhost:8080/

Так

https://example.com/users/daily

Проксируется внутри

http://localhost:8080/users/daily

И обслуживается из сервлета Tomcat.

Сервер работает успешно, и я хотел бы развернуть его трижды в 3 разных системах, различающихся суффиксом URL (/dev, /stg, /prod):

Означающий, что https://example.com/dev/users/daily будет проксироваться из http://localhost:8080/users/daily, и https://example.com/prod/users/daily будет обслуживаться из http://localhost:8082/users/daily.

Я пробовал Apache RewriteRules и ProxyPass норм, но не смог найти рабочую комбинацию.

Как я могу выполнить внутреннюю маршрутизацию на основе суффиксов в Apache с рабочими внутренними ссылками?

Вы можете сделать это с помощью

<Location /dev>
  RewriteEngine on
  RewriteRule  ^/dev/(.*)  /$1
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
</Location>

и так далее. Это даст вам разные прокси для разных URL-адресов и удалит ведущие / dev, / staging или / prod из URL-адресов.

Но есть проблема: ссылки в HTML, возвращаемые из Tomcat, будут иметь базу URL-адресов /, а не / dev и т. Д. Чтобы добавить префикс обратно в HTML, вам нужно будет использовать mod_proxy_html или эквивалент, чтобы проанализировать HTML, изменить его и собрать вместе. Это может сработать, но есть затраты на производительность; неправильно сформированный HTML может быть искажен; вам также придется переписывать URL-адреса в CSS и Javascript; и Javascript может быть невозможно исправить.

Другой вариант, который может быть проще: создать новые имена хостов в DNS: dev.biserver.example.com, staging.biserver.example.com и prod.biserver.example.com. Тогда переопределение URL-адресов исчезнет, ​​и вы сможете делать все с виртуальными хостами, например:

<VirtualHost *:443>
  ServerName dev.biserver.example.com
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
</VirtualHost>

и так далее.