Lorsque l'on développe plusieurs applications PHP sur une machine Debian, utiliser uniquement http://localhost devient rapidement peu pratique.
Les VirtualHosts d'Apache permettent d'associer un nom de domaine local à chaque projet. Par exemple :
http://mon-projet.localhttp://blog.localhttp://app.local
Chaque nom peut ainsi pointer vers un répertoire différent.
Dans cet article, nous allons voir comment configurer un VirtualHost Apache sur Debian 13 (Trixie) pour un projet PHP local.
L'exemple utilisera :
- Debian 13 ;
- Apache 2.4 ;
- PHP 8.4 ;
- un projet situé dans
/var/www/mon-projet; - le nom de domaine local
mon-projet.local.
Remarque : cette configuration est destinée au développement local. Elle n'est pas une configuration de production.
1. Installer Apache et PHP
Si Apache et PHP ne sont pas encore installés, commencez par mettre à jour la liste des paquets :
sudo apt update |
sudo apt upgrade |
Installez ensuite Apache et PHP :
sudo apt install apache2 php libapache2-mod-php |
Debian 13 fournit actuellement PHP 8.4 comme version par défaut. Le paquet php est un paquet de dépendance qui pointe vers la version PHP stable fournie par Debian.
Vous pouvez vérifier les versions installées avec :
apache2 -v |
php -v |
Vous devriez obtenir quelque chose correspondant à :
Server version: Apache/2.4.68 |
et :
PHP 8.4.x |
Les numéros de révision exacts peuvent naturellement évoluer avec les mises à jour de sécurité de Debian.
Vérifiez également que le service Apache fonctionne :
sudo systemctl status apache2 |
Si nécessaire :
sudo systemctl enable --now apache2 |
2. Créer le répertoire du projet
Nous allons placer notre projet dans :
/var/www/mon-projet |
Créez le répertoire :
sudo mkdir -p /var/www/mon-projet |
Pour tester rapidement la configuration, créez un fichier PHP :
sudo nano /var/www/mon-projet/index.php |
Ajoutez :
<?php |
|
echo '<h1>Mon projet fonctionne !</h1>'; |
echo '<p>PHP fonctionne avec Apache.</p>'; |
Enregistrez le fichier.
2.1. À propos des permissions
Apache fonctionne normalement avec l'utilisateur système www-data.
Il n'est cependant pas nécessaire de donner systématiquement la propriété complète du projet à www-data.
Pour un environnement de développement, il est souvent préférable que votre utilisateur Linux reste propriétaire des fichiers du projet et de n'accorder à Apache que les droits dont l'application a réellement besoin.
Pour un simple test, vous pouvez par exemple utiliser :
sudo chown -R $USER:$USER /var/www/mon-projet |
Les applications nécessitant des répertoires accessibles en écriture, comme Symfony ou Laravel, devront ensuite avoir des permissions adaptées sur leurs répertoires de cache, de logs ou de fichiers uploadés.
3. Créer le VirtualHost Apache
Les configurations des sites Apache sont stockées dans :
/etc/apache2/sites-available/ |
Créez le fichier :
sudo nano /etc/apache2/sites-available/mon-projet.conf |
Ajoutez la configuration suivante :
<VirtualHost *:80> |
ServerName mon-projet.local |
DocumentRoot /var/www/mon-projet |
|
<Directory /var/www/mon-projet> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
|
ErrorLog ${APACHE_LOG_DIR}/mon-projet-error.log |
CustomLog ${APACHE_LOG_DIR}/mon-projet-access.log combined |
</VirtualHost> |
3.1. Explications
VirtualHost *:80
<VirtualHost *:80> |
Apache écoute ici sur le port HTTP 80, quelle que soit l'adresse IP utilisée par la machine.
Les VirtualHosts basés sur le nom permettent à plusieurs sites de partager la même adresse IP et le même port. Apache sélectionne ensuite le VirtualHost correspondant au ServerName ou au ServerAlias transmis dans la requête HTTP.
ServerName
ServerName mon-projet.local |
C'est le nom que nous utiliserons dans le navigateur :
http://mon-projet.local |
Il est recommandé de définir explicitement un ServerName pour chaque VirtualHost.
DocumentRoot
DocumentRoot /var/www/mon-projet |
Cette directive indique à Apache où se trouvent les fichiers du site.
<Directory>
<Directory /var/www/mon-projet> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
Require all granted autorise Apache à servir le contenu de ce répertoire.
AllowOverride All permet notamment à un fichier .htaccess de modifier certaines règles Apache.
Si votre application n'utilise pas .htaccess, vous pouvez utiliser :
AllowOverride None |
Ce choix est généralement préférable lorsque l'application n'en a pas besoin, car la configuration Apache est alors centralisée.
Les journaux
ErrorLog ${APACHE_LOG_DIR}/mon-projet-error.log |
CustomLog ${APACHE_LOG_DIR}/mon-projet-access.log combined |
Les erreurs seront enregistrées dans :
/var/log/apache2/mon-projet-error.log |
et les accès dans :
/var/log/apache2/mon-projet-access.log |
4. Ajouter le domaine dans /etc/hosts
Notre domaine mon-projet.local n'existe pas sur Internet.
Il faut donc indiquer à notre machine que ce nom doit correspondre à 127.0.0.1.
Modifiez le fichier /etc/hosts :
sudo nano /etc/hosts |
Ajoutez :
127.0.0.1 mon-projet.local |
Vous pouvez également utiliser :
127.0.0.1 mon-projet.local www.mon-projet.local |
si vous souhaitez utiliser les deux noms.
Le fichier /etc/hosts permet ainsi de simuler localement une résolution DNS. Apache ne crée pas lui-même les entrées DNS correspondant aux VirtualHosts.
Si vous utilisez un autre ordinateur pour accéder au serveur Debian, cette modification doit être effectuée sur la machine cliente, ou remplacée par une véritable configuration DNS.
5. Activer le VirtualHost
Le fichier que nous venons de créer se trouve dans :
/etc/apache2/sites-available/ |
Cela signifie qu'il est disponible mais pas encore activé.
Activez-le avec :
sudo a2ensite mon-projet.conf |
Vous pouvez éventuellement désactiver le VirtualHost par défaut d'Apache :
sudo a2dissite 000-default.conf |
Ce n'est toutefois pas obligatoire pour faire fonctionner notre nouveau VirtualHost.
6. Vérifier la configuration Apache
Avant de recharger Apache, vérifiez toujours sa configuration :
sudo apachectl configtest |
Si tout est correct, vous devez obtenir :
Syntax OK |
C'est une étape importante : elle permet d'éviter de recharger une configuration contenant une erreur de syntaxe.
Vous pouvez ensuite recharger Apache :
sudo systemctl reload apache2 |
Un reload suffit ici : il permet à Apache de prendre en compte la nouvelle configuration sans arrêter complètement le service.
7. Vérifier les VirtualHosts actifs
Apache fournit une commande très pratique pour examiner les VirtualHosts configurés :
sudo apachectl -S |
Vous devriez notamment retrouver une ligne correspondant à :
*:80 mon-projet.local |
Cette commande est particulièrement utile lorsqu'une machine héberge plusieurs projets et que l'on cherche à comprendre quel VirtualHost Apache utilise. La documentation Apache recommande justement apachectl -S pour diagnostiquer la configuration des VirtualHosts.
8. Tester le site
Vous pouvez maintenant ouvrir votre navigateur et saisir :
http://mon-projet.local |
Vous devriez voir :
Mon projet fonctionne ! |
PHP fonctionne avec Apache. |
Si vous préférez effectuer le test depuis le terminal :
curl http://mon-projet.local |
Vous devriez obtenir le contenu HTML généré par PHP.
Vous pouvez également vérifier directement que PHP est exécuté par Apache en créant temporairement :
sudo nano /var/www/mon-projet/info.php |
avec :
<?php |
|
phpinfo(); |
Puis ouvrez :
http://mon-projet.local/info.php |
Vous devriez obtenir la page d'informations PHP.
Supprimez ensuite ce fichier, car phpinfo() expose beaucoup d'informations sur l'environnement PHP :
sudo rm /var/www/mon-projet/info.php |
9. Activer mod_rewrite si nécessaire
De nombreuses applications PHP modernes utilisent le module rewrite d'Apache.
Vous pouvez l'activer avec :
sudo a2enmod rewrite |
Puis vérifier la configuration :
sudo apachectl configtest |
et recharger Apache :
sudo systemctl reload apache2 |
Avec :
AllowOverride All |
dans le VirtualHost, une application utilisant un fichier .htaccess pourra notamment définir ses propres règles de réécriture.
10. Ajouter plusieurs projets
L'intérêt des VirtualHosts apparaît surtout lorsque plusieurs projets sont installés sur la même machine.
Par exemple :
/var/www/site1 |
/var/www/site2 |
/var/www/site3 |
Vous pouvez créer :
/etc/apache2/sites-available/site1.conf |
/etc/apache2/sites-available/site2.conf |
/etc/apache2/sites-available/site3.conf |
site1.conf
<VirtualHost *:80> |
ServerName site1.local |
DocumentRoot /var/www/site1 |
|
<Directory /var/www/site1> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
|
ErrorLog ${APACHE_LOG_DIR}/site1-error.log |
CustomLog ${APACHE_LOG_DIR}/site1-access.log combined |
</VirtualHost> |
site2.conf
<VirtualHost *:80> |
ServerName site2.local |
DocumentRoot /var/www/site2 |
|
<Directory /var/www/site2> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
|
ErrorLog ${APACHE_LOG_DIR}/site2-error.log |
CustomLog ${APACHE_LOG_DIR}/site2-access.log combined |
</VirtualHost> |
Puis ajoutez les noms dans /etc/hosts :
127.0.0.1 site1.local |
127.0.0.1 site2.local |
Activez les deux sites :
sudo a2ensite site1.conf |
sudo a2ensite site2.conf |
Vérifiez la configuration :
sudo apachectl configtest |
Puis rechargez Apache :
sudo systemctl reload apache2 |
Vous pouvez alors accéder aux deux applications avec :
http://site1.local |
http://site2.local |
11. Utiliser ServerAlias
Si une application doit être accessible avec plusieurs noms, utilisez ServerAlias.
Par exemple :
<VirtualHost *:80> |
ServerName mon-projet.local |
ServerAlias www.mon-projet.local |
|
DocumentRoot /var/www/mon-projet |
|
<Directory /var/www/mon-projet> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
|
ErrorLog ${APACHE_LOG_DIR}/mon-projet-error.log |
CustomLog ${APACHE_LOG_DIR}/mon-projet-access.log combined |
</VirtualHost> |
Vous pourrez alors utiliser :
http://mon-projet.local |
ou :
http://www.mon-projet.local |
Ajoutez également les deux noms dans /etc/hosts :
127.0.0.1 mon-projet.local www.mon-projet.local |
Apache utilise ServerName et ServerAlias pour déterminer quel VirtualHost doit répondre à une requête donnée.
12. Faut-il utiliser NameVirtualHost ?
Avec les anciennes versions d'Apache, on pouvait rencontrer une directive de ce type :
NameVirtualHost *:80 |
Elle n'est pas nécessaire avec Apache 2.4.
Une configuration moderne sous Debian 13 se contente de :
<VirtualHost *:80> |
ServerName mon-projet.local |
... |
</VirtualHost> |
Apache 2.4 gère nativement les VirtualHosts basés sur le nom.
Il est donc inutile d'ajouter NameVirtualHost *:80 à une nouvelle configuration.
13. Structure finale
À ce stade, notre installation ressemble à ceci :
/var/www/ |
└── mon-projet/ |
└── index.php |
|
/etc/apache2/ |
├── sites-available/ |
│ └── mon-projet.conf |
└── sites-enabled/ |
└── mon-projet.conf -> ../sites-available/mon-projet.conf |
Et /etc/hosts contient :
127.0.0.1 mon-projet.local |
Le VirtualHost contient :
<VirtualHost *:80> |
ServerName mon-projet.local |
DocumentRoot /var/www/mon-projet |
|
<Directory /var/www/mon-projet> |
Options FollowSymLinks |
AllowOverride All |
Require all granted |
</Directory> |
|
ErrorLog ${APACHE_LOG_DIR}/mon-projet-error.log |
CustomLog ${APACHE_LOG_DIR}/mon-projet-access.log combined |
</VirtualHost> |
Conclusion
La création d'un VirtualHost Apache pour un projet PHP sous Debian 13 reste relativement simple.
Les commandes essentielles sont :
sudo apt update |
sudo apt install apache2 php libapache2-mod-php |
Puis :
sudo mkdir -p /var/www/mon-projet |
sudo nano /etc/apache2/sites-available/mon-projet.conf |
Ajouter le domaine dans :
sudo nano /etc/hosts |
Puis activer et vérifier le site :
sudo a2ensite mon-projet.conf |
sudo apachectl configtest |
sudo systemctl reload apache2 |
Enfin :
sudo apachectl -S |
permet de vérifier les VirtualHosts réellement pris en compte par Apache.
Vous pouvez ensuite accéder à votre projet avec :
http://mon-projet.local |
Cette méthode permet de reproduire localement une organisation proche d'un serveur web réel, tout en pouvant héberger plusieurs projets PHP indépendants sur une seule machine Debian 13.
Commentaires
Aucun commentaire approuvé pour le moment.
Connectez-vous avec un compte commentateur pour publier un commentaire. Se connecter.