Моя команда написала внутренний 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 RewriteRule
s и 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>
и так далее.