如何在不同端口后面的单个 Tomcat 实例上运行不同的应用程序?

Posted

技术标签:

【中文标题】如何在不同端口后面的单个 Tomcat 实例上运行不同的应用程序?【英文标题】:How to run different apps on single Tomcat instance behind different ports? 【发布时间】:2012-02-08 01:06:27 【问题描述】:

目前我有 2 个 web 应用程序 app1 和 app2 在 Tomcat 6 上运行:

app1 在http://localhost:8080/app1 上 app2 在http://localhost:8080/app2

我想配置 Tomcat,以便它们在单独端口后面的根上下文中运行:

app1 在http://localhost:8081 app2 在http://localhost:8082

需要做什么?

【问题讨论】:

我不认为这是可能的,除非你有另一个实例,我已经投票了,让我们看看有没有其他想法。 我真的只想使用一个tomcat实例。我们的团队都在尝试使用单个实例。我听说 server.xml 中有一些内容需要更改,但不知道该怎么做。 【参考方案1】:

我认为你可以在 server.xml 文件中配置它并放置 2 个服务:

<Service name="app1">
   <Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" 
           connectionTimeout="20000" 
           redirectPort="8443" />
   <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="app1"
        unpackWARs="true" autoDeploy="true">
      </Host>
   </Engine>
</Service>
<Service name="app2">
   <Connector port="8082" protocol="org.apache.coyote.http11.Http11NioProtocol" 
           connectionTimeout="20000" 
           redirectPort="8443" />
   <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="app2"
        unpackWARs="true" autoDeploy="true">
      </Host>
   </Engine>
</Service>

【讨论】:

上面的日志似乎给出了更好的结果,但仍然有这个错误:2012 年 1 月 11 日下午 12:58:13 org.apache.catalina.core.StandardContext resourcesStart 严重:启动静态资源时出错java.lang.IllegalArgumentException:文档库 C:\Program Files\Tomcat6\app1\host-manager 不存在或不是 org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142) 处的可读目录/跨度> 我将把它标记为已接受的答案;虽然我无法让错误消息消失,但我至少可以让 Tomcat 启动。如果有人有时间解决这个问题,请让我们知道您的结果。当然,另一种选择是运行 2 个 Tomcat 实例,正如该线程中其他人所指出的那样。 文档说特定服务器内的每个引擎都应该有唯一的名称 (tomcat.apache.org/tomcat-7.0-doc/config/engine.html) 所以我投票给@speeves 答案 本例中两个服务的重定向端口相同,是故意的吗? 我们必须在哪里保存目录 app1 和 app2 ?内部网络应用或外部网络应用【参考方案2】:

另外一个添加连接器的例子:

<Service name="reciver">
    <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="10" 
               enableLookups="false" acceptCount="100"
               connectionTimeout="10000" disableUploadTimeout="true" 
               useBodyEncodingForURI="true"/>
    <Engine name="reciver" defaultHost="localhost" jvmRoute="host1">
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                   resourceName="UserDatabase" />
            <Host name="localhost" appBase="webapps" unpackWARs="true"
                  autoDeploy="false" xmlValidation="false"
                  xmlNamespaceAware="false">
                    <Context docBase="browser" path="/browser" reloadable="false"/>
            </Host>
    </Engine>
</Service>
<Service name="reciver2">
    <Connector port="8081" maxHttpHeaderSize="8192" maxThreads="10" 
               enableLookups="false" acceptCount="1"
               connectionTimeout="10000" disableUploadTimeout="true" 
               useBodyEncodingForURI="true" proxyName="example.pt" proxyPort="80"/>
    <Engine name="reciver2" defaultHost="example_app" jvmRoute="host2">
            <Host name="example_app" appBase="test_app/example_app" unpackWARs="true"
                  autoDeploy="false" xmlValidation="false"
                  xmlNamespaceAware="false">
                    <Context docBase="example_app" path="/example_app" reloadable="false"/>
            </Host>
    </Engine>
</Service>
(...Repeted 2 more times.)

取自:http://www.coderanch.com/t/84172/Tomcat/listen-multiple-ports

我建议阅读整个线程,因为它讨论了此配置的性能命中,以及可能的竞争条件。

【讨论】:

这对我有帮助。非常好:) 这个答案最适合我,因为我想要一组单独的日志、单独的 Catalina/localhost/*.xml 上下文、单独的 appBase。我添加了一个 来获取单独的日志【参考方案3】:

除了运行两个 Tomcat 实例并使用 ROOT 应用程序(已经说过,这是一个有点糟糕和无效的解决方案)之外,您还可以通过使用 Apache + Tomcat 来实现它。配置 apache 监听两个端口并通过 IP:Port 转发到不同的 Tomcat 应用程序。但是你需要一个不同的端口 por tomcat!

Apache 配置

listen 8080,8081
...
<VirtualHost *:8080>
    ServerName localhost
    ProxyPass / http://localhost:8888/app1
    ProxyPassReverse / http://localhost:8080/app1
</VirtualHost>

<VirtualHost *:8081>
    ServerName localhost
    ProxyPass / http://localhost:8888/app2
    ProxyPassReverse / http://localhost:8080/app2
</VirtualHost>

listen 80,81
...
<VirtualHost *:80>
    ServerName localhost
    ProxyPass / http://localhost:8080/app1
    ProxyPassReverse / http://localhost:8080/app1
</VirtualHost>

<VirtualHost *:81>
    ServerName localhost
    ProxyPass / http://localhost:8080/app2
    ProxyPassReverse / http://localhost:8080/app2
</VirtualHost>

【讨论】:

问题是,我没有安装 apache,我们的团队也没有这样做的计划。 在以前的位置,我们将 Big-Ip F5s 直接运行到 tomcat 中以消除故障点。我确实在很多方面都喜欢 Apache :) 理论上是可以的,但是“/”和“/app1”之间的映射让你抓狂。通常这样的配置也需要“mod_proxy_html”,它在安装和配置方面都相当复杂。即使你使用的是 Apache,在 tomcat 配置中使用两个服务仍然是更方便的方式。【参考方案4】:

Tomcat 在以下指定的端口上运行:

$CATALINA_HOME/conf/server.xml

正如 JB Nizet 所写,设置两个不同的 tomcat 实例,并适当配置端口值 server.xml。

$CATALINA_HOME/tomcat-8081/conf/server.xml:

<?xml version='1.0' encoding='utf-8'?>
 <Server port="8081" ... >
  ...
 </Server>

$CATALINA_HOME/tomcat-8082/conf/server.xml:

<?xml version='1.0' encoding='utf-8'?>
 <Server port="8082" ... >
  ...
 </Server>

【讨论】:

我可以只修改 server.xml 以添加 2 个新端口并将它们指向 webapps 下的每个应用程序吗? 我们不想创建 2 个 tomcat 实例。这里的人们在同一个 tomcat 实例中运行两个不同的应用程序并共享库。我只是想通过分配端口号来进一步扩展它。【参考方案5】:

使用两个不同的 Tomcat 实例。

编辑:

或者按照这个问题的答案配置Tomcat:Tomcat configuration help: multiple ports not responding

【讨论】:

我尝试了链接中的建议(基本上是在其中添加一个新服务和一个连接器)。不工作。我的 appBase 不是 C:\somepath - 应用程序部署在 webapps 中。那么 appBase 是什么? 如何在同一个文件夹中拥有两个同名(ROOT)的应用程序?您需要将两个 tomcat 服务使用的文件夹分开。有关详细信息,请参阅 tomcat 文档。 我为每个应用程序部署了这样的文件夹:[tomcathome]/webapps/app1 和 [tomcathome]/webapps/app2。默认的 server.xml 允许我将它们称为 localhost:8080/app1 和 localhost:8080/app2。我已将 appconfig.xml 作为 app1.xml 复制到 [tomcathome]/conf/Catalina/localhost。【参考方案6】:

我正在使用 IntelliJ,我在 application.properties 文件中添加了一行,它起作用了: 对于 web 应用程序 1 的项目添加:server.port = 8081 对于 web 应用 2 的项目添加:server.port = 8082

【讨论】:

以上是关于如何在不同端口后面的单个 Tomcat 实例上运行不同的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在两个不同的端口上运行 Tomcat 服务器

在具有不同端口的单个 EC2 上运行两个不同的 Web 应用程序

如何在不同端口上的单个服务器上运行 redis?

我可以在同一台机器上运行两个tomcat实例吗?

nginx的反向代理功能和负载均衡

我可以在同一台机器上运行两个 tomcat 实例吗?