如何让httpd转发到不同网址的多个tomcats,包括/?

时间:2011-03-11 09:34:39

标签: tomcat apache mod-jk

确定

所以我在几个AJP端口上设置了多个tomcat实例,我还在端口8090上监听了Apache httpd(因为我现在已经有另一个应用程序使用了8080)。

我已经使用Jk Mount和以下vhosts配置成功地将mydomain.com:8090/demo和mydomain.com:8090/preprod等网址映射到各自的tomcat实例;

<VirtualHost *:8090>
    JkMount /preprod* preprod
    JkMount /demo* demo
</VirtualHost>

但我也希望“root”地址映射到另一个tomcat实例,什么将成为live / production,即我希望mydomain.com:8090/映射第三个tomcat实例。

如果我只是在上面的配置中添加一行,那么当前没有任何反应或改变;

JkMount /* rootwar

如果我浏览到mydomain.com:8090我只是得到了同样无聊的apache httpd登陆页面让我知道它的运行(即httpd / htdocs中的index.html)

是否可以使用JkMount将“root”地址内容重定向到tomcat实例?

我可以看到像/ *这样的规则也会匹配像mydomain.com/preprod这样的网址,但是我希望这些规则按顺序应用,所以如果/ *出现在最后它实际上会是“如果它不是一个其他环境,然后直接到root / production“

为了清楚起见我正试图设置以下内容;

mydomain.com:8090/preprod --> myApp running in tomcat1
mydomain.com:8090/demo    --> myApp running in tomcat2
mydomain.com:8090         --> myApp running in tomcat3

3 个答案:

答案 0 :(得分:1)

好的,事实证明我对JkMount内容的堕落是正确的,因此配置就像;

<VirtualHost *:8090>
    JkMount /preprod* preprod
    JkMount /demo* demo
    JKMount /* root
</VirtualHost>

工作得很好,带有/ preprod的urls到tomcat1,/ demo进入tomcat2,其他任何东西都转到tomcat3 for root。因此,JkMount / *根行显然是最后一个尝试过的规则,如果没有其他规则与url匹配,则只能“捕获所有”(cos / *)。

答案 1 :(得分:0)

我暂时没有使用jk的东西,但据我记得这是不可能的。我们通常通过添加一个重定向到/ root jk mount的小html页面来解决这个问题。也许使用mod_rewrite规则也可能有用。

这样的事情:

RewriteEngine on
RewriteRule ^/?(.+)$ /root/$1 

也可以使用更复杂的重写规则隐藏重定向,可以在此处找到一个示例:

http://www.webmasterworld.com/apache/4277304.htm

答案 2 :(得分:0)

好的 - 不是你的问题的直接答案,但......另一种方法是在不同的实例中运行每个demo / preprod和prop,每个实例位于不同的端口上。

这样可以简化您的配置,但更重要的是,您可以对每个实例进行更改(例如,弹回服务器),而不必担心影响生产实例并使其脱机。

Jetty也非常适合这样的情况,特别是对于运行快速和脏的开发和演示实例....你可以编写一个非常简单的脚本,基本上只指向部署并在其上启动一个jetty实例端口:

public static void run(int port, String resourceBase, String descriptor) {
    Server server = new Server(port);

    WebAppContext context = new WebAppContext();
    context.setResourceBase(resourceBase);
    context.setDescriptor(descriptor);
    context.setContextPath("/");
    context.setParentLoaderPriority(true);
    server.setHandler(context);

    try {
        server.start();
        server.join();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

其中

  • resourceBase 是/ path / to / webapp
  • descriptor 通常是resourceBase +“/ WEB-INF / web.xml”