前提
在安装了最新 Apache2 的 Ubuntu 16.04 服务器上,我有不同的虚拟主机,
每个虚拟主机都经过正确配置(并使用 Let's Encrypt 进行保护):
- /etc/apache2/sites-enabled/my.site.com-le-ssl.conf
- /etc/apache2/sites-enabled/my.other.site.com-le-ssl.conf
指向下面的静态内容:
- /var/www/my.site.com/
- /var/www/my.other.site.com/
这很好用:
通过调用,https://my.site.com/
我看到了包含在中的静态站点/var/www/my.site.com/
。
然后我安装了 Tomcat 8.5.9和使用反向代理保护它,因此添加:
<VirtualHost *:443>
. . .
JKMount /* ajp13_worker
. . .
</VirtualHost>
到 /etc/apache2/sites-enabled/my.site.com-le-ssl.conf。
这也很好用:
通过https://my.site.com/
现在的调用,我可以看到 Tomcat 主页。
期望目标
我想要达到以下结果:
- 通过调用
https://my.site.com/
我想要查看静态站点(/var/www/my.site.com/
); - 通过调用
https://my.site.com/dynamic
我希望看到 Tomcat 主页;
因此,通过调用https://my.site.com/dynamic/myApp
我希望运行myApp.war
在下发布的tomcat/webapps
;
尝试的解决方案
我的想法如下:
使 Apache JKMount 仅具有上下文的请求
/dynamic
,因此而不是:<VirtualHost *:443> . . . JKMount /* ajp13_worker . . . </VirtualHost>
,我用过:
<VirtualHost *:443> . . . JKMount /dynamic/* ajp13_worker . . . </VirtualHost>
和这似乎有效,在 Apache 端;调用my.site.com
将打开静态内容,而调用my.site.com/dynamic
将导致 Tomcat 404。
现在我需要重写 URL 以删除上下文dynamic
,以使其对 Tomcat 透明,并且我在过去 3 个小时里尝试使用Tomcat RewriteValve:
我已
tomcat/conf/server.xml
通过添加 Valve 进行编辑:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> . . . <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host>
我已经创建了一个
tomcat/conf/Catalina/localhost/rewrite.config
文件,其中包含正确的规则(经过测试这里):RewriteRule ^dynamic/(.+)$ /$1
由于某种原因,这不起作用。Tomcat 的 RewriteValve 规则要么被忽略,要么出现故障,要么我对整个事情的看法有问题... 我不是系统管理员,所以我不会对这里的一些幼稚错误感到惊讶。
您知道问题出在哪里吗?或者还有其他方法可以解决这个问题?
答案1
我已经通过使用mod_proxy_ajp
而不是解决了这个问题mod_jk
。
阿帕奇的my.site.com-le-ssl.conf
<VirtualHost *:443>
. . .
ProxyPass /dynamic/ ajp://localhost:8009/
ProxyPassReverse /dynamic/ ajp://localhost:8009/
. . .
</VirtualHost>
Tomcat 的重写配置
RewriteRule ^dynamic(.+)$ dynamic/$1/ [R]
现在它可以按预期工作了。