Directives, modules, fichiers de configuration... Vous avez déjà entendu ces mots mais ils vous paraissent peu familiers ?
La lecture de cet article devrait vous permettre d'en savoir plus sur la configuration globale d'Apache sur Ubuntu. Vous pourrez apprendre comment configurer SSL sur un serveur et comment configurer un fichier .htaccess.
Si vous souhaitez vous informer sur l'installation et la compilation d'Apache sur les autres plateformes et aller plus loin dans la configuration d’Apache voici la documentation officielle.
La configuration globale d'Apache s'effectue sur la plupart des systèmes à l'aide d'un fichier qui se nomme httpd.conf, accompagné de plusieurs autres fichiers de configuration pour gérer des paramètres plus précis (ex. le fichier ports.conf, les fichiers .htaccess...)
Sous Ubuntu c'est le fichier apache2.conf qui est utilisé, le fichier httpd.conf existe mais est vide afin de maintenir la compatibilité avec des applications plus anciennes.
Note : Sur Wamp c'est httpd.conf qui est utilisé par défaut mais avec une stratégie d'écriture légèrement différente.
Ces fichiers de configuration sont de simples fichiers texte éditables avec n'importe quel éditeur de texte, ce qui rend la tâche globalement simple. Il est situé dans le répertoire /etc/apache2/apache2.conf.

Si par exemple vous avez plusieurs sites web sur le même serveur, vous avez la possibilité de passer par des fichiers de conf intermédiaires pour faire de la configuration spécifique.
Pour ce faire, dirigez-vous vers les répertoires /etc/apache2/sites-available (contient les fichiers physiques) et vers le répertoire /etc/apache2/sites-enabled (contient les liens symboliques de ces fichiers de conf).
Vous devez d'abord créer et remplir votre fichier de configuration (que vous pouvez par exemple nommer nomdevotresite.conf) dans le dossier sites-available, puis créer un lien symbolique vers ce fichier dans le dossier sites-enabled de cette façon :
ln –s ../sites-available/{nom du fichier de conf}Il existe des milliers de directives pour alimenter ces fichiers, nous allons en voir quelques unes.
Bon à savoir : Toute modification d’un fichier de configuration Apache nécessite un redémarrage pour être prise en compte. Voici la commande :
sudo /etc/init.d/apache2 restart
Gestion des hôtes virtuelsOn se sert ici du tag <VirtualHost> avec lequel on a la possibilité de configurer plusieurs adresses IP et donc plusieurs certificats.
La directive NameVirtualHost est obligatoire pour mettre en place un VirtualHost.
Dans l’exemple suivant les directives incluses dans la balise VirtualHost s’appliquent seulement à cette adresse au port 80 :
# Note : L'adresse IP spécifiée est l'adresse du serveur # Il est utile de la préciser seulement dans les RARES cas où le serveur a plusieurs IP Listen 80 NameVirtualHost 172.45.46.43.23 <VirtualHost 172.45.46.43.23:80> # Directives que l’on souhaite appliquer à cette adresse < /VirtualHost >
<VirtualHost _default_:*> DocumentRoot /www/default </VirtualHost>
# On s’assure qu’Apache écoute sur le port 80 Listen 80 # Ecoute les requêtes de VirtualHost sur toutes les adresses IP NameVirtualHost *: 80 <VirtualHost * :80> : Toutes les adresses IP au port 80
Attention: Ne pas mettre <VirtualHost + nom de domaine> car si le DNS n'est pas disponible, Apache ne démarrera pas, ou si on utilise un LoadBalancer, l'adresse IP retournée ne sera pas celle de notre machine.
Il existe un serveur par défaut dans Apache qui prend toutes les requêtes entrantes. On le spécifie à l’aide des directives DocumentRoot / ServerName
DocumentRoot : C’est ici qu’est précisé le répertoire racine du serveur. Les requêtes vont chercher par défaut index.php à la racine de ce répertoire.
ServerName (facultatif) : C’est le nom du site web, la directive Virtualhost n'agira que sur ce serveur s'il est spécifié.
Apache reçoit la requête, capte le host (ex: www.toto.com) puis scanne tous les Servername de tous les VirtualHost spécifiés et applique les directives du Virtualhost qui correspondend.
Gestion des répertoiresCela s'effectue à l'aide du tag <Directory>. Il rassemble un groupe de directives qui s'appliquent uniquement au répertoire et sous-répertoires spécifiés.
Les directives qui suivent donnent les droits pour lire ou ne pas lire les fichiers :
<Directory /usr/local/httpd/htdocs> Options Indexes FollowSymLinks Order Allow, Deny Allow from all AllowOverride all </Directory>
Gestion des répertoires virtuelsOn utilise le tag <Location> qui est l'équivalent de <Directory> mais sur un répertoire virtuel. Cette directive s'applique sur un nom virtuel avant la transformation en nom physique.
Utilisez <Location> pour appliquer des directives à un contenu qui est présent à l'extérieur du système de fichiers. Pour les contenus qui sont au sein même du système de fichiers, utilisez <Directory> et <Files>.
<Location /> est une exception, qui est un moyen simple d'appliquer une configuration à l'ensemble du serveur.
De plus, ce tag est particulièrement utile lorsqu’il est combiné à la directive SetHandler. Par exemple, pour activer les requêtes de statuts du serveur, et permettre l’accès aux navigateurs provenant seulement de exemple.com, vous pouvez utiliser:
<Location /status> SetHandler server-status Order Deny,Allow Deny from all Allow from .exemple.com </Location>
Configurer un ensemble de fichier On peut utiliser le tag <Files> pour spécifier un ensemble de fichiers à configurer et pas seulement un Directory.
Configurer un ensemble de fichiers spécifiquesGrâce au tag <FilesMatch>, on peut configurer un ensemble de fichiers qui se ressemblent. On peut par exemple faire correspondre des fichiers contenant une certaine chaine de caractère. Exemple : l'extension *.js.
<FilesMatch + regex> (spécifier l'ensemble de fichiers à matcher à l'aide d'une regex)
ExpireActive On : Rajouter une date d'expiration aux fichiers statiques
ExpiresDefault : durée de vie (ex: A3600 correspond à 1 heure)
</FilesMatch>
Note : la directive Expire est utilisée pour spécifier que le navigateur prend la ressource et la met en cache sur le disque dur. Si on redemande la même ressource, il ne refait pas la requête, et ce jusqu'à la date d'expiration définie.
Attention : S'il y a une erreur dans le fichier on doit attendre la date d'expiration ou bien insister sur le rafraichissement.
Inclure un ensemble de fichiersAvec le tag <Include> on peut rajouter tous les fichiers qui se terminent par l'extension que l'on souhaite dans le dossier de notre choix. L'ordre des Include est traité par ordre alphabétique
Spécifier des directives à un moduleOn se sert du tag <IfModule> pour appliquer des directives à un module spécifique suivant qu'il soit disponible ou non. Les directives au sein de ce bloc ne sont appliquées que si le test renvoie true.
Alias : Cette directive est relative à un nom de domaine. Il est préférable de la placer à l'intérieur d'un Virtualhost, sinon l’alias s'applique pour le serveur par défaut. Il faut de plus préciser le Directory sinon il prend le default (DocumentRoot) qui est configuré en Deny from all.
Alias /image/ /ftp/pub/image <Directory /ftp/pub/image> Order allow,deny Allow from all </Directory>
ServerAlias : Elle définit les noms alternatifs pour un hôte, pour une utilisation avec les virtualhost basés sur le ServerName.
Ne pas les utiliser sauf pour de la redirection (question de ranking sur les moteurs de recherche)
<VirtualHost *:80> ServerName server.domain.com ServerAlias server server2.domain.com server2 ServerAlias *.thecodingmachine.com # Liste des autre directives </VirtualHost>
RedirectPermanent : Tout ce qui commence par la valeur spécifiée est redirigé (code 301) => ça réécrit l'URL dans le navigateur. On peut en faire un temporaire pour que le navigateur ne l'ait pas en cache.
Directive Forcetype : Lorsqu'elle est placée dans un fichier. htaccess ou dans une balise <Directory>, <Location> ou <Files>, cette directive force le type mime de tous les fichiers correspondant. Par exemple, si vous aviez un répertoire avec des images PNG, mais que vous ne voulez pas tous les étiqueter avec gif, vous pouvez l'utiliser. Le module MIME est inclut dans le core de Apache depuis la version 2.0 si ce n'est pas le cas pour votre version il faut l'activer (cf. section Modules pour voir comment activer / désactiver un module).
# Force tous les fichiers à être du type image/png: <Location /images> ForceType image/png </Location> # Tous les autres type MIME sont ici: <Location /images/mixed> ForceType None </Location>
Vous pouvez voir la liste de tous les modules Apache disponibles dans le dossier /etc/apache2/mods-available.
Pour activer un module qui ne l’est pas, il suffit de vous déplacer dans le dossier /etc/apache2/mods-enabled puis de créer un lien symbolique depuis mods-available vers ce dossier de cette façon :
ln –s ../mods-available/{nom du module}Note : C’est exactement la même procédure pour les fichiers de configuration d’un site web dans les dossiers sites-available et sites-enabled (ex. : configuration d’un alias ou d’un virtualhost).
Module authentification (mod_auth) : Ce module fourni tout le nécessaire pour une Authentification HTTP Basic (Login, mot de passe, configuration de la BDD, tables et champs).
Note : Des fonctionnalités similaires et une plus grande évolutivité sont assurées par mod_auth_dbm où les noms d'utilisateur et mots de passe sont stockés dans des fichiers DBM. En effet le module mod_auth fourni des fichiers de passwords en clair.
Module Deflate (mod_deflate) : Permet de compresser des fichiers à la volée. Il présente un avantage et un inconvénient, son utilisation limite la bande passante mais prend beaucoup de CPU. En effet Apache n'a pas de cache et quand il reçoit une requête il ne traite qu'UNE requête à la fois. Une solution possible à cette contrainte est d’utiliser Varnish.
Modules Prefork et worker (mpm_prefork_module, mpm_worker_module) : Modules utilisés dans un souci de stratégie de performance. Ils permettent de configurer le nombre de connexions simultanées qu'Apache peut ouvrir (c'est-à-dire le nombre de requêtes client auxquelles il peut répondre simultanément).
Attention : Il faut faire attention à ce que la directive MaxClient soit définit assez haute pour gérer autant de connexions que l’on souhaite mais pas trop pour ne pas dépasser la capacité en RAM du serveur.
Module Rewrite (mod_rewrite) : Pour éviter d'avoir des URL trop longues ou inapropriées à la page, on utilise ce module qui permet la réécriture d’URL à la volée. Pour l’activer il faut créer le lien symbolique dans mods-enabled comme vu plus haut puis passer la directive RewriteEngine à On.
RewriteBase : Définit l’url de base pour la réécriture d’URL
RewriteCond : Toutes les conditions au dessus d'une règle s'appliquent. Exemple: !-f, !-d
RewriteRule : Règle de réécriture (Regex + fichier à appeler)
# Note: /exemple est l’alias du chemin /chemin/physique,
# Le serveur est configuré avec une directive alias comme ceci :
# Alias /exemple /chemin/physique
RewriteEngine On
# Il faut préciser au serveur qu’on accède via l’alias /exemple et non
# par le chemin d’origine /chemin/physique
RewriteBase /exemple
# Maintenant on peut écrire la règle de réécriture qui s’appliquera que si le navigateur est Firefox (RewriteCond)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla
RewriteRule ^ancien\.html$ nouveau.htmlSSL est un protocole de cryptage des pages transmises au navigateur par le serveur qui est utilisé pour sécuriser l’échange de données sensibles (lors d’un paiement en ligne par exemple).
Pré-requis:
Son utilisation requiert l’acquisition d’un certificat auprès d’une société spécialisée dans la certification, ou bien la création d’un certificat auto-signé.
Ils permettent de fournir divers informations concernant l'identité de son détenteur et contiennent une clé publique indispensable pour chiffrer la communication entre les machines et une clé privée qui fera office de signature numérique.
Note : Pour générer un certificat auto-signé il suffit de se placer dans le dossier /etc/apache2/ssl
puis d’exécuter la commande suivante :
apache2-ssl-certificate
Il suffit d’y ajouter la directive suivante dans un bloc IfModule :
# Si le module SSL est activé alors on écoute sur le port 443
<IfModule mod_ssl.c> Listen 80 Listen 443 </IfModule>
Si on exécute la requête : https://localhost, on n’aura aucun résultat puisque nous n'avons pas encore déclaré de répertoire accessible par le port 443 et le protocole sécurisé https.
Il est nécessaire d'ajouter un fichier de configuration spécifique pour le service web qui bénéficiera du chiffrement. Pour cela dans le répertoire /etc/apache2/sites-available
# Fichier de configuration /etc/apache2/sites-available/exemple.conf
NameVirtualHost 10.72.3.xxx:443
<VirtualHost 10.72.3.xxx:443>
DocumentRoot /var/www/exemple1
ServerName exemple.com
<Directory /var/www/exemple1>
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from all
</Directory>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.pem
SSLCertificateKeyFile /etc/apache2/ssl/9zr563a7i.0
</VirtualHost>Redémarrer Apache pour finaliser l’installation.
Ces fichiers permettent de changer la configuration Apache à la volée pour un sous-répertoire. On peut typiquement les utiliser pour définir un mot de passe dans un répertoire qui contient des informations sensibles, modifier les accès, personnaliser des pages d’erreurs…
Les directives qui lui sont appliquées sont valables pour le répertoire dans lequel il est placé mais aussi récursivement pour tous les sous-répertoires, on peut placer un autre fichier .htaccess dans les sous-répertoires si l’on souhaite voir s’appliquer un comportement différent pour un dossier spécifique.
Attention : Si on réécrit une directive dans le .htaccess d’un répertoire enfant qui est déjà définie dans celle d’un répertoire parent, elle écrase celle du parent.
Exemple de fichier .htaccess :
ErrorDocument 403 <a href="http://www.exemple.com/stop.php3<br />
AuthUserFile" title="http://www.exemple.com/stop.php3<br />
AuthUserFile">http://www.exemple.com/stop.php3<br />
AuthUserFile</a> {chemin vers le fichier de mot passe}
AuthGroupFile {chemin vers le fichier de groupe}
AuthName "Secure Access"
AuthType Basic
Require valid-userLe fichier de mot de passe est de ce type :
Pascal:toto123 Jean:tata123 Jeanne:tutu123
Note : Il est possible de crypter les mots de passe grâce à l’utilitaire htpasswd accessible dans le répertoire bin d'Apache.
Require valid-user précise que l'on autorise uniquement les personnes identifiées à accéder à un dossier. On peut également préciser explicitement le nom des personnes autorisées à s'identifier de cette façon : require user {username}
Erreur courante : Si votre fichier .htaccess n'est pas pris en compte, vérifiez bien que la directive AllowOverride All est présente dans votre configuration Apache.