Моя команда записала внутренний сервер BI, который генерирует отчеты HTML в ссылках такой как /users/daily
или /updates/questions
.
Сервер записан в Grails, и он работает отлично с классической установкой 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>
и т.д.
.