Apache associé à PHP permet d'héberger aussi bien le site par défaut (/var/www/html) que des sites dédiés, accessibles par nom de domaine (/var/www/nomdedomaine.fr).
+------------------+
| Utilisateurs |
+---------+--------+
|
v
+---------------------------+
| Apache + PHP |
+-------------+-------------+
| |
v v
+---------------+ +----------------------------+
| /var/www/html | | /var/www/nomdedomaine.fr |
| default | | site2 |
+---------------+ +----------------------------+
Installer Apache & PHP
apt install apache2 -y
systemctl status apache2
apt install php libapache2-mod-php php-mysql php-xml php-mbstring php-curl -y # dernière version stable
apt remove --purge php libapache2-mod-php php-mysql php-xml php-mbstring php-curl -y
# dépôts de Sury
apt install -y apt-transport-https lsb-release ca-certificates wget gnupg
wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
apt update
apt install php8.3 php8.3-mysql php8.3-xml php8.3-fpm php8.3-mbstring php8.3-curl libapache2-mod-php8.3 -y
apt remove --purge php php8.2* libapache2-mod-php8.2 -y
apt autoremove --purge -y
a2dismod php8.2 # Désactiver mod_php si l'ancienne version est encore chargée
a2enconf php8.3-fpm # Apache délègue le traitement des scripts à un serveur FastCGI (ne charge pas PHP dans Apache lui-même), plus performant et sécurisé
a2enmod proxy_fcgi setenvif # Activer les modules nécessaires au proxy FastCGI
systemctl reload apache2 # Recharger Apache
apachectl -S # permet de récupérer des informations sur la configuration d'Apache.
http://votre_ip/
http://name_serveur/
echo "<?php phpinfo();?>" | tee /var/www/html/info.php
bash -c 'echo "<?php phpinfo(); ?>" > /var/www/html/info.php && chmod 644 /var/www/html/info.php'
# Tester la configuration Apache
apachectl configtest # Teste la syntaxe des fichiers de conf (à faire AVANT un reload !)
# Démarrer / redémarrer / arrêter Apache
systemctl start apache2 # Démarre Apache
systemctl stop apache2 # Arrête Apache
systemctl restart apache2 # Redémarre Apache (arrêt + démarrage complet)
systemctl reload apache2 # Recharge la conf SANS couper les connexions (gracieux)
systemctl status apache2 # Affiche l'état du service Apache (actif, erreurs, etc.)
# Statut détaillé (version + modules + virtualhosts)
apache2ctl status # Affiche un mini résumé du service Apache
apache2ctl fullstatus # Plus détaillé (nécessite mod_status activé et accessible)
apache2ctl -S # Liste les VirtualHosts, ports, fichiers de conf utilisés
# Redémarrage sans perte de connexions
apache2ctl graceful # Recharge la configuration et relance les processus enfants sans tout couper
apache2ctl graceful-stop # Arrête Apache proprement, après avoir terminé les connexions actives
# Autres utiles
apache2ctl -M # Liste des modules Apache chargés
apache2ctl -V # Affiche la version Apache et les chemins de compilation
apache2ctl help # Liste des options disponibles
tail -f /var/log/apache2/error.log
tail -f /var/log/apache2/access.log
Modules Apache compatibles avec PHP
Apache peut exécuter PHP via plusieurs modules. Toutefois, un seul doit être actif par VirtualHost afin d'éviter tout conflit.
| Module | Description | Utilisation recommandée | Statut |
|---|---|---|---|
mod_php (libapache2-mod-php) |
PHP est chargé directement dans Apache. Simple à configurer, adapté au développement local. | Développement local, petits projets | Classique (mais dépassé en prod) |
mod_fcgid (libapache2-mod-fcgid) |
Apache exécute des scripts FastCGI externes (souvent php-cgi). Différent de proxy_fcgi vers PHP-FPM. |
Cas legacy, CGI/FastCGI spécifiques | À réserver aux besoins précis |
proxy_fcgi + php8.x-fpm |
Apache proxy les requêtes PHP vers PHP-FPM (via socket ou TCP). La méthode recommandée aujourd'hui. | Production, multi-version PHP | Recommandé |
mod_fastcgi |
Ancien module FastCGI, non maintenu. Remplacé par mod_fcgid. | À éviter | Obsolète |
mod_cgi / mod_cgid |
Exécute PHP en mode CGI pur. Très lent et inefficace en production. | Cas extrêmes, dépannage | À éviter |
Exemple de VirtualHost utilisant proxy_fcgi avec PHP-FPM :
<VirtualHost *:80>
ServerName mon-site.local
DocumentRoot /var/www/mon-site/httpdoc
<Directory /var/www/mon-site/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Rediriger les requêtes PHP vers PHP-FPM via proxy_fcgi
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/mon-site_error.log
CustomLog ${APACHE_LOG_DIR}/mon-site_access.log combined
</VirtualHost>
Gestion des modules :
# Les Modules :
a2enmod fcgid
a2enmod rewrite
a2enmod proxy
a2enmod proxy_fcgi
a2enmod ssl
# [Install]
apt install nom_du_module
a2enmod nom_du_module
systemctl restart apache2
# [Remove]
a2dismod nom_du_module
apt remove --purge nom_du_module
systemctl restart apache2
Paquets PHP utiles
| Paquet | Description | Utilisation typique | Nécessaire pour |
|---|---|---|---|
libapache2-mod-php |
Module Apache qui intègre directement PHP dans Apache. | Exécution de scripts PHP sans passerelle externe. | Sites simples sans PHP-FPM |
php-mysql |
Extension PHP pour se connecter à des bases de données MySQL/MariaDB. | Accès aux BDD via PDO ou mysqli. | CMS, ERP, CRM avec base MySQL |
php-xml |
Extension pour le traitement XML (DOM, SimpleXML, etc.). | Lecture et génération de fichiers XML, SOAP, etc. | APIs, formats e-facture, flux RSS |
php-mbstring |
Support des chaînes multi-octets (UTF-8, etc.). | Traitement de texte multilingue. | Applications avec accents, caractères spéciaux |
php-curl |
Extension pour faire des requêtes HTTP via CURL (API REST, etc.). | Connexion à des services distants. | API, paiement en ligne, webhooks |
libapache2-mod-fcgid |
Module Apache pour exécuter des scripts via FastCGI classique (ex. php-cgi). |
Compatibilité avec des montages FastCGI historiques. | Besoins legacy, CGI/FastCGI spécifiques |
mod_php vs mod_fcgid
| libapache2-mod-php | libapache2-mod-fcgid | |
|---|---|---|
| Nom complet | Module PHP intégré à Apache (mod_php) | Module FastCGI pour Apache (mod_fcgid) |
| Fonctionnement | PHP est chargé directement dans Apache | Apache lance ou contacte un exécutable FastCGI externe, souvent php-cgi |
| Architecture | Monolithique (Apache + PHP = même processus) | Séparée (Apache ↔ processus FastCGI) |
| Gestion des processus | Pas d'isolation par site ou utilisateur | Processus FastCGI séparés, mais sans la souplesse native des pools PHP-FPM |
| Multi-version PHP | Non (une seule version active à la fois) | Possible, mais plus lourd à maintenir que proxy_fcgi + PHP-FPM |
| Performance | Moins bon sous forte charge (Apache + PHP partagent les ressources) | Correcte, mais généralement moins souple que PHP-FPM moderne |
| Sécurité | Moins isolé (Apache exécute PHP avec ses propres droits) | Meilleure séparation que mod_php, variable selon le montage FastCGI |
| Compatibilité | Très simple à mettre en place (prêt à l'emploi pour des scripts PHP simples) | Utile surtout pour des montages historiques ou spécifiques |
| Cas d'usage recommandé | Développement local, projets simples, serveurs mono-site | Legacy, mutualisé ancien, compatibilité spécifique |
Masquer les informations dans les en-têtes HTTP d'Apache
nano /etc/apache2/conf-available/security.conf
ServerTokens Prod # Masquer la version d'Apache
ServerSignature Off # Supprimer les informations de signature d'Apache
Header unset X-Powered-By # Supprimer l'en-tête 'X-Powered-By' pour PHP (et autres langages si nécessaire)
Configurer son nom de domaine : nomdedomaine.fr
mkdir -p /var/www/nomdedomaine.fr/httpdoc # crée le dossier du site (et les dossiers parents si besoin)
chown -R www-data:www-data /var/www/nomdedomaine.fr # donne les droits à Apache/Nginx (www-data)
chmod -R 755 /var/www/nomdedomaine.fr # rend le dossier accessible (lecture/exécution) au serveur
apt install php8.4-{mbstring,xml,curl,mysql,zip,gd,cli,fpm,opcache,intl,bcmath} -y
a2dismod php8.3 fcgid
a2enconf php8.4-fpm # Active la configuration FPM pour PHP 8.4
a2enmod proxy_fcgi setenvif
systemctl reload apache2
Le VirtualHost doit pointer vers le socket PHP-FPM approprié :
nano /etc/apache2/sites-available/nomdedomaine.fr.conf
<VirtualHost *:80>
ServerAdmin webmaster@nomdedomaine.fr
ServerName nomdedomaine.fr
ServerAlias www.nomdedomaine.fr
DocumentRoot /var/www/nomdedomaine.fr
#DocumentRoot /var/www/nomdedomaine.fr/httpdoc
<Directory /var/www/nomdedomaine.fr>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nomdedomaine.fr-error.log
CustomLog ${APACHE_LOG_DIR}/nomdedomaine.fr-access.log combined
# Pass PHP scripts to FastCGI process manager
<FilesMatch \.php$>
# SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
# SetHandler application/x-httpd-php
# SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/"
SetHandler "proxy:unix:/run/php/php8.4-fpm.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
a2ensite nomdedomaine.fr
systemctl restart apache2
# Autres utiles
a2dissite nomdedomaine.fr.conf
Le fichier hosts
Le fichier hosts est un fichier système qui permet d'associer localement un nom de domaine à une adresse IP, sans recourir à un serveur DNS.
Cas d'usage
- Travailler localement sur un site avec un nom de domaine fictif (
admin.dev,monsite.test, etc.) - Rediriger un domaine vers une IP précise dans le cadre de tests
- Forcer un domaine à pointer vers une version particulière d'un serveur, notamment pour le débogage DNS
Exemple d'entrée
192.168.1.100 monsite.local www.monsite.local
Emplacements du fichier hosts
- Linux / macOS :
/etc/hosts - Windows :
C:\Windows\System32\drivers\etc\hosts
Autres exemples de configuration
ton.ip mon.domaine www.mon.domaine
NameVirtualHost ip.du.pc
Accès dans le navigateur
Une fois la configuration en place, il suffit d'accéder au site via : http://monsite.local
Supprimer Apache & PHP
Cette opération supprime l'ensemble des configurations Apache existantes.
# Arrête le service Apache pour éviter les erreurs pendant la suppression
systemctl stop apache2
# Supprime complètement Apache et ses composants principaux
apt-get purge apache2 apache2-utils apache2-bin apache2.2-common -y
# - apache2 : le paquet principal
# - apache2-utils : outils comme ab (Apache Benchmark)
# - apache2-bin : les exécutables Apache
# - apache2.2-common : présent seulement sur d'anciennes versions d'Apache/Debian
# Supprime PHP et les modules associés côté Apache
apt remove --purge php libapache2-mod-php php-mysql php-xml php-mbstring php-curl -y
# Cela supprime PHP, ses extensions MySQL, XML, CURL, MBString, et l'intégration Apache (mod_php)
# Supprime les dossiers de configuration Apache
rm -rf /etc/apache2
# Contient tous les VirtualHosts, mods-enabled, conf-enabled…
# Supprime le dossier racine du site par défaut
rm -rf /var/www/html
# Le site de test affiché par défaut (page "It works!")
# Supprime les logs Apache
rm -rf /var/log/apache2
# Accès et erreurs, logs par VirtualHost
# Nettoyage des dépendances orphelines
apt-get autoremove -y
# Supprime tous les paquets installés automatiquement devenus inutiles après les purges
Certificats SSL sur 000-default.conf
a2enmod ssl
a2enmod rewrite
# Activer le site SSL par défaut
a2ensite default-ssl
certbot --apache -d nomduserveur.eu
nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Rediriger tout le trafic HTTP vers HTTPS
RewriteEngine on
RewriteCond %{SERVER_NAME} =nomduserveur.eu
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
nano /etc/apache2/sites-available/default-ssl.conf
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName nomduserveur.eu
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/nomduserveur.eu/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nomduserveur.eu/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Choisir ses modules selon le besoin
| Configuration | Modules recommandés | Explication |
|---|---|---|
| Affichage d'une simple page HTML | mime, dir, alias |
Le strict minimum pour afficher une page HTML statique avec un fichier d'accueil (index.html). |
| Configuration rapide (performance) | mime, dir, deflate, headers, env, alias |
Optimisé pour charger les pages plus vite grâce à la compression (deflate) et aux bons en-têtes HTTP. |
| Configuration sécurisée | mime, dir, rewrite, headers, ssl, setenvif, reqtimeout |
Prend en compte la sécurité (HTTPS, protections via en-têtes, limite des requêtes lentes…). |
| Site PHP avec PHP-FPM (moderne) | proxy, proxy_fcgi, setenvif, mime, dir, rewrite |
Recommandé pour faire tourner un site PHP avec performance et isolation grâce à PHP-FPM. |
| Surveillance du serveur | status, alias |
Active une page interne /server-status pour surveiller les connexions, la charge, etc. (à restreindre par IP). |
Liste des modules Apache (détaillée)
Ce tableau présente des modules Apache courants, leur état d'activation typique, leur fonction principale, leur type et leur niveau d'importance dans un environnement web standard.
| Module | État | Utilité | Type | Critique ? | Remarques |
|---|---|---|---|---|---|
| mod_php | Désactivé | Exécution directe de PHP dans Apache | Exécution | Non | Remplacé par proxy_fcgi + PHP-FPM pour de meilleures performances |
| proxy_fcgi | Activé | Proxy des requêtes FastCGI vers PHP-FPM | Proxy | Oui | Utilisé avec PHP-FPM. Préféré en production |
| setenvif | Activé | Variables d'environnement selon les entêtes | Configuration | Oui | Nécessaire pour certains handlers PHP et le module proxy_fcgi |
| rewrite | Activé | Réécriture d'URL | Fonctionnel | Oui | Requis pour de nombreux CMS (WordPress, Drupal…) |
| ssl | Désactivé | Support HTTPS / TLS | Sécurité | Oui si HTTPS | À activer pour les certificats SSL / Let's Encrypt |
| status | Activé | Statistiques serveur Apache | Diagnostic | Non | Utile pour le monitoring via /server-status |
| headers | Désactivé | Manipulation des entêtes HTTP | Fonctionnel | Oui dans certains cas | Utile pour les politiques de sécurité (CSP, HSTS…) |
| deflate | Activé | Compression gzip | Performance | Non | Améliore les temps de chargement |
| mime | Activé | Types MIME par extension | Base | Oui | Indispensable pour servir les bons en-têtes Content-Type |
| dir | Activé | Index par défaut (index.html, index.php) | Base | Oui | Permet la navigation correcte dans les dossiers |
Modules expliqués en langage courant
| Module | État | Utilité (explication simple) |
|---|---|---|
| access_compat | Activé | Permet à Apache d'interpréter les anciennes méthodes de restriction d'accès aux fichiers ou aux dossiers. |
| actions | Désactivé | Permet de définir une action à exécuter lorsqu'un utilisateur accède à un fichier donné. |
| alias | Activé | Crée des raccourcis entre une adresse web et un dossier du serveur. |
| allowmethods | Désactivé | Limite les types de requêtes qu'un visiteur peut envoyer, par exemple pour interdire les POST. |
| asis | Désactivé | Affiche le contenu tel quel, sans modification par Apache. |
| auth_basic | Activé | Ajoute une protection par mot de passe simple, généralement via une fenêtre de connexion. |
| auth_digest | Désactivé | Version plus sécurisée de la protection par mot de passe. |
| auth_form | Désactivé | Permet de protéger une page à l'aide d'un formulaire de connexion personnalisé. |
| authn_anon | Désactivé | Permet un accès sans identifiant, en mode anonyme. |
| authn_core | Activé | Module de base qui gère les vérifications d'identité. |
| authn_file | Activé | Utilise un fichier texte pour déterminer quels utilisateurs sont autorisés à accéder aux ressources. |
| authz_core | Activé | Permet de définir quels utilisateurs ou groupes peuvent consulter ou utiliser certaines parties du site. |
| authz_host | Activé | Contrôle l'accès selon l'adresse IP ou le nom de l'ordinateur du visiteur. |
| authz_user | Activé | Permet de donner des accès selon le nom d'utilisateur. |
| autoindex | Activé | Affiche automatiquement la liste des fichiers d'un dossier si aucun fichier d'accueil n'est présent. |
| brotli | Désactivé | Compresse les pages web avant leur envoi afin d'accélérer le chargement. |
| cache | Désactivé | Permet à Apache de mettre en cache certaines réponses afin d'améliorer les performances. |
| cgi | Désactivé | Permet d'exécuter des scripts CGI plus anciens, par exemple en Perl. |
| deflate | Activé | Compresse les fichiers envoyés aux visiteurs pour accélérer le chargement. |
| dir | Activé | Choisit automatiquement un fichier d'accueil comme index.html ou index.php. |
| env | Activé | Crée et utilise des variables d'environnement pour adapter le comportement du site selon le contexte. |
| fcgid | Activé | Permet à Apache de communiquer avec PHP, ou d'autres exécutables, via FastCGI. |
| filter | Activé | Filtre ou modifie le contenu des pages avant qu'elles ne soient envoyées. |
| mime | Activé | Indique à Apache quel type de fichier est servi (image, texte, etc.). |
| php8.2 | Activé | Permet à Apache d'exécuter les scripts PHP en version 8.2. |
| proxy | Activé | Permet à Apache de relayer des requêtes vers d'autres serveurs, notamment PHP-FPM. |
| proxy_fcgi | Activé | Spécialisé dans la redirection de requêtes vers PHP-FPM (via FastCGI). |
| reqtimeout | Activé | Évite qu'un client trop lent monopolise inutilement les ressources du serveur. |
| rewrite | Activé | Réécrit les URL afin de produire des adresses plus lisibles, particulièrement utiles pour les sites dynamiques. |
| setenvif | Activé | Adapte le comportement du site selon certains critères, comme le navigateur ou l'adresse IP. |
| socache_shmcb | Activé | Stocke temporairement certaines informations afin d'éviter des calculs répétés, par exemple pour les certificats SSL. |
| status | Activé | Fournit des informations techniques sur Apache, comme les connexions en cours ou la charge. |