Serveur web : Apache

mar. 03 sept. 2013 by Marmotte

Apache est un serveur HTTP très répandu, doté de nombreux modules.

Note : Certains chemins donnés ici peuvent être spécifiques à l'organisation des paquets Debian.

Installation

Le minimum requis est d'installer le paquet apache2. Il dépend du paquet apache2.2-common, qui inclus un bon nombre de modules souvent utilisés. Pour utiliser certains modules spécifiques, il peut être nécessaire d'installer d'autres paquets.

$ sudo apt-get install --no-install-recommends apache2

Note : Par défaut, c'est la variante apache2-mpm-prefork qui est installée. J'ai toujours laissé ce comportement par défaut.

Configuration

Je n'ai jamais beaucoup touché aux fichiers de configuration d'Apache, le fonctionnement par défaut proposé sur Debian me convenant assez bien.

Pour modifier les ports utilisés par Apache, il faut éditer le fichier /etc/apache2/ports.conf. Par exemple, pour que le serveur utilise le port 8080, il faut ajouter ces lignes :

NameVirtualHost *:8080
Listen 8080

Note : Le caractère * dans la ligne NameVirtualHost *:8080 indique que ce port écoutera sur toutes les interfaces. Il est possible de préciser une adresse IP ou un nom d'hôte pour restreindre l'écoute à certaines interfaces.

Cette modification nécessite de redémarrer le serveur Apache.

$ sudo service apache2 restart

Définition de virtual hosts

La plupart des configurations que je fais sur Apache sont des définitions de virtual hosts.

Modifier la configuration d'un virtual host ne nécessite qu'un rechargement des configurations, sans relancer complètement le serveur.

$ sudo service apache2 reload

Un virtual host basique

Un virtual host est défini par la balise <VirtualHost *:80>, contenant au moins la directive ServerName. Comme pour la directive NameVirtualHost le caractère * indique que ce virtual host sera disponible sur toutes les interfaces du serveur.

Note : Il n'est pas possible d'utiliser <VirtualHost *:X> s'il n'y a pas de directive NameVirtualHost *:X correspondante.

Un virtual host très simple peut être :

<VirtualHost *:80>
    ServerName host.example.com
    DocumentRoot /var/www
</VirtualHost>

Il n'est cependant pas conseillé d'utiliser un virtual host si restreint.

Un virtual host un peu plus complet

Pour configurer un virtual host un peu plus complet, il est possible de dupliquer le celui qui est activé par défaut.

$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/<VhostName>

Dans ce fichier, des options sont définies sur le répertoire racine, sur le répertoire des documents, et sur le répertoire des scripts CGI. Il définit aussi des fichiers de log pour les simples accès et les erreurs.

Pour une utilisation basique, vous pouvez vous contentez d'adapter la valeur de la directive DocumentRoot, et d'ajouter la directive ServerName.

Il suffit ensuite d'activer le nouveau virtual host, puis de recharger la configuration d'Apache.

$ sudo a2ensite <VhostName>
$ sudo service apache2 reload

Authentification

Apache dispose de nombreuses manières de gérer l'authentification (basique, LDAP, PostgreSQL, etc.) Ce paragraphe explique l'authentification basique utilisant un simple fichier contenant les couples identifiant/mot de passe.

Apache propose un outil permettant de gérer les fichiers de mots de passe. Pour créer un fichier de mots de passe, il faut lui passer le paramètre -c.

$ sudo htpasswd -c /<Path>/<Filename> <Username>

Il suffit ensuite d'ajouter les directives d'authentification dans le fichier de configuration du virtual host :

<Directory /path/to/protect/>
    AuthType Basic
    AuthName "Site identifier"
    AuthUserFile /<Path>/<Filename>
    Require user <Username>
</Directory>

Note : Il est possible d'utiliser le même identifiant (AuthName) pour différents répertoires d'un même site, afin d'éviter de multiples demandes de mot de passe, si les autorisations sont identiques.

Modules

Relayer les requêtes vers un autre serveur

Le module mod_proxy_http permet de relayer des requêtes HTTP d'un virtual host vers un autre serveur.

Ce module n'est pas activé par défaut, il faut donc commencer par l'activer si c'est la première fois que vous l'utilisez. L'activation et la désactivation demandent le relancement complet d'Apache.

$ sudo a2enmod proxy_http
$ sudo service apache2 restart

Il faut ensuite créer un nouveau virtual host qui sera chargé de rediriger les requêtes ciblant certains noms vers une autre machine.

<VirtualHost *:80>
    ServerName other.example.com
    ServerAlias alias.example.net

    ProxyPreserveHost On
    ProxyPass / http://target.example.com
    ProxyPassReverse / http://target.example.com
</VirtualHost>

Note : La directive ProxyPreserveHost indique à Apache de transmettre le nom d'origine plutôt que le nom utilisé dans la directive ProxyPass au serveur cible. Comme le nom appelé par le client est transmis, un unique virtual host peut être utilisé pour rediriger toutes les requêtes à destination d'un même serveur, en utilisant la directive ServerAlias.

Note : La directive ProxyPassReverse indique à Apache de remplacer les références au nom du serveur cible par le nom appelé par le client dans les réponses aux requêtes.

Authentification et proxy

Pour utiliser l'authentification avec un virtual host qui utilise les directives de proxy, il faut mettre les directives d'authentification dans une balise <Proxy>.

<Proxy>
    AuthType Basic
    AuthName "Site identifier"
    AuthUserFile /<Path>/<Filename>
    Require user <Username>
</Proxy>

Utiliser SSL

Le module ssl permet un chiffrement des communications entre le client et Apache.

Note : Si votre certificat est auto-signé, le navigateur en avertira les visiteurs. Pour ne pas avoir d'alerte, il faut que le certificat soit signé par une autorité dont le certificat est installé dans le navigateur.

L'activation de ce module se passe de la même manière que pour le précédent paragraphe.

$ sudo a2enmod ssl
$ sudo service apache2 restart

Pour permettre à Apache de répondre sur le port 443 dans des virtual hosts nommés, j'ai ajouté cette ligne dans la partie <IfModule mod_ssl.c> du fichier /etc/apache2/ports.conf :

NameVirtualHost *:443

Note : Modifier la configuration d'un module demande le relancement complet d'Apache, comme son activation.

Si le virtual host default-ssl doit être utilisé, il faut alors remplacer "_default_" dans sa déclaration par "*" :

<VirtualHost *:443>

Il est ensuite possible de créer des virtual hosts utilisant un chiffrement SSL. Il faut utiliser la directive SSLEngine on pour activer le SSL dans un virtual host, puis lui dire quel certificat utiliser.

SSLEngine on
SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key