将多个应用程序部署到Tomcat

Dón*_*nal 34 tomcat war

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

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

kap*_*pex 68

如果希望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>
Run Code Online (Sandbox Code Playgroud)

webapps您需要foo为端口80bar端口创建目录,而不是将war文件放在目录中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.

  • 感谢您的回应,您提到的`foo`和`bar`目录是否应在`webapps`下创建? (2认同)
  • 我会在其他地方创建它们,否则,如果其他连接器仍将webapps用作appBase,则该应用程序可能会部署两次。 (2认同)

Bas*_*que 29

无需更改端口

Java Servlet技术的目的是使用多个运行的Web应用程序中的任何一个来跨多个用户处理多个传入请求和传出响应.所有流量都可以在单个端口上处理.

只需将两个war文件放入Tomcat的webapps文件夹即可.这就是你需要做的.

默认情况下,Tomcat将每次战争(技术上称为zip文件)扩展("爆炸")到一个文件夹中,并自动为您部署应用程序.如果Tomcat已经运行,或者在启动Tomcat时启动时,会发生这种情况.有些人关闭了生产的自动部署功能,以便为Tomcat保存扫描新war文件的工作.

无需多个端口.Servlet容器的工作是检查URL并确定应该调用哪个Servlet.

默认情况下,war文件的名称确定URL.举个例子:

所有Web应用程序都可以在同一个端口上提供.您唯一关心的是如果您使用Unix风格的操作系统来保护对低编号端口的访问.这包括Mac OS X,BSD,Linux和Solaris.在URL中使用高编号端口(Tomcat默认为8080),或使用端口转发将端口80(Web浏览器的默认)上的传入请求发送到Tomcat的端口(例如8080).

如果您想要使用不同域提供的war文件,请了解Tomcat中的"虚拟主机"设置.

  • 虽然它没有解决问题的具体要点,但它是一个很好的解释,并澄清了一般的servlet容器的一些基本概念.感谢@Dónal的努力和时间 (4认同)
  • 我很感激你投入的时间,但它没有回答我的任何一个问题(1)是否有可能将不同的应用程序部署到同一个Tomcat实例上侦听不同的端口?(2)如果将应用程序部署到Tomcat的根上下文,它是否会处理发送到该Tomcat实例的所有HTTP请求? (2认同)

Jef*_*ler 5

我已成功配置 Tomcat 以在多个端口上运行应用程序。我不知道这是否是最好的方法,但我只是复制了内容

<Service>...</Service>
Run Code Online (Sandbox Code Playgroud)

在conf/server.xml 中,更改了连接器标记的端口并更改了主机标记的appBase属性。您可以根据应用程序部署到的appBase来控制应用程序在哪个端口上运行。