Introduction
Apache HTTP Server (souvent appelé simplement Apache ou httpd) est le serveur web le plus répandu dans l'histoire du Web. Developpe depuis 1995 par la fondation Apache, il est reconnu pour sa flexibilité, son système de modules extensible et sa documentation abondante. Bien qu'il soit plus ancien que Nginx, Apache reste un choix solide pour de nombreux cas d'usage, notamment grâce à sa gestion native des fichiers .htaccess et son intégration etroite avec PHP.
Ce guide couvre l'installation, la configuration, la sécurisation et l'optimisation d'Apache sur les distributions Linux les plus courantes.
Installation
Sur Debian / Ubuntu
sudo apt update
sudo apt install -y apache2Verifiez le statut du service :
sudo systemctl status apache2
sudo systemctl enable apache2Sur Fedora / RHEL / AlmaLinux
Sur ces distributions, le paquet s'appelle httpd :
sudo dnf install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpdOuvrez les ports dans le pare-feu :
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reloadVerifiez l'installation en accedant a l'adresse IP du serveur dans un navigateur. La page par défaut d'Apache devrait s'afficher.
Architecture Apache (MPM)
Apache utilisé des modules multi-processus (MPM -- Multi-Processing Modules) pour gérer les connexions. Le choix du MPM a un impact direct sur les performances et la consommation de ressources.
MPM prefork
Chaque requête est traitee par un processus fils separe. C'est le mode le plus stable mais aussi le plus gourmand en mémoire. Il est requis par mod_php.
# /etc/apache2/mods-available/mpm_prefork.conf (Debian)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 3000
</IfModule>MPM worker
Utilise des threads au sein de plusieurs processus. Plus léger que prefork mais incompatible avec mod_php (utilisez php-fpm a la place).
<IfModule mpm_worker_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>MPM event
Evolution du MPM worker, il dédié un thread a la gestion des connexions keep-alive. C'est le MPM recommande pour les serveurs modernes.
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
</IfModule>Pour changer de MPM sur Debian/Ubuntu :
# Desactiver le MPM actuel et activer event
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2Pour vérifiér le MPM actif :
apachectl -V | grep MPMConfiguration de base
Localisation des fichiers
Les chemins different selon la distribution :
| Element | Debian/Ubuntu | Fedora/RHEL |
|---|---|---|
| Configuration principale | /etc/apache2/apache2.conf | /etc/httpd/conf/httpd.conf |
| Virtual hosts | /etc/apache2/sites-available/ | /etc/httpd/conf.d/ |
| Modules | /etc/apache2/mods-available/ | /etc/httpd/conf.modules.d/ |
| Logs | /var/log/apache2/ | /var/log/httpd/ |
| Racine web | /var/www/html/ | /var/www/html/ |
Directives principales
Voici les directives essentielles a connaître dans le fichier de configuration principal :
# /etc/apache2/apache2.conf (Debian) ou /etc/httpd/conf/httpd.conf (Fedora)
# Utilisateur et groupe sous lesquels Apache s'exécute
User www-data
Group www-data
# Adresse email de l'administrateur
ServerAdmin [email protected]
# Nom de domaine principal du serveur
ServerName example.com
# Repertoire racine par défaut
DocumentRoot /var/www/html
# Restreindre l'accès au système de fichiers
<Directory />
AllowOverride None
Require all denied
</Directory>
# Autoriser le répertoire web
<Directory /var/www/>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Timeout des connexions
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5Testez toujours la configuration avant de redémarrer :
# Debian/Ubuntu
sudo apachectl configtest
# Fedora/RHEL
sudo httpd -tVirtual hosts
Les virtual hosts permettent d'hébergér plusieurs sites sur un meme serveur Apache.
Creer un virtual host
sudo nano /etc/apache2/sites-available/monsite.example.com.confContenu :
<VirtualHost *:80>
ServerName monsite.example.com
ServerAlias www.monsite.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/monsite.example.com/html
<Directory /var/www/monsite.example.com/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/monsite-error.log
CustomLog ${APACHE_LOG_DIR}/monsite-access.log combined
</VirtualHost>Activez le site et rechargez Apache :
sudo mkdir -p /var/www/monsite.example.com/html
echo "<h1>Bienvenue sur monsite</h1>" | sudo tee /var/www/monsite.example.com/html/index.html
sudo a2ensite monsite.example.com.conf
sudo systemctl reload apache2Pour désactiver un site :
sudo a2dissite monsite.example.com.conf
sudo systemctl reload apache2Sur Fedora/RHEL, placez simplement le fichier dans /etc/httpd/conf.d/ avec l'extension .conf et rechargez httpd.
Modules
Apache tire sa puissance de son système de modules. Voici les plus utilisés.
Gestion des modules sur Debian/Ubuntu
# Lister les modules charges
apachectl -M
# Activer un module
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy proxy_http
sudo a2enmod headers
# Desactiver un module
sudo a2dismod autoindex
# Recharger après modification
sudo systemctl restart apache2mod_rewrite -- Reécriture d'URL
Ce module est indispensable pour les applications web modernes (WordPress, Laravel, etc.) :
<VirtualHost *:80>
ServerName app.example.com
DocumentRoot /var/www/app/public
<Directory /var/www/app/public>
AllowOverride All
Require all granted
# Reécrire toutes les requêtes vers index.php (front controller)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>
</VirtualHost>mod_proxy -- Reverse proxy
Configurez Apache comme reverse proxy devant une application backend :
sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests<VirtualHost *:80>
ServerName api.example.com
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
# Equilibrage de charge entre plusieurs backends
<Proxy "balancer://app_cluster">
BalancerMember http://127.0.0.1:3000
BalancerMember http://127.0.0.1:3001
ProxySet lbmethod=byrequests
</Proxy>
</VirtualHost>mod_headers -- En-tetes HTTP
<VirtualHost *:443>
# En-tetes de sécurité
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Cache control pour les fichiers statiques
<FilesMatch "\.(css|js|png|jpg|gif|ico|svg|woff2)$">
Header set Cache-Control "public, max-age=2592000, immutable"
</FilesMatch>
</VirtualHost>Fichiers .htaccess
Les fichiers .htaccess permettent de modifier la configuration Apache au niveau d'un répertoire sans toucher a la configuration principale. Ils sont pratiques mais ont un impact sur les performances car Apache les relit a chaque requête.
Pour activer les .htaccess, assurez-vous que la directive AllowOverride est sur All dans la configuration du répertoire concerne.
Exemples courants de .htaccess :
# Redirection HTTP vers HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Bloquer l'accès a certains fichiers
<FilesMatch "\.(env|git|htpasswd|log)$">
Require all denied
</FilesMatch>
# Protection par mot de passe
AuthType Basic
AuthName "Zone restreinte"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
# Desactiver le listing des répertoires
Options -Indexes
# Page d'erreur personnalisée
ErrorDocument 404 /erreur-404.html
ErrorDocument 500 /erreur-500.htmlPour créer un fichier de mots de passe :
sudo htpasswd -c /etc/apache2/.htpasswd utilisateur1
sudo htpasswd /etc/apache2/.htpasswd utilisateur2SSL/TLS avec Let's Encrypt
Installation de Certbot
Sur Debian/Ubuntu :
sudo apt install -y certbot python3-certbot-apacheSur Fedora :
sudo dnf install -y certbot python3-certbot-apacheObtenir un certificat
sudo certbot --apache -d monsite.example.com -d www.monsite.example.comCertbot créé automatiquement un virtual host SSL. Le résultat ressemble a :
<VirtualHost *:443>
ServerName monsite.example.com
DocumentRoot /var/www/monsite.example.com/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/monsite.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/monsite.example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
<Directory /var/www/monsite.example.com/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>Renouvellement automatique
sudo certbot renew --dry-run
sudo systemctl status certbot.timerIntegration PHP
Option 1 : mod_php (avec MPM prefork)
C'est la méthode la plus simple mais la moins performante :
sudo apt install -y libapache2-mod-php php php-mysql php-curl php-xml
sudo a2enmod php8.2
sudo systemctl restart apache2Option 2 : PHP-FPM (recommande)
PHP-FPM fonctionne comme un service indépendant communiquant avec Apache via un socket. C'est la méthode recommandee car elle est compatible avec les MPM event et worker.
sudo apt install -y php-fpm php-mysql php-curl php-xml
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm
sudo systemctl restart apache2Configuration du virtual host avec PHP-FPM :
<VirtualHost *:80>
ServerName php.example.com
DocumentRoot /var/www/php-app/public
<Directory /var/www/php-app/public>
AllowOverride All
Require all granted
</Directory>
# Diriger les fichiers PHP vers PHP-FPM
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>Verifiez que PHP fonctionne :
echo "<?php phpinfo();" | sudo tee /var/www/php-app/public/info.php
curl http://php.example.com/info.php | head -5
# Supprimez ce fichier après le test
sudo rm /var/www/php-app/public/info.phpLogging et monitoring
Format de logs
Apache proposé plusieurs formats de logs. Le format combined est le plus courant :
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
# Logs par virtual host
CustomLog ${APACHE_LOG_DIR}/monsite-access.log combined
ErrorLog ${APACHE_LOG_DIR}/monsite-error.log
LogLevel warnAnalyser les logs
# Requetes en temps reel
tail -f /var/log/apache2/access.log
# Les 10 pages les plus visitees
awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Nombre de requêtes par code de statut
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn
# Requetes par heure
awk '{print $4}' /var/log/apache2/access.log | cut -d: -f2 | sort | uniq -cPage de statut Apache
Activez le module mod_status pour surveiller les performances en temps reel :
sudo a2enmod status<Location "/server-status">
SetHandler server-status
Require ip 127.0.0.1
Require ip ::1
</Location>
# Activer le suivi etendu
ExtendedStatus Onsudo systemctl reload apache2
curl http://127.0.0.1/server-status?autoSecurite
Masquer les informations du serveur
# Dans apache2.conf ou httpd.conf
ServerTokens Prod
ServerSignature OffDesactiver le listing des répertoires
<Directory /var/www/>
Options -Indexes
</Directory>Limiter les méthodes HTTP
<Directory /var/www/html>
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
</Directory>Protection contre le clickjacking et XSS
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Content-Security-Policy "default-src 'self'"Limiter la taille des requêtes
# Limiter la taille du corps des requêtes a 10 Mo
LimitRequestBody 10485760Bloquer les user-agents malveillants
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (bot|crawler|spider|scraper) [NC]
RewriteRule .* - [F,L]Resume des commandes essentielles
# Tester la configuration
sudo apachectl configtest
# Recharger la configuration
sudo systemctl reload apache2
# Redémarrer complètement
sudo systemctl restart apache2
# Activer/désactiver un site (Debian)
sudo a2ensite monsite.conf
sudo a2dissite monsite.conf
# Activer/désactiver un module (Debian)
sudo a2enmod rewrite
sudo a2dismod autoindex
# Voir les modules charges
apachectl -M
# Voir la configuration complete
apachectl -S
# Suivre les logs
sudo tail -f /var/log/apache2/error.log