HOW-TO : Serveur Tomcat sur Debian, Apache en proxy avec AJP

21 septembre 2008 at 20 h 44 min 10 commentaires

Je vais tenter de détailler pas à pas l’installation d’un serveur applicatif Tomcat (pour exécuter des servlet donc), conjointement au serveur web Apache avec l’utilisation d’un connecteur AJP proxy.

Apache sera donc en proxy (utile pour les données statiques). On supposera qu’Apache 2.x est déja installé sur la machine (sinon un apt-get install apache2 fera certainement l’affaire, ce n’est pas l’objet de cet article).

Allez, on y va!

Premièrement nous aurons besoin:

– d’une machine virtuelle java

– des binaires du serveur Tomcat

– des binaires du connecteur mod_jk Nous utiliserons mod_proxy, plus récent, plus rapide !

Concernant les versions, un JRE 1.5 (le jdk complet n’est plus obligatoire) et un tomcat 5.5 seront suffisant pour nous. Tomcat 6 n’apporte pas de réelle valeur ajoutée a mes yeux, et la version 5.5 est toujours maintenue.

1. Installation de la JVM:

Pour la télécharger, cette ligne de commande fera l’affaire:
wget http://javadl.sun.com/webapps/download/AutoDL?BundleId=23103 (copiez collez l’adresse récupérée du site de sun pur éviter de recopier l’adresse a la main)
On rend l’archive exécutable avec;
chmod +x ~/jre-6u7-linux…[TAB pour autocompletion]
Puis on se place dans le dossier adéquat pour installer une JVM (pour moi ca sera /opt, hop!), on lit patiemment l’accord de licence, on accepte, et la JVM s’installe.

cd /opt

~/jre-6u7-linux…[TAB pour autocompletion]

On va maintenant définir les variables d’environnement. On ouvre avec vim le fichier /etc/environment et on ajoute la ligne:

JRE_HOME= »/opt/jre1.6.0_07/ »

on peut egalement ajouter :/opt/jre1.6.0_07/bin a la variable PATH…

Testons dans le shell en tapant un petit java -version (après avoir démarré une nouvelle session pour prendre en compte les modifications).

2. Installation de Tomcat

On télécharge l’archive (veillez à bien prendre la dernière version, des mises à jour de sécurité importantes sont effectuées assez régulierement):
wget http://mirror.mkhelif.fr/apache/tomcat/tomcat-5/v5.5.27/bin/apache-tomcat-5.5.27.tar.gz
Se placer dans le répertoire /opt, et taper cette commande pour decompresser l’archive:

tar -zxvf ~/apache-tomcat-5.5.27.tar.gz

Créeons un utilisateur système tomcat afin de lancer le démon, et attribuer le propriétaire tomcat aux répertoires et sous-reps du serveur:

adduser tomcat
chown -R tomcat:tomcat /opt/apache-tomcat-5.5.27/

Pour plus de praticité, on va ajouter un lien symbolique histoire de racourcir le chemin…
ln -s /opt/apache-tomcat-5.5.27/ /opt/tomcat
Allez, on teste le tout: exit pour quitter root, su tomcat, puis /opt/tomcat/bin/start.sh

N’oubliez pas de rajouter :8080 (port par défaut de tomcat) après votre url pour vérifier que tomcat répond.

3 Lancement de tomcat

On va maintenant créer un script d’initialisation de tomcat qu’on pourra placer dans /etc/init.d/

Le script va etre très basique. Copiez collez ces instructions dans un fichier nommé tomcatd à placer dans /etc/init.d/

#!/bin/sh
TOMCAT_USER=tomcat
TOMCAT_PATH=/opt/tomcat
export JRE_HOME="/opt/jre1.6.0_07/"
export CLASSPATH="/opt/tomcat/lib/jsp-api.jar;/opt/tomcat/lib/servlet-api.jar"
start() {
echo -n "Starting Tomcat:  "
su $TOMCAT_USER -c $TOMCAT_PATH/bin/startup.sh
sleep 2
}
stop() {
echo -n "Stopping Tomcat: "
su $TOMCAT_USER -c $TOMCAT_PATH/bin/shutdown.sh
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: tomcat {start|stop|restart}"
exit
esac

Ensuite on rend le script executable : chmod 755 /etc/init.d/tomcatd
On va intégrer notre démon pour les runlevel 2/3/5 avec update-rc.d (n’oubliez pas les points qui terminent les commandes)
update-rc.d tomcatd start 42 2 3 5 . stop 31 0 6 .

4 Mise en place du connecteur (mod_jk mod_proxy) pour utiliser apache en frontend

Un proxy signifie qu’un serveur agit derrière un autre serveur. Apache httpd va donc jouer le role d’intermédiaire entre le client et notre conteneur de servlet. Il est indispensable de sécuriser Apache avant d’avtiver le mod_proxy, sous peine de permettre à n’importe qui d’accéder à internet depuis votre propre serveur!

Pour activer le proxy, il suffit de déclarer la directive globale activant l’utilisation du module éponyme (sur debian on va créer un fichier proxy.load qu’on placera dans /etc/mods-enabled/, pour les autres distrib, on écrira directement dans /etc/httpd/httpd.conf)

Les deux modules concernés sont mod_proxy et mod_proxy_ajp (pour activer le support du protocole apache j_serv).

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules//mod_proxy_ajp.so

On va maitenant créer le fichier tomcat.site dans le dossier /etc/apache2/sites-availables/ puis créer un lien symbolique dans /etc/apache2/ avec cette comande

ln -s /etc/apache2/sites-availables/tomcat.site /etc/apache2/sites-enabled/

Voici le contenu de ce fiohier:

<VirtualHost *:80>

ServerName votre_sous_domaine.votre_domaine.votre_tld

# pour éviter que le proxy soit ouvert, et pour transmettre les véritables hostname à tomcat
ProxyRequests Off
ProxyPreserveHost On

ErrorLog /var/log/apache2/tomcat.error.log
CustomLog /var/log/apache2/tomcat.log combined

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / ajp://localhost:8009/tomcat-docs/
ProxyPassReverse / ajp://localhost:8009/tomcat-docs/

</VirtualHost>

Il ne nous reste plus qu’à faire écouter Tomcat sur le port du conecteur AJP, et ce sera bon!

On va donc éditer le fichier server.xml, et vérifier que les lignes suivantes sont bien présentes:

<Connector port= »8009″ address= »127.0.0.1″ enableLookups= »false » redirectPort= »8443″ protocol= »AJP/1.3″ />
On pourra désactiver tous les autres connecteurs pour être sur que tomcat ne soit pas accessible sans passer par le frontend.

Pour plus de renseignements, je vous conseille la lecture des articles suivants sur ce même blog:
configurer correctement ses vhosts
épurer la configuration du server.xml de tomcat

Entry filed under: administration, tutorial. Tags: , , , , , , .

Tips et astuces : apprendre à configurer Apache httpd Apache: configurer correctement les vhosts

10 commentaires Add your own

  • 1. Marc-Aurèle Laquerre  |  26 septembre 2008 à 12 h 45 min

    Génial!

    j’ai beaucoup aimé cet article et il m’a permis de corrigé plusieurs parties de nos installation tomcats. j’ai une question cependant, lorsque je redémarre un service tomcat (qui a le connecteur ajp) il faut également que je fasse un reload de apache2. Ce comportement ne se produit pas lorsqu’il y a proxy_http

    Merci d’avance

    Répondre
  • 2. haveacafe  |  26 septembre 2008 à 13 h 16 min

    Peux tu reformuler la question ?

    En fait par defaut, tomcat possede un connecteur AJP, en parallèle du connecteur http (service standalone).

    Ensuite, tu as deux méthode pour parler à tomcat depuis apache par le protocole AJP: mod_JK ou mod_proxy_ajp.

    Théoriquement les deux serveurs (le frontend et le tomcat) sont indépendants, donc tu peux redémarrer l’un ou l’autre sans avoir à redémarrer les deux.

    Répondre
  • 3. Marc-Aurèle Laquerre  |  26 septembre 2008 à 14 h 23 min

    Merci de la réponse. Dans notre situation, on utilise mod_proxy_ajp pour se connecter de httpd vers tomcat. cependant, lorsque l’instance de tomcat( un de nos plusieurs site sur la même machine) est redémarrer, la connexion entre httpd et cet isntance de tomcat est rompue. la seule façon pour rétablir le contact est de redémarrer httpd.

    Répondre
  • 4. haveacafe  |  26 septembre 2008 à 14 h 49 min

    Etonnant, ca ne se comporte pas de cette manère chez moi. As tu vidé le cache du browser pour être sur que le tomcat ne répond pas ? quels sont les messages de catalina.log ? Utilises tu un loadbalancer ?

    Si tu as cunfiguré l’host tel que dans cet article, et si le probleme est avéré, je te conseille de poster sur la mailing-list d’apache, ou sur les forums officiels apache httpd (par exemple cleui la en français: http://forums.apachefrance.com/ )

    Tiens moi au courant, je modifierai l’article en indiquant la solution. Tu peux m’envoyer les fichiers de conf par mail si tu veux (ainsi que les dernières lignes du log de tomcat).

    Répondre
  • 5. Marc-Aurèle Laquerre  |  26 septembre 2008 à 14 h 55 min

    j’aimerais noter que je ne suis pas configuré avec une distribution debian. Je roule présentement des CentOS (distribution de type redhat) alors je ne sais pas si il y a un lien… je vais effectuer plus de test et contacter apache directement pour avoir un peu plus d’information. je te garde informé.

    P.s.: catalina.out n’a aps d’erreur puisque le message est le suivant:(se passe sur le bord httpd) Service Temporarily Unavailable erreur 503. et je n’ai pas de load balancer

    Répondre
  • 6. Marc-Aurèle Laquerre  |  26 septembre 2008 à 14 h 56 min

    ah que je suis con! le temps pour remonter le site est quelque peu plus long que mod_proxy_http et je n’attendais pas assez longtemps! La joie nos serveurs en prod vont mieux rouler.

    Merci encore

    Répondre
  • 7. Gadour  |  16 décembre 2009 à 19 h 18 min

    Bonjour,

    je suis entrain de mettre en place un SSO ,

    mon application est hebergé sous Tomcat , donc j’ai mis en place le mod_proxy_ajp pour lier mon server Apache et Tomcat et j’ai activer le module NTLM sur mon server Apache pour que je puisse activer l’authentifaction windows
    Pour le moment tout fonctionne convenablement mais mon seul soucis est que je ne recupere pas le REMOTE_USER au niveau de la request envoyé vers Tomcat!!! via une request.getRemoteUser() ….

    Pourriez vous m’aider?

    Merci d’avance

    Répondre
  • 9. Gadour  |  16 décembre 2009 à 19 h 21 min

    complément je le REMOTE_USER NULL dans ma jsp!!

    Répondre
  • 10. YoannCh  |  12 janvier 2011 à 9 h 54 min

    Super bien fait comme tuto, j’avais quelques lacunes en ce qui concerne le proxy http devant un tomcat elles sont comblées grâce à vous!!🙂

    J’ai juste eu à faire à deux petits problèmes, mais solutionnés tous les deux, je donne la soluce ici si elle peut servir à quelqu’un comme votre tuto à pu me servir ça sera toujours ça de gagné!

    Premier problème rapidement réglé, j’utilise un apache compilé main et dans les options du ./configure si l’on met juste le –enable-proxy-ajp pour activer le proxying ajp, il va planter à la compilo. Il faut aussi lors du ./configure ajouter –enable-proxy en plus du –enable-proxy-ajp pour pouvoir compiler et que tout fonctionne.

    J’ai ensuite eu un petit problème vis à vis des sessions tomcat. Mon application utilise en effet des sessions java/tomcat et me retrouvais avec des soucis dans la réponse, dans le header avec un « Set-Cookie: JSESSIONID=ID_DE_SESSION_TOMCAT; Path=/monappli » qui aurait dû être « Set-Cookie: JSESSIONID=ID_DE_SESSION_TOMCAT; Path=/ » vu que dans la conf on redirige sur la racine (/)

    J’ai trouvé ma solution en ajoutant après le

    ProxyPassReverse / ajp://localhost:8009/monappli/

    un

    ProxyPassReverseCookiePath /monappli /

    de cette manière tout fonctionne correctement avec mes sessions et je n’ai plus de soucis.

    Merci encore de votre how-to très bien expliqué qui m’a été très utile!

    Répondre

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Articles récents


%d blogueurs aiment cette page :