我的团队编写了一个内部 BI 服务器,它在/users/daily
或等链接处生成 HTML 报告/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 servlet 提供服务。
服务器成功了,我想将其部署三次,部署到 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
。
我尝试了一些 ApacheRewriteRule
和ProxyPass
规则,但找不到有效的组合。
如何在 Apache 中执行基于后缀的内部路由,并使内部链接有效?
答案1
你可以这样做
<Location /dev>
RewriteEngine on
RewriteRule ^/dev/(.*) /$1
ProxyPass / http://localhost:8080/ nocanon
ProxyPassReverse / http://localhost:8080/
</Location>
等等。这将为不同的 URL 提供不同的代理,并从 URL 中删除前导 /dev、/staging 或 /prod。
但有一个问题:从 Tomcat 返回的 HTML 中的链接将具有 / 的 URL 基础,而不是 /dev 等。要将前缀添加回 HTML,您必须使用mod_proxy_html或者等效地解析 HTML,修改它,然后重新组合。这可以工作,但会降低性能;格式错误的 HTML 可能会被破坏;您还必须用 CSS 和 Javascript 重写 URL;并且 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>
等等。