Product SiteDocumentation Site

11.2. Serveur web (HTTP)

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

11.2.1. Installation d'Apache

Il suffit d'installer le paquet apache2. Il contient tous les modules, y compris ceux qui affectent la façon dont Apache gère le traitement parallèle des nombreuses demandes (Multi-Processing Modules (MPM) — ces modules étaient auparavant fournis par des paquets distincts apache2-mpm-*). Il entraîne aussi l'installation de apache2-utils qui contient des utilitaires en ligne de commandes qui sont décrits plus loin.
Le module MPM employé définit la manière dont Apache traite les requêtes entrantes. Avec le MPM worker il utilise des threads (processus légers), alors qu'avec le MPM prefork il utilise un ensemble de processus créés par avance. Avec le MPM event il utilise également des threads, mais les connexions inactives (notamment celle gardées ouvertes par la fonctionnalité keep-alive du protocole HTTP) sont rendues à un thread dédié à leur gestion.
Les administrateurs de Falcot installent dans la foulée libapache2-mod-php5 pour activer PHP dans Apache. Cela entraîne la désactivation du MPM event, et active à la place prefork. En effet, PHP ne fonctionne qu'avec ce module MPM particulier.
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/html/ (configuré dans /etc/apache2/sites-enabled/000-default.conf).

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 exploite les hôtes virtuels basés sur le nom. De plus, un hôte virtuel par défaut a été défini dans le fichier /etc/apache2/sites-enabled/000-default.conf. Cet hôte virtuel sera employé si aucun autre hôte virtuel ne correspond à la requête du client.
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.conf

<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-available/customlog.conf définissant un nouveau format (directive LogFormat) et on l'activera avec a2enconf customlog. Il faut également supprimer (ou passer en commentaire) la ligne CustomLog du fichier /etc/apache2/sites-available/000-default.conf.

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

# 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

La directive Require contrôle les restrictions d'accès à un répertoire (et ses sous-répertoires).
Cette directive peut être utilisée pour restreindre les accès suivant de nombreux critères. Les restrictions d'accès basées sur les adresses IP du client sont décrites plus loin mais cette directive est bien plus puissante, tout particulièrement lorsque plusieurs directives Require sont combinées dans un bloc RequireAll.

Exemple 11.20. Uniquement autoriser le réseau local

Require ip 192.168.0.0/16

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 AWStats 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 :