Aller au contenu

Apache : structure de la configuration

Comprendre l’organisation de la configuration d’Apache évite l’essentiel des erreurs. Les exemples utilisent des noms génériques.

La configuration est faite de directives (Nom valeur) et de conteneurs (<Nom …> … </Nom>) qui limitent leur portée :

Conteneur Portée
<VirtualHost *:80> Un site (nom de domaine, port)
<Directory /chemin> Un dossier du disque et ses sous-dossiers
<Files "nom">, <FilesMatch "regex"> Des fichiers d’après leur nom
<Location /url> Une URL (indépendante du disque)
<Proxy>, <IfModule>, <If> Proxy, conditions sur les modules ou les requêtes
<VirtualHost *:80>
ServerName exemple.com
DocumentRoot /var/www/exemple.com
<Directory /var/www/exemple.com>
Require all granted
</Directory>
<Location /admin>
Require ip 192.168.1.0/24
</Location>
</VirtualHost>

<Directory> s’applique au système de fichiers, <Location> à l’URL : pour contrôler l’accès à des fichiers, utiliser <Directory> ou <Files>.

apache2.conf inclut les fichiers « activés » : un fichier par site, par module et par fragment.

/etc/apache2/
├── apache2.conf
├── ports.conf
├── envvars
├── sites-available/ ← un fichier .conf par site
├── sites-enabled/ ← liens symboliques (créés par a2ensite)
├── conf-available/ ← fragments de configuration (ex. security.conf)
├── conf-enabled/
├── mods-available/ ← modules (.load) et leurs réglages (.conf)
└── mods-enabled/
Fenêtre de terminal
sudo a2ensite exemple.com # lien symbolique dans sites-enabled
sudo a2dissite exemple.com
sudo a2enmod headers
sudo a2enconf security
Fenêtre de terminal
sudo cp /etc/apache2/sites-available/exemple.com.conf /etc/apache2/sites-available/exemple.com.conf.bak
sudo nano /etc/apache2/sites-available/exemple.com.conf
sudo apache2ctl configtest # 1. tester : « Syntax OK »
sudo systemctl reload apache2 # 2. appliquer sans couper les connexions
sudo tail -n 20 /var/log/apache2/error.log # 3. vérifier

Les fichiers de sauvegarde .bak placés dans sites-available/ sont ignorés (seuls les fichiers .conf activés sont lus).

Commande Effet
sudo apache2ctl configtest Teste la syntaxe
sudo apache2ctl -S Sites virtuels et leur ordre
sudo apache2ctl -M Modules chargés
sudo systemctl reload apache2 Recharge la configuration (processus conservés)
sudo systemctl restart apache2 Redémarre (coupe les connexions)

Apache 2.4 utilise Require (l’ancien Order allow,deny n’est plus recommandé) :

Directive Effet
Require all granted Autorise tout le monde
Require all denied Refuse tout le monde
Require ip 192.168.1.0/24 Autorise ces adresses
Require valid-user Utilisateur authentifié (voir Sécurité)
Require not ip 203.0.113.5 Exclut une adresse (dans un <RequireAll>)
<Directory /var/www/exemple.com/prive>
<RequireAll>
Require ip 192.168.1.0/24
Require valid-user
</RequireAll>
</Directory>

<RequireAny> (un des critères suffit, valeur par défaut) et <RequireAll> (tous requis) combinent les critères.

Le fichier apache2.conf d’Ubuntu refuse l’accès au système de fichiers par défaut, puis ouvre seulement ce qui est déclaré :

<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

Pour servir un dossier hors de /var/www, déclarer explicitement un <Directory> avec Require all granted, sinon 403 Forbidden.

Option Effet
Indexes Liste le contenu d’un dossier sans fichier d’index
FollowSymLinks Suit les liens symboliques
MultiViews Négociation de contenu (à éviter, source de surprises)
ExecCGI Autorise les scripts CGI

Options -Indexes désactive le listing. Le signe - retire une option ; + en ajoute une.

Un fichier .htaccess placé dans un dossier modifie la configuration de ce dossier sans recharger Apache. Il n’est lu que si AllowOverride l’autorise :

<Directory /var/www/exemple.com>
AllowOverride None # .htaccess ignoré (recommandé : plus rapide et plus sûr)
# AllowOverride All # .htaccess pris en compte (applications qui l'exigent)
Require all granted
</Directory>

Quand plusieurs conteneurs s’appliquent à une même requête, Apache les fusionne dans l’ordre : <Directory> (et .htaccess), puis <Files>, puis <Location>. En cas de conflit, le dernier l’emporte.

ErrorLog ${APACHE_LOG_DIR}/exemple.com.error.log # variable définie dans /etc/apache2/envvars
Define SITE_ROOT /var/www/exemple.com
DocumentRoot ${SITE_ROOT}
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>

Le bloc est ignoré silencieusement si le module n’est pas chargé : utile pour des configurations portables, mais peut masquer un oubli de a2enmod.

IncludeOptional /etc/apache2/snippets/*.conf
Include /etc/apache2/conf-enabled/security.conf
Piège Explication
403 sur un dossier hors de /var/www Absence de <Directory> avec Require all granted
Header sans module Erreur Invalid command 'Header' : sudo a2enmod headers
Règles RewriteRule ignorées a2enmod rewrite, et AllowOverride si elles sont dans un .htaccess
Modification non prise en compte Oubli de reload, ou site non activé (a2ensite)
Fichier de site non pris en compte Extension différente de .conf
Fenêtre de terminal
sudo apache2ctl configtest # erreur de syntaxe : fichier et ligne indiqués
sudo apache2ctl -S # quel site répond à quel nom ?
sudo tail -f /var/log/apache2/error.log # pendant un test de requête
curl -I -H "Host: exemple.com" http://127.0.0.1/chemin