61 votes

Comment exécuter différentes applications sur une seule instance de Tomcat derrière différents ports ?

Actuellement, j'ai deux applications web, app1 et app2, qui fonctionnent sur Tomcat 6 :

Je veux configurer Tomcat pour qu'ils fonctionnent dans le contexte Root derrière des ports séparés :

Que faut-il faire ?

0 votes

Je ne pense pas que ce soit possible à moins que vous ayez un autre exemple, j'ai upvoted, voyons si quelqu'un a d'autres idées.

0 votes

Je veux vraiment utiliser une seule instance de tomcat. Notre équipe essaie d'utiliser une seule instance à l'avenir. J'ai entendu dire que quelque chose devait être modifié dans le server.xml, mais je ne suis pas sûr de ce qu'il faut faire.

59voto

Benoit Marilleau Points 426

Je pense que vous pouvez configurer cela en vous server.xml et mettre 2 services :

<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 votes

La méthode ci-dessus semble donner de meilleurs résultats avec le journal, mais l'erreur persiste : Jan 11, 2012 12:58:13 PM org.apache.catalina.core.StandardContext resourcesStart SEVERE : Erreur de démarrage des ressources statiques java.lang.IllegalArgumentException : Base du document C:\Program Fichiers \Tomcat6\app1\host -le gestionnaire n'existe pas ou n'est pas un répertoire lisible at org.apache.naming.resources.FileDirContext.setDocBase(FileDirContext.java:142)

0 votes

Je vais marquer ceci comme une réponse acceptée ; bien que je n'aie pas pu faire disparaître les messages d'erreur, j'ai au moins pu faire démarrer Tomcat. Si quelqu'un a le temps de résoudre ce problème, faites-nous part de vos résultats. L'autre option, bien sûr, est d'avoir 2 instances de Tomcat en cours d'exécution, comme indiqué par d'autres dans ce fil de discussion.

2 votes

La documentation indique que chaque moteur dans un serveur spécifique doit avoir un nom unique ( tomcat.apache.org/tomcat-7.0-doc/config/engine.html ) donc je vote pour la réponse de @speeves

10voto

speeves Points 644

Un autre exemple d'ajout de connecteurs :

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

Tiré de : http://www.coderanch.com/t/84172/Tomcat/listen-multiple-ports

Je vous recommande de lire l'ensemble du fil de discussion, car il parle des pertes de performance avec cette configuration, ainsi que des conditions de course possibles.

0 votes

Cela m'a aidé. Très bien :)

1 votes

Cette réponse a fonctionné le mieux pour moi puisque je voulais un ensemble séparé de journaux, des contextes Catalina/localhost/*.xml séparés, une appBase séparée. J'ai ajouté une <Valve> pour obtenir des journaux séparés.

2voto

Aleja_Vigo Points 624

En plus de faire tourner deux instances de Tomcat et d'utiliser l'application Root (ce qui a déjà été dit et qui est une solution un peu pauvre et inefficace), vous pouvez y parvenir en utilisant Apache + Tomcat. Configurer Apache pour qu'il écoute les deux ports et qu'il transmette par IP:Port aux différentes applications Tomcat. Mais vous avez besoin d'un port différent pour Tomcat !

Configuration d'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>

ou

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 votes

Le problème est que je n'ai pas installé apache et que notre équipe n'a pas l'intention de le faire.

0 votes

Dans un ancien poste, nous utilisions les F5 de Big-Ip directement dans tomcat pour supprimer un point de défaillance. I faire J'aime Apache pour beaucoup de choses cependant :)

1 votes

C'est théoriquement possible, mais le mapping entre "/" et "/app1" rend fou. Habituellement, le "mod_proxy_html" est également nécessaire pour une telle configuration, et il est assez sophistiqué à la fois pour l'installation et la configuration. Même si vous utilisez Apache, l'utilisation de deux services dans la configuration de Tomcat reste une solution plus pratique.

0voto

JB Nizet Points 250258

Utilisez deux instances Tomcat différentes.

EDITAR:

Ou configurer Tomcat comme expliqué dans la réponse à cette question : Aide à la configuration de Tomcat : plusieurs ports ne répondent pas

0 votes

J'ai essayé la suggestion du lien (en fait, ajouter un nouveau service et un connecteur à l'intérieur). Cela n'a pas fonctionné. Mon appBase n'est pas C:\somepath - l'application est déployée dans les webapps. Quelle serait donc l'appBase ?

0 votes

Comment voulez-vous avoir deux applications avec le même nom (Root) dans le même dossier ? Vous devez séparer les dossiers utilisés par les deux services tomcat. Consultez la documentation de tomcat pour plus de détails.

0 votes

J'ai des dossiers pour chaque application déployée comme ceci : [tomcathome]/webapps/app1 et [tomcathome]/webapps/app2. Le server.xml par défaut me permet de les appeler comme localhost:8080/app1 et localhost:8080/app2. J'ai copié le fichier appconfig.xml en tant que app1.xml dans [tomcathome]/conf/Catalina/localhost.

0voto

speeves Points 644

Tomcat fonctionne sur les ports spécifiés dans :

$CATALINA_HOME/conf/server.xml

Comme l'a écrit JB Nizet, installez deux instances différentes de tomcat, et configurez la valeur du port server.xml de manière appropriée.

$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 votes

Puis-je simplement modifier server.xml pour ajouter deux nouveaux ports et les faire pointer vers chacune des applications sous webapps ?

0 votes

Nous ne voulons pas créer 2 instances de tomcat. Les gens ici exécutent deux applications différentes dans la même instance de tomcat et partagent les bibliothèques. Je veux juste l'étendre davantage en assignant des numéros de port.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X