Apache HTTP Server : configuration complète et sécurisée
Guide expert Apache 2.4 : VirtualHosts, SSL/TLS Let's Encrypt, PHP-FPM, reverse proxy, mod_rewrite, headers de sécurité, performance et protection contre les attaques.
Apache HTTP Server est le serveur web le plus utilisé au monde depuis plus de 25 ans. Flexible, extensible via ses modules, il propulse des millions de sites. Ce guide couvre l'installation, la configuration des VirtualHosts, SSL/TLS avec Let's Encrypt, le reverse proxy, les headers de sécurité, les performances et la protection contre les attaques courantes.
Apache vs Nginx : quand choisir Apache ?
La question revient souvent. Apache et Nginx sont deux excellents serveurs, avec des philosophies différentes :
- Apache utilise un modèle préfork/worker (un thread ou processus par connexion) — excellent pour les sites dynamiques avec mod_php
- Nginx utilise un modèle événementiel asynchrone — meilleur pour les connexions simultanées massives et le contenu statique
- Apache supporte .htaccess nativement — pratique pour les hébergements mutualisés (WordPress, etc.)
- Nginx est généralement plus performant comme reverse proxy ou pour servir des fichiers statiques
- Les deux peuvent coexister : Nginx en frontal (port 80/443) qui proxifie vers Apache (port 8080)
Installation sur Debian / Ubuntu
apt update && apt install -y apache2 apache2-utils
# Vérification de la version
apache2 -v
# Server version: Apache/2.4.x (Debian)
# Statut du service
systemctl status apache2
# Activer le démarrage automatique
systemctl enable apache2
# Structure des répertoires importants
ls /etc/apache2/
# apache2.conf ← configuration principale
# sites-available/ ← VirtualHosts disponibles (désactivés)
# sites-enabled/ ← VirtualHosts actifs (liens symboliques)
# mods-available/ ← modules disponibles
# mods-enabled/ ← modules actifs (liens symboliques)
# conf-available/ ← configurations disponibles
# conf-enabled/ ← configurations activesActiver les modules essentiels
Apache est modulaire. Activez uniquement ce dont vous avez besoin — chaque module inutile est une surface d'attaque potentielle.
# Modules essentiels pour la production
a2enmod rewrite # Réécriture d'URLs (mod_rewrite)
a2enmod ssl # Support HTTPS
a2enmod headers # Manipulation des en-têtes HTTP
a2enmod expires # Cache navigateur (Expires/Cache-Control)
a2enmod deflate # Compression gzip/brotli
a2enmod proxy # Proxy HTTP de base
a2enmod proxy_http # Proxy vers backend HTTP
a2enmod proxy_fcgi # Proxy vers PHP-FPM (FastCGI)
a2enmod http2 # Protocole HTTP/2
# Désactiver les modules inutiles (sécurité)
a2dismod status # Expose des infos serveur — désactiver en prod
a2dismod autoindex # Listing de répertoires — désactiver en prod
a2dismod userdir # Répertoires ~user — désactiver si inutile
systemctl restart apache2Configurer un VirtualHost HTTP
Apache permet d'héberger plusieurs sites sur le même serveur grâce aux VirtualHosts. Chaque site a son propre fichier de configuration.
# Créer le répertoire web du site
mkdir -p /var/www/monsite.com/public_html
chown -R www-data:www-data /var/www/monsite.com
chmod -R 755 /var/www/monsite.com
# Créer une page d'accueil de test
echo '<h1>Bienvenue sur monsite.com</h1>' > /var/www/monsite.com/public_html/index.html# /etc/apache2/sites-available/monsite.com.conf
<VirtualHost *:80>
ServerName monsite.com
ServerAlias www.monsite.com
ServerAdmin admin@monsite.com
DocumentRoot /var/www/monsite.com/public_html
# Logs dédiés au site
ErrorLog ${APACHE_LOG_DIR}/monsite.com_error.log
CustomLog ${APACHE_LOG_DIR}/monsite.com_access.log combined
# Permettre la réécriture d'URLs
<Directory /var/www/monsite.com/public_html>
Options -Indexes -FollowSymLinks # Désactiver listing et symlinks
AllowOverride All # Permettre .htaccess
Require all granted
</Directory>
# Redirection HTTP → HTTPS (à activer après SSL)
# RewriteEngine On
# RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost># Activer le site et vérifier la configuration
a2ensite monsite.com.conf
apache2ctl configtest # doit retourner "Syntax OK"
systemctl reload apache2HTTPS avec Let's Encrypt (Certbot)
# Installation de Certbot
apt install -y certbot python3-certbot-apache
# Obtenir et installer automatiquement le certificat
certbot --apache -d monsite.com -d www.monsite.com
# Certbot modifie automatiquement votre VirtualHost et crée le VHost HTTPS
# Renouvellement automatique (test)
certbot renew --dry-run
# Certbot installe une tâche cron ou systemd timer automatiquement
# Vérifier
systemctl list-timers | grep certbotConfiguration SSL manuelle et durcie
Certbot crée une configuration de base. Renforcez-la pour obtenir une note A+ sur SSL Labs.
# /etc/apache2/sites-available/monsite.com-ssl.conf
<VirtualHost *:443>
ServerName monsite.com
ServerAlias www.monsite.com
DocumentRoot /var/www/monsite.com/public_html
# Certificats SSL (Let's Encrypt)
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/monsite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/monsite.com/privkey.pem
# Protocoles et ciphers modernes (Mozilla Intermediate)
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionTickets off
# OCSP Stapling (certificat validé côté serveur)
SSLUseStapling On
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors Off
# HTTP/2
Protocols h2 http/1.1
# Headers de sécurité
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:"
# Masquer la version Apache
ServerTokens Prod
ServerSignature Off
<Directory /var/www/monsite.com/public_html>
Options -Indexes -FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/monsite.com_ssl_error.log
CustomLog ${APACHE_LOG_DIR}/monsite.com_ssl_access.log combined
</VirtualHost>
# Configuration OCSP Stapling globale (hors VirtualHost)
SSLStaplingCache shmcb:/var/run/ocsp(128000)# Activer le VHost SSL
a2ensite monsite.com-ssl.conf
apache2ctl configtest && systemctl reload apache2
# Tester la configuration SSL
curl -I https://monsite.com
openssl s_client -connect monsite.com:443 -tls1_3Intégrer PHP-FPM (recommandé vs mod_php)
PHP-FPM (FastCGI Process Manager) est plus performant et plus sûr que mod_php car chaque site peut tourner sous son propre utilisateur Linux.
apt install -y php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring
# Vérifier que PHP-FPM tourne
systemctl status php8.3-fpm# Dans le VirtualHost, remplacer mod_php par PHP-FPM
<VirtualHost *:443>
# ...
# Utiliser PHP-FPM via socket Unix (plus rapide que TCP)
<FilesMatch .php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
# Ou via TCP (si PHP-FPM est sur un autre serveur)
# <FilesMatch .php$>
# SetHandler "proxy:fcgi://127.0.0.1:9000"
# </FilesMatch>
</VirtualHost>Apache comme reverse proxy
Apache peut servir de frontal HTTPS pour des applications backend (Node.js, Python, Java, etc.) en proxifiant les requêtes.
a2enmod proxy proxy_http proxy_wstunnel headers# Reverse proxy vers une app Node.js sur le port 3000
<VirtualHost *:443>
ServerName app.monsite.com
# Paramètres SSL (voir section précédente)
SSLEngine on
# ...
# Proxy vers le backend
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
# Transmettre la vraie IP du client au backend
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Real-IP %{REMOTE_ADDR}s
# Support WebSockets (pour Socket.io, etc.)
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://127.0.0.1:3000/$1" [P,L]
</VirtualHost>mod_rewrite : réécriture d'URLs
mod_rewrite est l'un des modules les plus puissants d'Apache. Il permet de transformer les URLs à la volée — essentiel pour les frameworks MVC, les redirections SEO et la protection anti-hotlinking.
# Dans .htaccess ou dans le VirtualHost
RewriteEngine On
# 1. Redirection HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 2. Supprimer le www (canonicalisation SEO)
RewriteCond %{HTTP_HOST} ^www.monsite.com [NC]
RewriteRule ^ https://monsite.com%{REQUEST_URI} [L,R=301]
# 3. Réécriture propre pour un framework MVC (ex: Laravel, Symfony)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
# 4. Bloquer l'accès aux fichiers sensibles
<FilesMatch "(.env|.git|composer.json|package.json)">
Require all denied
</FilesMatch>
# 5. Anti-hotlinking (protéger les images)
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://(www.)?monsite.com [NC]
RewriteRule .(jpg|jpeg|png|gif|webp)$ - [F,NC]Optimiser les performances
Compression gzip/brotli
# Dans /etc/apache2/conf-available/compression.conf
<IfModule mod_deflate.c>
# Compresser les types de fichiers textuels
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilterByType DEFLATE text/css text/javascript
AddOutputFilterByType DEFLATE application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/rss+xml
AddOutputFilterByType DEFLATE image/svg+xml font/woff2
# Exclure les navigateurs défectueux (IE6)
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch MSIE !no-gzip !gzip-only-text/html
</IfModule>Cache navigateur (Expires)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
# HTML — pas de cache long (contenu dynamique)
ExpiresByType text/html "access plus 0 seconds"
# CSS, JS — cache 1 an (utiliser cache-busting en URL)
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
# Images
ExpiresByType image/png "access plus 6 months"
ExpiresByType image/jpeg "access plus 6 months"
ExpiresByType image/webp "access plus 6 months"
# Fonts
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
</IfModule>KeepAlive et tuning des workers
# Dans apache2.conf ou httpd.conf
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
# MPM Event (recommandé sur Ubuntu/Debian)
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>Sécuriser Apache en production
Masquer la version du serveur
# Dans /etc/apache2/conf-available/security.conf
ServerTokens Prod # N'affiche que "Apache" sans version
ServerSignature Off # Supprime la signature dans les pages d'erreur
TraceEnable Off # Désactive HTTP TRACE (CSRF potentiel)
# Protéger contre le clickjacking
Header always set X-Frame-Options "DENY"
# Forcer le type MIME déclaré (anti MIME-sniffing)
Header always set X-Content-Type-Options "nosniff"Limiter les méthodes HTTP autorisées
<Directory /var/www/monsite.com/public_html>
# N'autoriser que GET, POST, HEAD
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
</Directory>Rate limiting avec mod_ratelimit et mod_evasive
apt install -y libapache2-mod-evasive
a2enmod evasive<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5 # max requêtes à la même page en DOSPageInterval
DOSSiteCount 50 # max requêtes au site en DOSSiteInterval
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10 # Durée du blocage en secondes
DOSLogDir /var/log/apache2/evasive/
# DOSEmailNotify admin@monsite.com
</IfModule>Analyser les logs Apache
# Logs en temps réel
tail -f /var/log/apache2/access.log
tail -f /var/log/apache2/error.log
# Format combined (défaut) : IP - user [date] "requête" code taille "referer" "user-agent"
# 192.168.1.1 - - [01/Jun/2026:12:00:00 +0000] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."
# IPs qui font le plus de requêtes (potentiel bot/attaque)
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
# Codes HTTP 5xx (erreurs serveur)
grep ' 5[0-9][0-9] ' /var/log/apache2/access.log | tail -50
# Pages les plus demandées
awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -20
# Rotation des logs (déjà configurée via logrotate)
cat /etc/logrotate.d/apache2GoAccess — analyse de logs en temps réel
apt install -y goaccess
# Analyse en terminal
goaccess /var/log/apache2/access.log --log-format=COMBINED
# Générer un rapport HTML
goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/stats/report.html --real-time-htmlTestez systématiquement vos headers SSL sur ssllabs.com/ssltest et vos headers de sécurité sur securityheaders.com. L'objectif est A+ dans les deux. La configuration présentée dans cet article l'obtient.
Sources & références
- 1Apache HTTP Server Documentation
Documentation officielle Apache 2.4 — référence exhaustive
- 2Mozilla SSL Configuration Generator
Générateur de configuration SSL/TLS recommandée par Mozilla pour Apache, Nginx, HAProxy
- 3CIS Apache HTTP Server Benchmark
Standard de hardening Apache du Center for Internet Security
- 4OWASP Secure Headers Project
Liste et explication de tous les headers de sécurité HTTP recommandés
Testez vos configurations
Xytherion Tools propose des outils gratuits pour vérifier vos DNS, auditer votre SSL, tester SPF/DKIM/DMARC et bien plus — directement depuis votre navigateur.