一尘不染

将多个应用程序部署到Tomcat

tomcat

我希望部署两个应用程序foo.war,并bar.war在同一Tomcat实例。他们是否有可能侦听不同端口上的连接,例如foo侦听端口81而bar侦听端口82?如果是这样,我该如何配置?我意识到,应用程序不必在不同的端口上进行侦听,但这就是我想要实现的目标。

另外,我是说对了,如果我重命名foo.warROOT.war可以在根上下文中运行的名称,那么对Tomcat实例的所有请求都将由foo应用处理,因此bar必须部署到单独的Tomcat实例?


阅读 240

收藏
2020-06-16

共1个答案

一尘不染

如果希望Tomcat侦听多个端口,则需要为每个端口设置一个 连接器 。为了将每个端口映射到不同的应用程序,您需要将每个连接器包装在 服务中
并使用其自己的 主机 创建一个 主机appBase

中的服务定义示例server.xml

<Service name="foo">
    <Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol" />
    <Engine name="Catalina80" defaultHost="localhost">
        <Host name="localhost" appBase="foo" unpackWARs="true" autoDeploy="true" />
    </Engine>
</Service>

<Service name="bar">
    <Connector port="81" protocol="org.apache.coyote.http11.Http11NioProtocol" />
    <Engine name="Catalina81" defaultHost="localhost">
        <Host name="localhost" appBase="bar" unpackWARs="true" autoDeploy="true" />
    </Engine>
</Service>

无需将war文件拖放到webapps目录中,您需要foo为port 80barport
创建目录81。命名两个war文件ROOT.war并将它们放在自己的基本目录中。当然,如果需要,您可以在每个目录中有多个应用程序。

中定义的目录appBase是相对于tomcat目录的。通过使用绝对路径,它可以在系统上的任何位置。从文档中

appBase

此虚拟主机的 Application Base
目录。这是目录的路径名,该目录可能包含要在此虚拟主机上部署的Web应用程序。您可以指定绝对路径名,也可以指定相对于$CATALINA_BASE目录的路径名。[…]如果未指定,webapps将使用默认值。

另一个选择是保留默认的tomcat配置,并使用另一个http服务器(apache,nginx,lighttpd等)将端口映射到tomcat应用程序的内部路径。

根应用程序不会收到与其他应用程序匹配的请求,例如/foo/example将转到foo.war/example/example将转到ROOT.war

2020-06-16