2012-01-11 59 views
50

目前我有2个web应用程序APP1和APP2在Tomcat 6运行:如何在不同端口后面的单个Tomcat实例上运行不同的应用程序?

我想配置Tomcat,使他们在根上下文中运行的背后独立端口:

需要做什么?

+0

我不认为这是不可能的,除非你有另一个实例,我已经upvoted,让我们看看是否有任何其他的想法。 – kosa 2012-01-11 17:01:09

+0

我真的只想使用一个tomcat实例。我们的团队都在尝试使用单个实例。 server.xml中有些东西需要更改,但我不知道该怎么做。 – DeeStackOverflow 2012-01-11 17:03:28

回答

43

我认为你可以在你配置那个服务器。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> 
+0

上述似乎给日志更好的结果,但仍有这个错误:2012年1月11日下午12时58分13秒org.apache.catalina.core.StandardContext resourcesStart SEVERE:错误开始静态资源 java.lang.IllegalArgumentException:文档库C:\ Program Files \ Tomcat6 \ app1 \ host-manager不存在或不可读目录 \t at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext。 java:142) – DeeStackOverflow 2012-01-11 18:02:09

+0

我打算将其标记为已接受的答案;尽管我不能让错误信息消失,但我至少可以让Tomcat启动。如果有人有时间弄清楚,请告诉我们您的结果。另一个选项当然是在这个线程中有两个Tomcat运行正如其他人指出的那样。 – DeeStackOverflow 2012-01-12 14:30:28

+1

文档都在说这里面具体的服务器每台发动机都拥有唯一的名称(http://tomcat.apache.org/tomcat-7.0-doc/config/engine.html),所以我投票给@speeves回答 – Kangur 2014-11-25 17:02:17

0

使用两个不同的Tomcat实例。

编辑:

或配置Tomcat作为这个问题的答案解释:Tomcat configuration help: multiple ports not responding

+0

我尝试了链接中的建议(基本上添加了一个新的服务和一个连接器)。不工作。我的appBase不是C:\ somepath - 应用程序部署在webapps中。那么appBase会是什么? – DeeStackOverflow 2012-01-11 17:14:50

+0

你想在同一个文件夹中有两个具有相同名称(ROOT)的应用程序?您需要分隔两个tomcat服务使用的文件夹。有关详细信息,请参阅tomcat文档。 – 2012-01-11 17:23:39

+0

我有像这样部署的每个应用程序的文件夹:[tomcathome]/webapps/app1和[tomcathome]/webapps/app2。默认的server.xml允许我将它们称为localhost:8080/app1和localhost:8080/app2。我已将appconfig.xml作为app1.xml复制到[tomcathome]/conf/Catalina/localhost中。 – DeeStackOverflow 2012-01-11 17:36:07

0

运行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> 
+0

我可以修改server.xml以添加2个新端口并将它们指向webapps下的每个应用程序? – DeeStackOverflow 2012-01-11 17:05:02

+0

我们不想创建2个tomcat实例。这里的人在tomcat和共享库的同一个实例中运行两个不同的应用程序。我只想通过分配端口号来进一步扩展它。 – DeeStackOverflow 2012-01-11 17:19:20

2

而且运行两个Tomcat实例和使用ROOT应用程序(已经说过了,并且有点差和无效的解决方案),你可以通过使用Apache + Tomcat来实现它。配置apache监听两个端口并通过IP转发:端口到不同的Tomcat应用程序。但是你需要一个不同的port 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> 
+0

问题是,我没有安装apache,也没有计划在我们的团队这样做。 – DeeStackOverflow 2012-01-11 17:17:44

+0

在以前的职位上,我们直接将Big-Ip F5s运行到tomcat以消除一个失败点。我_do_爱很多东西虽然:) – speeves 2012-01-11 17:30:36

+1

这在理论上是可能的,但“/”和“/ app1”之间的映射让你发疯。通常这种配置也需要“mod_proxy_html”,并且它在安装和配置方面都非常复杂。 即使你使用的是Apache,在tomcat配置中使用两个服务仍然是更方便的方法。 – 30thh 2012-09-18 07:31:57

8

加入连接器的另一实例:http://www.coderanch.com/t/84172/Tomcat/listen-multiple-ports

I R:

<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.) 

来自建议阅读整个主题,因为它讨论了使用此配置的性能命中,以及可能的竞争条件。

+0

这帮了我。非常好:) – rocksteady 2016-05-30 10:47:50

+1

这个答案最适合我,因为我想单独设置一组日志,单独的Catalina/localhost/* .xml上下文,单独的appBase。我dded一个获得单独的日志 – djb 2016-08-09 01:32:49

相关问题