wiki:ApacheFrontalTomcat

Guide de configuration d'Apache en serveur frontal pour Tomcat

TOC?

Note : ce guide a été écrit pour la version 2.2.x de Apache et la version 5.5 de Tomcat.

Note 2 : De nombreux modules ont été créés pour le serveur Apache. Dans ce guide, nous utilisons  mod_proxy,  mod_proxy_http,  mod_rewrite et  mod_ssl. Vérifiez donc s'il sont bien inclus dans le fichier de configuration de Apache.

Objectifs

Le serveur CAS et l'ENT sont des applications web de type Java, qui s'exécutent sur un container de servlets (comme Tomcat). Les bonnes pratiques recommandent d'installer un serveur classique en frontal pour recevoir les requêtes des utilisateurs, puis les dispatcher à la servlet adéquate.

Quelques notions utiles

  • Hôtes virtuels nommés : la norme HTTP 1.1 (largement répandue de nos jours) définit le concept d'hôte virtuel : un serveur HTTP (sur une machine) peut recevoir les requêtes provenant de noms de domaines différents, et servir les réponses adéquates. Apache propose ce type de configuration à travers la balise <VirtualHost>. Par contre, ce type de service n'est pas utilisable avec une connection SSL.
  • Reverse proxies : ce mécanisme autorise un serveur web à intercepter un trafic HTTP et rediriger les requêtes à un serveur interne adéquat. Cette pratique permet également de créer très simplement un système de répartiteur de charge.

Un cas concret

Nous avons besoin d'héberger les trois applications suivantes sur une machine unique :

Service Rôle Hôte Port Serveur
 Moodle Cours en ligne moodle.example.com 80 Apache
 ESUP Portail Espace numérique de travail ent.example.com 80 Tomcat
 CAS Authentification unique auth.example.com 443 (SSL) Tomcat

Apache sera installé en tant que serveur frontal et redirigera les requêtes sélectionnées vers les applications Java hébergées par Tomcat.

Fichier de configuration de Tomcat

Nous utilisons le connecteur par défaut de Tomcat : une connection HTTP sur le port 8080.

Fichier de configuration d'Apache

Le fichier de configuration d'Apache définit des hôtes virtuels (balise <VirtualHost>) pour chacun de nos services. Pour alléger le serveur Tomcat, Apache prend également en charge le cryptage de la communication en SSL.

Listen 80          # On écoute le port HTTP standard
Listen 443         # Pour SSL, on écoute le port HTTP sécurisé standard

ProxyRequests Off  # C'est un reverse proxy

<Proxy *>          # L'accès au proxy est autorisé
    Order deny,allow
    Allow from all
</Proxy>

NameVirtualHost *:80     # On active le support des hôtes virtuels nommés
                         # pour toutes les requêtes arrivant sur le port 80

<VirtualHost *:80>       # Le service Moodle est uniquement disponible
                         # sur le port 80

    ServerName moodle.example.com     # Le nom du serveur est obligatoire
    DocumentRoot /var/htdocs/moodle   # Le chemin de base pour cet hôte

</VirtualHost>

<VirtualHost *:80>       # Le service ENT est uniquement disponible
                         # sur le port 80

    ServerName ent.example.com     # Le nom du serveur est obligatoire

    # Cette ruse de sioux permet de rediriger les URI qui ne commencent pas
    # par /uPortal/ sur notre ENT.
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/uPortal
    RewriteRule .* /uPortal/ [R]


    # Nous nous connectons à Tomcat par protocole HTTP
    # ESUP Portail ne supporte pas la relocation du service à une
    # URI différente que /uPortal/
    ProxyPass /uPortal/ http://localhost:8080/uPortal/
    ProxyPassReverse /uPortal/ ajp://localhost:8080/uPortal/
    ProxyPassReverseCookieDomain localhost:8080 ent.example.com     # On change le DNS des cookies générés


</VirtualHost>

<VirtualHost *:443>      # Le service d'authentification est disponible
                         # uniquement sur HTTPS (port 443)

    ServerName auth.example.com     # Le nom du serveur est obligatoire

    SSLEngine on         # On active et paramètre SSL
    SSLCertificateFile conf/ssl/cas.crt
    SSLCertificateKeyFile conf/ssl/cas.key

    ProxyPass / http://localhost:8080/cas/
    ProxyPassReverse / http://localhost:8080/cas/
    ProxyPassReverseCookieDomain localhost:8080 auth.example.com
    ProxyPassReverseCookiePath /cas /     # On change l'URI d'application des cookies

</VirtualHost>

Création d'un certificat SSL

Les commandes OpenSSL suivantes génère un certificat SSL pour notre serveur.

  1. openssl req -new -out certificat.csr
  2. openssl rsa -in privkey.pem -out clef.key
  3. openssl x509 -in certificat.csr -out certificat.crt -req -signkey clef.key -days 3650

Sur le Web