Couplage Apache Tomcat
Couplage Apache Tomcat
Couplage Apache Tomcat
Cet article explique comment intégrer le moteur de servlet Apache-Tomcat et le serveur Apache-
HTTP, afin de sécuriser (HTTPS) une application Inter/intranet, de faciliter l'accès à cette
application par l'utilisation de noms simplifiés (Rewriting) et enfin permettre une tolérance aux
pannes (failover) et une répartition de charge (load-balancing).
Introduction
Lors de la mise en production d'une application Internet ou intranet, il est fréquent de vouloir
protéger les transferts par une connexion sécurisée (HTTPS). Même si Tomcat le permet (il suffit
d'activer une option dans le server.xml de Tomcat), utiliser Apache est un meilleur choix du fait de
sa vitesse. De plus l'utilisation d'Apache permet de se débarrasser des :8080 et autres numéros de
ports dans l'url, du fameux " /MonApp " à la fin de la dite url et enfin la possibilité il offre une
intégration plus aisée dans un environnement avec charge répartie (Load Balancing).
I-C. Open-SSL
Nous allons devoir générer un certificat pour notre Apache, il nous faut donc les outils openSSL que
vous trouverez ici :
http://brandleadershipmarketing.com/apache/Openssl-0.9.8a-Win32.zip.
1. Par un installer
2. En décompressant un fichier zip
Je préfère la deuxième car :
- elle n'induit pas de dépendances externes du type base de registre.
- c'est un processus identique sur tous les systèmes d'exploitation et, de ce fait c'est plus
automatisable.
Sous linux/Unix:
export JAVA_HOME=/opt/Java50
Sous Windows:
set JAVA_HOME=C:\j2ee\Java50
A présent, vous devez tester ce que vous avez installé car il est inutile d'aller plus loin si
ça ne marche pas. Essayez de vous connecter sur http://localhost:8080, vous devriez voir
la fenêtre de tomcat, et sur http://localhost celle d'Apache-HTTP.
Dans ce fichier, normalement la seule chose que vous ayez à changer est la ligne
worker.default.host=127.0.0.1 dans laquelle vous pouvez spécifier l'adresse IP du serveur Tomcat
s'il est distant. Notez que le port 8009 doit être accessible au serveur Apache, c'est-à-dire pas de
firewall au milieu ou alors il faut configurer le dit firewall.
Puis, nous allons configurer Apache pour le faire prendre en compte notre module : éditez le ficher
httpd.conf présent dans le sous répertoire conf d'Apache. Recherchez un ensemble de lignes du
type LoadModule et à la fin de cette partie ajoutez
[...]
LoadModule jk_module modules/mod_jk.dll
#
# Mod_jk settings
#
JkWorkersFile "C:/J2EE/Apache2/Apache2/conf/worker.properties"
JkLogFile "C:/J2EE/Apache2/Apache2/logs/mod_jk.log"
JkLogLevel warning
JkMount /j2ee default
JkMount /j2ee/* default
# End of mod_jk settings
[...]
Comme vous pouvez le voir ce n'est pas bien compliqué. La première ligne active le module, puis
nous donnons des informations au module, naturellement ici vous devez mettre des chemins qui
correspondent à votre installation d'Apache. Enfin notez les 2 lignes qui commencent par JkMount,
à la place de tomcat-docs (qui est une application installée par défaut sur Tomcat) vous devez
mettre le nom de l'application web que voulez mapper. C'est à dire celle qui doit être accessible sur
le serveur Apache-HTTP.
Démarrez Tomcat et Apache et essayez d'accéder à une application. En cas de problème vous
pouvez regarder le contenu des messages dans le répertoire logs d'Apache.
V. Installation du mod_rewrite
L'objectif est de supprimer la partie droite de l'url à savoir dans notre cas tomcat-docs. Pour cela
nous allons rediriger toutes les requêtes à destination de / vers /tomcat-docs. Donc il nous faut
activer le module mod_rewrite qui peut être soit un module, soit compilé en standard.
Sous Windows c'est un module mais qui est activé par défaut:
LoadModule rewrite_module modules/mod_rewrite.so Vérifiez donc que la ligne n'est pas en
commentaire et, à la fin du fichier httpd.conf, ajoutez ou complétez :
[...]
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^$ http://localhost/tomcat-docs [L]
</VirtualHost>
[...]
Il est à noter que localhost doit être le nom de la machine que vous utilisez pour vous connecter,
donc en production ce sera certainement plus quelque chose du genre : www.company.com car
Apache reconnaît de façons différentes des requêtes qui arrivent sur www.company.com et sur
localhost même s'il s'agit physiquement de la même machine De plus lors de l'utilisation de ssl ce
sera indispensable du fait du nom de domaine présent dans le certificat.
Maintenant vous pouvez redémarrer Apache et vous connecter sur http://localhost qui devrait vous
rediriger automatiquement vers l'application web.
Maintenant nous allons générer un certificat pour ssl. Attention ce n'est pas un certificat officiel
donc vous ne bénéficierez d'aucune assurance ou couverture légales, pour cela il faut acheter un
certificat chez une autorité compétente mais en tous les cas la sécurité du cryptage sera presque la
même.
RANDFILE = .rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
####################################################################
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, your website's domain name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 40
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
[ x509v3_extensions ]
# under ASN.1, the 0 bit would be encoded as 80
# nsCertType = 0x40
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
#nsCertSequence
#nsCertExt
#nsDataType
Cela va créer un certificat valable un an. Attention les informations que vous donnerez et surtout le
nom du serveur doivent être corrects sinon le certificat sera refusé. Dans le même répertoire seront
générés les fichiers suivants :
1. site.der.crt
2. site.key
Commencez par activer ou saisir la ligne LoadModule jk_module modules/mod_jk.dll ou
mod_jk.so puis il faut s'assurer que Apache écoute sur le port 443 (le port https) pour cela
cherchez :
[...]
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
[...]
et ajoutez :
[...]
Listen localhost:80
Listen localhost:443
[...]
Attention localhost doit être le nom avec lequel vous interrogez la machine et avec lequel vous avez
crée votre certificat.
Puis cherchez
[...]
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If this is not set to valid DNS name for your host, server-generated
# redirections will not work. See also the UseCanonicalName directive.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
# You will have to access it by its address anyway, and this will make
# redirections work in a sensible way.
#
ServerName localhost
[...]
Enfin, à la fin du fichier remplacez le bloc que nous avons saisi en V par :
[...]
NameVirtualHost *:80
NameVirtualHost *:443
<VirtualHost *:80>
RewriteEngine On
#Nous redirigeons toutes les requetes qui ne sont pas sécurisés vers le port
#443 (HTTPS)
RewriteCond %{SERVER_PROTOCOL} !^HTTPS
RewriteRule ^(.*)$ https://localhost/tomcat-docs/$1 [R,L]
</VirtualHost>
<VirtualHost *:443>
#Activation de SSL, remarquez le nom des fichiers
SSLEngine On
SSLCertificateFile conf/site.cert
SSLCertificateKeyFile conf/site.key
#Ici nous faisons ce que nous faisions auparavant en http,
#c'est-à-dire rediriger les requête de / vers /tomcat-docs
RewriteEngine On
RewriteRule ^$ https://localhost/tomcat-docs [L]
</VirtualHost>
[...]
Il est important de noter que dans cet exemple, seul l'hôte localhost fonctionnera, ce qui est un
dommage pour une application web. Il faut remplacer "localhost" par un nom convenable.
En fait, nous nous contentons de définir la liste des tomcats qui rentre dans la liste des serveurs à
équilibrer(balancer).
Pour tester il faut installer un second Tomcat. Idéalement faîtes-le sur une autre machine ou, à
défaut, sur la même.
Si ce nouveau Tomcat est sur la même machine, il faut changer le numéro du port sur lequel il
écoute. Tomcat écoute sur plusieurs ports, notamment par défaut le 8080 (celui que l'on utilise en
developpement) et le port AJP13 qui lui permet de se connecter avec Apache. Pour cela éditez le
fichier "server.xml" et changez les ports sur lesquels il écoute :
[...]
<Server port="9005" shutdown="SHUTDOWN">
<Connector port="9090" maxHttpHeaderSize="8192"
<Connector port="9443" maxHttpHeaderSize="8192"
<Connector port="9009" enableLookups="false"
redirectPort="9443" protocol="AJP/1.3" />
<Connector port="9082" maxThreads="150"
minSpareThreads="25" axSpareThreads="75" />
[...]
Il est important de noter que seul le port AJP13 (9009 dans notre cas, mais 8009 par défaut) est
important. Les autres changements évitent que Tomcat ne plante au démarrage et peuvent, le cas
échéant (en production), même être désactivés.
VIII. Conclusion
Nous avons vu ensemble comment lier Tomcat et Apache-HTTP ensemble, pour permettre de
sécuriser une application Intra/Internet, facilitant l'accès aux utilisateurs grâce à des noms plus
courts. Enfin nous avons configuré un load-balancing "logiciel" qui réduit le temps
d'indisponibilités de vos applications et améliore leur montée en charge.
Si vous rencontrez des problèmes, ou si vous avez des questions ou des remarques, n'hésitez pas à
m'écrire. Rendez vous sur le forum Java/J2EE sur http://www.developpez.net