Retour au blog
hébergement20 min de lecture9 juin 2026

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

bash
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 actives

Activer les modules essentiels

Apache est modulaire. Activez uniquement ce dont vous avez besoin — chaque module inutile est une surface d'attaque potentielle.

bash
# 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 apache2

Configurer 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.

bash
# 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
apache
# /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>
bash
# Activer le site et vérifier la configuration
a2ensite monsite.com.conf
apache2ctl configtest   # doit retourner "Syntax OK"
systemctl reload apache2

HTTPS avec Let's Encrypt (Certbot)

bash
# 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 certbot

Configuration SSL manuelle et durcie

Certbot crée une configuration de base. Renforcez-la pour obtenir une note A+ sur SSL Labs.

apache
# /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)
bash
# 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_3

Inté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.

bash
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
apache
# 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.

bash
a2enmod proxy proxy_http proxy_wstunnel headers
apache
# 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.

apache
# 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

apache
# 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)

apache
<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

apache
# 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

apache
# 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

apache
<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

bash
apt install -y libapache2-mod-evasive
a2enmod evasive
apache
<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

bash
# 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/apache2

GoAccess — analyse de logs en temps réel

bash
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-html

Testez 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

  1. 1
    Apache HTTP Server Documentation

    Documentation officielle Apache 2.4 — référence exhaustive

  2. 2
    Mozilla SSL Configuration Generator

    Générateur de configuration SSL/TLS recommandée par Mozilla pour Apache, Nginx, HAProxy

  3. 3
    CIS Apache HTTP Server Benchmark

    Standard de hardening Apache du Center for Internet Security

  4. 4
    OWASP Secure Headers Project

    Liste et explication de tous les headers de sécurité HTTP recommandés

#apache#web#ssl#https#php#reverse-proxy#linux#hébergement

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.

Apache HTTP Server : configuration complète et sécurisée — Xytherion Tools