我希望部署两个应用程序foo.war,并bar.war在同一Tomcat实例。他们是否有可能侦听不同端口上的连接,例如foo侦听端口81而bar侦听端口82?如果是这样,我该如何配置?我意识到,应用程序不必在不同的端口上进行侦听,但这就是我想要实现的目标。
foo.war
bar.war
另外,我是说对了,如果我重命名foo.war为ROOT.war可以在根上下文中运行的名称,那么对Tomcat实例的所有请求都将由foo应用处理,因此bar必须部署到单独的Tomcat实例?
ROOT.war
如果希望Tomcat侦听多个端口,则需要为每个端口设置一个 连接器 。为了将每个端口映射到不同的应用程序,您需要将每个连接器包装在 服务中 并使用其自己的 主机 创建一个 主机appBase。
appBase
中的服务定义示例server.xml:
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 80和barport 创建目录81。命名两个war文件ROOT.war并将它们放在自己的基本目录中。当然,如果需要,您可以在每个目录中有多个应用程序。
webapps
foo
80
bar
81
中定义的目录appBase是相对于tomcat目录的。通过使用绝对路径,它可以在系统上的任何位置。从文档中:
appBase 此虚拟主机的 Application Base 目录。这是目录的路径名,该目录可能包含要在此虚拟主机上部署的Web应用程序。您可以指定绝对路径名,也可以指定相对于$CATALINA_BASE目录的路径名。[…]如果未指定,webapps将使用默认值。
此虚拟主机的 Application Base 目录。这是目录的路径名,该目录可能包含要在此虚拟主机上部署的Web应用程序。您可以指定绝对路径名,也可以指定相对于$CATALINA_BASE目录的路径名。[…]如果未指定,webapps将使用默认值。
$CATALINA_BASE
另一个选择是保留默认的tomcat配置,并使用另一个http服务器(apache,nginx,lighttpd等)将端口映射到tomcat应用程序的内部路径。
根应用程序不会收到与其他应用程序匹配的请求,例如/foo/example将转到foo.war,/example/example将转到ROOT.war。
/foo/example
/example/example