vhost et tomcat5 avec plusieurs webapps

Questions sur les problèmes d'intégration de Tomcat avec Apache (mod_jk, mod_jk2...).

Modérateur : Modérateurs

Avatar de l’utilisateur
pvincent
Nouveau membre
Messages : 7
Inscription : lun. 19 avr. 2004, 10:45

vhost et tomcat5 avec plusieurs webapps

Messagepar pvincent » lun. 19 avr. 2004, 11:55

Mon problème est le suivant :
J'aimerais pourvoir intégrer apache et tomcat de telle façon que je puisse avoir autant de webapps différentes répondant à autant de vhost différents.
Quelque chose qui ressemblerait à ca :
<a href='http://webapp1.entreprise.tld' target='_blank'>http://webapp1.entreprise.tld</a> -> webcontext '/webapp1' du host par défaut de Tomcat
<a href='http://webapp2.entreprise.tld' target='_blank'>http://webapp2.entreprise.tld</a> -> webcontext '/webapp2' du host par défaut de Tomcat
etc...

Bien sûr, je souhaite avoir la possiblité de gérer mes webapps aussi simplement qu'avec le manager de tomcat ; c'est à dire déployer et undeployer les webapps à la volée...

Pour information, l'intégration de tomcat5 et apache2 à travers mod_jk2 fonctionne correctement sur mon système à base de Linux Gentoo.

PROBLEME #1 : je peux modifier le fichier server.xml de tomcat et rajouter des hosts pointant sur un war quelconque. Malheureusement, le manager ne me permet pas de lister les webapps en dehors du host par défaut, donc undéployer devient impossible.

PROBLEME #2 : je décide alors de déployer mes webapps tout simplement à travers le manager dans le host par défaut. Cependant, le fichier workers2.properties de apache ne permet pas d'indiquer une indication au protocole AJP13 de communiquer directement avec un webcontext particulier. [directive context ne marche pas]

PROBLEME #3 : dernière tentative, je décide de positionner dans le webcontext par défaut '/' de tomcat, la webapp balancer et d'écrire dans rules.xml une redirection vers un autre webcontext en fonction de l'uri (host). Malheureusement, la redirection modifie l'URL du client, c'est plutot du forward que j'aurais aimé utiliser...

En conclusion, soit j'ai rien compris à l'intégration tomcat-apache, soit ce n'est pas encore toutafait au point (option context dans workers2.properties), soit je dois coder un meilleur manager qui peut voir les webapps en dehors du host par défaut, soit je dois coder mon propre balancer qui fait du forward au lieu de l'indirection, SOIT vraiment je suis passé à côté de quelque chose.

Merci de m'aider.
En tous cas, si vous avez lu jusqu'ici c'est que vous pouvez comprendre mes problèmes

Avatar de l’utilisateur
pvincent
Nouveau membre
Messages : 7
Inscription : lun. 19 avr. 2004, 10:45

Messagepar pvincent » ven. 28 mai 2004, 7:54

Après avoir galéré pas mal de temps à essayer différentes configurations entre Tomcat et Apache, voici la conclusion de mes expériences.
Mon objectif est le suivant :
Installer plusieurs applications web (fichier .war) sur une seule machine (une adresse IP fixe) ayant un serveur Apache et un seul Tomcat.
Je dispose d'un nom de domaine et je peux configurer le DNS pour avoir plusieurs noms de machine pointant sur la même adresse IP.
Les applications web sont susceptibles d'évoluer, la mise à jour de l'application sans redémarrer le serveur est souhaitable.

Voici les différentes étapes de configuration :
  • ETAPE 1 : Installation de Apache, Tomcat et mod_jk2
    Sur une machine à base de Gentoo Linux, l'installation est triviale.

    Code : Tout sélectionner

    #emerge apache
    #emerge tomcat
    A l'heure actuelle, le mod_jk2 n'est pas encore disponible dans l'arbre Portage. Dans quelques temps, il suffira de taper

    Code : Tout sélectionner

    #emerge mod_jk2
    En attendant, suivez le message : <a href='http://bugs.gentoo.org/show_bug.cgi?id=18353' target='_blank'>emerge mod_jk2 en mode instable</a>

    </li>
  • ETAPE 2 : configuration des hôtes virtuels dans Apache
    Au préalable, vérifier que Apache accepte la configuration des hôtes virtuels en décommentant la ligne suivante dans /etc/apache2/conf/apache2.conf
    #Include conf/vhosts/vhosts.conf

    Editer le fichier /etc/apache2/conf/vhosts/vhosts.conf afin de configurer autant de hôtes virtuels que nécessaire.
    Puisque nous disposons d'une seule adresse IP et de plusieurs noms de serveurs, le choix des hôtes virtuels nommés est celui que nous allons utilisé.
    ################# Named VirtualHosts
    NameVirtualHost *:80
    #redirect every http request to an https request
    <VirtualHost *:80>
    RewriteEngine On
    RewriteRule ^/(.*) https://%{HTTP_HOST}/$1
    </VirtualHost>

    NameVirtualHost *:443
    #declare a tomcat virtual host
    <VirtualHost *:443>
    ServerName MY_HOST_NAME
    </VirtualHost>

    #define standard location
    <VirtualHost *:443>
    ServerName localhost
    DocumentRoot /var/www/localhost/htdocs
    </VirtualHost>

    Rq 1: En plus de définir un hôte virtuel MY_HOST_NAME sur le port 443, toutes les requetes 80 seront redirigées sur le port https.
    Cette configuration est optionnelle si HTTPS n'est pas votre priorité.
    Rq 2: Concernant la déclaration du hôte virtuel MY_HOST_NAME, seule l'information ServerName est utile.
    Rq 3: Créer autant de hôte virtuel que nécessaire si vous désirez avoir plusieurs applications web répondant à autant de noms de machine (enregistrés dans le DNS)

    </li>
  • ETAPE 3 : configuration du connecteur AJP dans Apache
    Editer le fichier /etc/apache2/conf/workers2.properties afin de préciser (entre autres) les motifs URI à rediriger vers tomcat
    [shm]
    file=${serverRoot}/logs/shm.file
    size=1048576

    # Example socket channel, override port and host.
    [channel.socket:localhost:8009]
    port=8009
    host=127.0.0.1

    # define the worker
    [ajp13:localhost:8009]
    channel=channel.socket:localhost:8009

    # Uri mapping
    [uri:MY_HOST_NAME/*]
    worker=ajp13:localhost:8009

    # define the worker
    [status:status]

    # Uri mapping
    [uri:/jkstatus/*]
    worker=status:status

    Rq 1 : modifier MY_HOST_NAME par votre nom de serveur.
    Noter que cet URI ne commence pas par '/'
    Rq 2 : créer autant d'uri mapping que nécessaire à ce niveau.

    </li>
  • ETAPE 4 : configuration statique du serveur Tomcat
    <span style='color:green'>Bien que notre objectif est de ne pas relancer le serveur Tomcat lors de la modification de webapp,
    il faut néanmoins déclarer des hôtes de manière statique.
    Il existe une possibilité de le faire à travers le module admin de Tomcat5 mais pour des raisons pratiques,
    j'ai choisi de le désactiver.
    Cela ne remet pas en cause la modification des webapp à la volée.</span>


    Editer le fichier /etc/tomcat/server.xml afin de définir les hôtes de manière statique.
    <Server port="8005" shutdown="SHUTDOWN" debug="0">
      <Service name="Catalina">
        <Connector port="8009" enableLookups="false" protocol="AJP/1.3" />
        <Engine name="Catalina" defaultHost="MY_HOST_NAME" >
          <Host name="MY_HOST_NAME" appBase="webapps" unpackWARs="false" autoDeploy="true" />
        </Engine>
      </Service>
    </Server>

    Rq 1 : ceci correspond à un server.xml minimal.
    Rien ne vous empêche de rajouter vos propres configurations, par exemple en définissant des ressources JNDI dans <GlobalNamingResources>
    Rq 2 : j'ai choisi de désactiver délibéremment le connecteur sur le port 8080
    Rq 3 : pour des raisons pratiques, j'ai choisi de laisser par défaut 'appBase="webapps"',
    cependant j'ai pris la peine d'effacer tous les webapps déjà existant dans ce répertoire.
    Rq 4 : vous pouvez définir autant de host que nécessaire à ce niveau.
    Vous pouvez également faire pointer 'appBase="webapps"' pour les autres hosts à condition que ce répertoire reste vide.

    <span style='color:green'>En fait dans la description de server.xml, j'ai choisi d'utiliser la définition statique des hosts et
    d'utiliser la fonctionnalité autoDeploy de tomcat5 pour préciser des portions de server.xml,
    alias les petits fichiers context.xml qui vont me permettre de déployer une webapp à la volée.
    Voir l'étape 6 une fois que le serveur Tomcat est lancé.</span>


    </li>
  • ETAPE 5 : démarrage des serveurs
    Il est utile de prévoir un mécanisme pour lancer automatiquement les serveurs au démarrage de la machine.
    Editer le fichier /etc/conf.d/apache2 afin de préciser au démarrage de apache, les modules supplémentaires à charger
    APACHE2_OPTS="-D SSL -D JK2"

    Editer le fichier /etc/init.d/apache2 afin d'exprimer le lien de dépendances entre les 2 applications :
    ...
    depend() {
            need net
            use mysql dns logger netmount tomcat #appended tomcat here
            after sshd
    }
    ...

    Puis installer les services au démarrage de la machine et enfin démarrer apache pour vérifier que ca fonctionne :

    Code : Tout sélectionner

    #rc-update add apache2 default
    #rc-update add tomcat default
    #/etc/init.d/apache2 restart


    </li>
  • ETAPE 6 : installation de webapp à la volée
    Une fois votre serveur tomcat démarré, nous pouvons utiliser la fonctionnalité autoDeploy de Tomcat5
    comme définie dans server.xml (vue à l'étape 4)

    J'ai choisi délibèrrement de laisser le répertoire webapps vide.
    En vérité, je triche en demandant à Tomcat de scruter ce répertoire même s'il est vide.
    La fonctionnalité autoDeploy permet entres autres de scruter la définition de portion de server.xml,
    pour cela il suffit de créer un fichier context.xml pour notre webapp comme suit :
    <Context path="" docBase="../webapps2/MY_WEBAPP">
    <ResourceLink global="simpleValue" name="value" type="java.lang.Integer"/>
    </Context>

    Rq 1 : le path="" est nécessaire afin que le serveur Apache réponde directement à votre contexte web
    Rq 2 : le docBase="../webapps2/MY_WEBAPP" indique qu'il ne s'agit pas d'une application web contenue dans le répertoire par défaut,
    à savoir le fameux webapps (délibèrrement vide).
    Changer MY_WEBAPP par le nom de votre webapp.
    Rq 3 : l'information <ResourceLink ...> est purement optionnel.
    Elle n'est utile que si vous avez définie des resources JNDI précédemment dans votre server.xml

    Une fois créé, il ne suffit plus qu'à copier votre webapp dans le répertoire adéquat
    et de copier ce petit fichier context.xml directement dans $CATALINA_HOME/conf/Catalina/MY_HOST_NAME/context.ml

    Code : Tout sélectionner

    #su - tomcat
    //Je suppose que vous disposez du fichier MY_WEBAPP.war et context.xml dans le répertoire ~
    $cd $CATALINA_HOME
    $mkdir webapps2/MY_WEBAPP -p
    $cd webapps2/MY_WEBAPP
    $unzip ~/MY_WEBAPP.war
    $cp ~/context.xml $CATALINA_HOME/conf/Catalina/MY_HOST_NAME/context.xml

    Au bout de quelques secondes, votre webapp va se déployer automatiquement.
    Dans le cas d'une mise à jour de webapp, procéder de même, la fonctionnalité autoDeploy est capable de undéployer la précedente webapp et déployer la nouvelle dès qu'il s'aperçoit que le fichier context.xml a changé.</li>

Avatar de l’utilisateur
Gandalf
Sorcier des forums
Sorcier des forums
Messages : 2528
Inscription : jeu. 04 déc. 2003, 22:58

Messagepar Gandalf » ven. 28 mai 2004, 9:43

Très intéressant :)

*épinglé*
Celui qui détruit quelque chose pour savoir ce que c'est, a quitté le chemin de la sagesse.

Avatar de l’utilisateur
pfoubert
Nouveau membre
Messages : 1
Inscription : lun. 08 mai 2006, 1:53

Messagepar pfoubert » lun. 08 mai 2006, 2:23

Bonjour,

Tout d'abord je suis désolé mais je suis vraiment un newbie avec Tomcat. Apache et tout le reste ça va mais je Débute sous Tomcat.

J'ai lu pas mal de choses, sous Jakarta project de Apache et quelques tutos mais je suis un peu perdu en fait.

J'aurais besoin que l'on me guide pour bien démarrer ma config, au moins les grandes lignes sur "comment faire" voir quelques pointeurs sur le web, apres je pourrais essayer de me debrouiller tout seul, faire des tests et auto-apprendre. En sachant qu'au cas ou, vous etes la :)

Bon alors voila :

J'ai un serveur dédié avec Apache et j'ai plusieurs domaines (une 10ene) et un ami en gere 6 et un autre 8 (donc 24 domaines sur ce serveur). On gere ces domaines avec des vhosts de Apache définis dans conf.d/

Les docroot sont /home/userx/domainex/html

J'ai installé le jdk, tomcat et le mod_jk. Les exemples des 2 webapp fonctionnent.

Maintenant je voudrais savoir comment configuré Tomcat/Apache/le connecteur pour que chaque domaine ait son propre contexte. Un domaine pourrait peut etre avoir plusieurs webapp, mais justement c'est une des choses que je ne sais pas, qu'est ce qui est mieux ?

Globalement on voudrait que chacun des domaines puisse gérer ses propres servlets/jsp, sans que cela n'interfere sur les autres domaines. Par exemple que si un de nous pour un domaine installe des servlets, que l'on ai pas besoin d'arreter tomcat et de le redemrrer, que tous ces domaines soient indépendants les uns des uatres tout comme ils le sont avec Apache

Si je comprend bien la donc on peut configurer plusieurs vhost dans serveur.xml, donc c'est que je devrais faire ? mais apres je dois avoir un seul workers ? plusieurs ? un seul context.xml ? plusieurs ? j'ai vue aussi que je pouvais définir dans Apache des Alias ou mounter des repertoires tomcat (jkmount , jkalias) c'est peut etre aussi une solution alors, mettre des jkmount par vhost ?

Voila, je voudrais juste que l'on me guide un peu pour implementer cette solution. Au moins le principe, et peut etre plus si vous avez un peu de temps (par ex quoi mettre dans les repertoires des docroot, un WEB-INF par vhost ? un context.xml par vhost ?

Merci d'avance pour vos conseils de pro :-p

Pascal


Revenir vers « Intégration Apache »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité