前提

前提

前提

在安装了最新 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]

现在它可以按预期工作了。

相关内容