Product SiteDocumentation Site

11.2. Serveur web (HTTP)

Les administrateurs de Falcot SA ont choisi Apache comme serveur HTTP. Debian Wheezy fournit la version 2.2.22 de ce logiciel.

11.2.1. Installation d'Apache

L'installation du paquet apache2 entraîne l'installation par défaut de apache2-mpm-worker, une version particulière de ce serveur web. Le paquet apache2 ne contient rien, il sert simplement à s'assurer qu'une des versions de Apache 2 est effectivement installée.
MPM signifie Multi-Processing Module. En effet, ce qui différencie les différentes versions d'Apache 2 est la politique adoptée pour gérer le traitement parallèle d'un grand nombre de requêtes : apache2-mpm-worker emploie des threads (processus légers) pour cela, alors que apache2-mpm-prefork utilise un ensemble de processus créés par avance (comme Apache 1.3). apache2-mpm-event emploie également des threads mais ceux-ci sont libérés lorsque la connexion entrante ne reste ouverte qu'à cause du keep alive HTTP.
Les administrateurs de Falcot installent dans la foulée libapache2-mod-php5 pour activer PHP dans Apache. Cela entraîne la suppression de apache2-mpm-worker et l'installation de apache2-mpm-prefork. En effet, PHP ne fonctionne qu'avec cette version du serveur web.
Apache est un serveur modulaire et la plupart des fonctionnalités sont implémentées dans des modules externes que le programme charge pendant son initialisation. La configuration par défaut n'active que les modules les plus courants et les plus utiles. Mais la commande a2enmod module permet d'activer un nouveau module tandis que a2dismod module le désactive. Ces deux programmes ne font rien d'autre que créer ou supprimer des liens symboliques dans /etc/apache2/mods-enabled/ pointant vers des fichiers de /etc/apache2/mods-available/.
Par défaut, le serveur web écoute sur le port 80 (configuré dans /etc/apache2/ports.conf) et renvoie les pages web depuis le répertoire /var/www/ (configuré dans /etc/apache2/sites-enabled/000-default).

11.2.2. Configuration d'hôtes virtuels

Un hôte virtuel est une identité (supplémentaire) assumée par le serveur web.
Apache distingue deux types d'hôtes virtuels : ceux qui se basent sur l'adresse IP (ou le port) et ceux qui reposent sur le nom DNS du serveur web. La première méthode nécessite une adresse IP différente pour chaque site tandis que la seconde n'emploie qu'une adresse IP et différencie les sites par le nom d'hôte communiqué par le client HTTP (ce qui ne fonctionne qu'avec la version 1.1 du protocole HTTP, heureusement déjà employée par tous les navigateurs web).
La rareté (de plus en plus pressante) des adresses IPv4 fait en général privilégier cette deuxième méthode. Elle est cependant complexifiée si chacun des hôtes virtuels a besoin de HTTPS : le protocole SSL n'a pas toujours permis ce fonctionnement et l'extension SNI (Server Name Indication) qui le rend possible n'est pas connue de tous les navigateurs. Si plusieurs sites HTTPS doivent fonctionner sur un même serveur, on préférera donc les différencier soit par leur port, soit par leur adresse IP (en utilisant éventuellement IPv6).
La configuration par défaut d'Apache 2 a déjà activé les hôtes virtuels basés sur le nom grâce à la directive NameVirtualHost *:80 du fichier /etc/apache2/ports.conf. En outre, un hôte virtuel par défaut est défini dans le fichier /etc/apache2/sites-enabled/000-default. Il sera employé si aucun hôte virtuel correspondant n'existe.
Chaque hôte virtuel supplémentaire est ensuite décrit par un fichier placé dans le répertoire /etc/apache2/sites-available/. Ainsi, la mise en place du domaine falcot.org se résume à créer le fichier ci-dessous puis à l'activer avec a2ensite www.falcot.org.

Exemple 11.16. Fichier /etc/apache2/sites-available/www.falcot.org

<VirtualHost *:80>
ServerName www.falcot.org
ServerAlias falcot.org
DocumentRoot /srv/www/www.falcot.org
</VirtualHost>
Le serveur Apache est ici configuré pour n'utiliser qu'un seul fichier de log pour tous les hôtes virtuels (ce qu'on pourrait changer en intégrant des directives CustomLog dans les définitions des hôtes virtuels). Il est donc nécessaire de personnaliser le format de ce fichier pour y intégrer le nom de l'hôte virtuel. Pour cela, on ajoutera un fichier /etc/apache2/conf.d/customlog définissant un nouveau format (directive LogFormat) et l'employant pour le fichier principal de log. Il faut également désactiver la ligne CustomLog du fichier /etc/apache2/sites-available/default.

Exemple 11.17. Fichier /etc/apache2/conf.d/customlog

# Nouveau format de log avec nom de l'hôte virtuel (vhost)
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vhost

# On emploie le format vhost en standard
CustomLog /var/log/apache2/access.log vhost

11.2.3. Directives courantes

Cette section passe brièvement en revue quelques-unes des directives de configuration d'Apache les plus usitées.
Le fichier de configuration principal contient habituellement plusieurs blocs Directory destinés à paramétrer le comportement du serveur en fonction de l'emplacement du fichier servi. À l'intérieur de ce bloc, on trouve généralement les directives Options et AllowOverride.

Exemple 11.18. Bloc Directory

<Directory /var/www>
Options Includes FollowSymlinks
AllowOverride All
DirectoryIndex index.php index.html index.htm
</Directory>
La directive DirectoryIndex précise la liste des fichiers à essayer pour répondre à une requête sur un répertoire. Le premier fichier existant est appelé pour générer la réponse.
La directive Options est suivie d'une liste d'options à activer. None désactive toutes les options. Inversement, All les active toutes sauf MultiViews. Voici les options existantes :
  • ExecCGI indique qu'il est possible d'exécuter des scripts CGI.
  • FollowSymlinks indique au serveur qu'il doit suivre les liens symboliques et donc effectuer la requête sur le fichier réel qui en est la cible.
  • SymlinksIfOwnerMatch a le même rôle mais impose la restriction supplémentaire de ne suivre le lien que si le fichier pointé appartient au même propriétaire.
  • Includes active les inclusions côté serveur (Server Side Includes, ou SSI). Il s'agit de directives directement intégrées dans les pages HTML et exécutées à la volée à chaque requête.
  • Indexes autorise le serveur à retourner le contenu du dossier si la requête HTTP pointe sur un répertoire dépourvu de fichier d'index (tous les fichiers de la directive DirectoryIndex ayant été tentés en vain).
  • MultiViews active la négociation de contenu, ce qui permet notamment au serveur de renvoyer la page web correspondant à la langue annoncée par le navigateur web.
La directive AllowOverride donne toutes les options qu'on peut activer ou désactiver par l'intermédiaire d'un fichier .htaccess. Il est souvent important de contrôler l'option ExecCGI pour rester maître des utilisateurs autorisés à exécuter un programme au sein du serveur web (sous l'identifiant www-data).

11.2.3.1. Requérir une authentification

Il est parfois nécessaire de restreindre l'accès à une partie d'un site. Les utilisateurs légitimes doivent alors fournir un identifiant et un mot de passe pour accéder à son contenu.

Exemple 11.19. Fichier .htaccess requérant une authentification

Require valid-user
AuthName "Répertoire privé"
AuthType Basic
AuthUserFile /etc/apache2/authfiles/htpasswd-prive
Le fichier /etc/apache2/authfiles/htpasswd-prive contient la liste des utilisateurs et leurs mots de passe ; on le manipule avec la commande htpasswd. Pour ajouter un utilisateur ou changer un mot de passe, on exécutera la commande suivante :
# htpasswd /etc/apache2/authfiles/htpasswd-prive utilisateur
New password:
Re-type new password:
Adding password for user utilisateur

11.2.3.2. Restrictions d'accès

Les directives Allow from et Deny from contrôlent les restrictions d'accès à un répertoire (et ses sous-répertoires).
La directive Order indique dans quel ordre évaluer les directives Allow from et Deny from (et la dernière qui s'applique est retenue). Concrètement, Order deny,allow autorise l'accès si aucune des règles Deny from ne s'applique ou si une des règles Allow from s'applique. Inversement, Order allow,deny refuse l'accès si aucune directive Allow from ne l'autorise (ou si une directive Deny from s'applique).
Les directives Allow from et Deny from peuvent être suivies d'une adresse IP, d'un réseau (exemples : 192.168.0.0/255.255.255.0, 192.168.0.0/24 et même 192.168.0), d'un nom de machine ou de domaine, ou du mot-clé all désignant tout le monde.

Exemple 11.20. Interdire par défaut mais autoriser le réseau local

Order deny,allow
Allow from 192.168.0.0/16
Deny from all

11.2.4. Analyseur de logs

L'analyseur de logs est un compagnon fréquent du serveur web puisqu'il permet aux administrateurs d'avoir une idée plus précise de l'usage fait de ce service.
Les administrateurs de Falcot SA ont retenu AWStats (Advanced Web Statistics, ou statistiques web avancées) pour analyser les fichiers de logs d'Apache.
La première étape de la configuration consiste à créer le fichier /etc/awstats/awstats.conf. Les administrateurs de Falcot n'ont modifié que les différents paramètres donnés ci-dessous :
LogFile="/var/log/apache2/access.log"
LogFormat = "%virtualname %host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"
SiteDomain="www.falcot.com"
HostAliases="falcot.com REGEX[^.*\.falcot\.com$]"
DNSLookup=1
LoadPlugin="tooltips"
Tous ces paramètres sont documentés par commentaires dans le fichier modèle. LogFile et LogFormat indiquent l'emplacement du fichier de log et les informations qu'il contient. Les paramètres SiteDomain et HostAliases indiquent les différents noms associés au site web principal.
Pour les sites à fort trafic, il est déconseillé de positionner DNSLookup à 1 comme dans l'exemple précédent. En revanche, pour les petits sites, ce réglage permet d'avoir des rapports plus lisibles qui emploient les noms complets des machines plutôt que leurs adresses IP.
On activera AWStats pour d'autres hôtes virtuels, en créant un fichier spécifique par hôte, par exemple /etc/awstats/awstats.www.falcot.org.conf.

Exemple 11.21. Fichier de configuration pour un hôte virtuel

Include "/etc/awstats/awstats.conf"
SiteDomain="www.falcot.org"
HostAliases="falcot.org"
AWStats emploie de nombreuses icônes stockées dans le répertoire /usr/share/awstats/icon/. Pour les rendre disponibles sur le site web, il faut modifier la configuration d'Apache et y ajouter la directive suivante :
Alias /awstats-icon/ /usr/share/awstats/icon/
Après quelques minutes (et les premières exécutions du script), le résultat est accessible en ligne :