Guide révisé pour Debian 13. Stack native APT, sans XAMPP et sans dépôt tiers pour PHP 8.4.
Versions cibles (dépôts officiels Debian 13) :
| Composant | Version approximative |
|---|---|
| Apache | 2.4.x |
| PHP | 8.4.x |
| MariaDB | 11.8.x |
| phpMyAdmin | 5.2.x |
1. Introduction
1.1. Objectif
Mettre en place une plateforme de développement locale avec :
- Apache2
- PHP 8.4
- MariaDB
- phpMyAdmin
Chaque composant est installé puis vérifié avant de passer au suivant.
1.2. Pourquoi éviter XAMPP
XAMPP est pratique pour démarrer, mais peu flexible sous Linux : changer de version PHP, brancher les services sur systemd, ou coller à la façon Debian de gérer les paquets devient vite pénible.
Sous Debian 13, PHP 8.4, MariaDB 11.8 et Apache sont déjà dans les dépôts officiels. Pas besoin du dépôt Sury pour cette stack.
2. Préparation de l'environnement
2.1. Vérifier la version de Debian
cat /etc/os-release |
Vous devez voir VERSION_CODENAME=trixie (Debian 13).
2.2. Mise à jour des paquets
sudo apt update && sudo apt upgrade -y |
3. Installation des services principaux
3.1. Apache
Apache sert vos pages HTTP sur le port 80 par défaut.
Installer d’abord le paquet, sinon systemctl renvoie Unit apache2.service does not exist :
sudo apt install apache2 -y |
sudo systemctl enable --now apache2 |
sudo systemctl status apache2 --no-pager |
Le statut doit indiquer active (running).
Vérification navigateur (port 80 par défaut) : http://localhost/
Si la page Apache n’apparaît pas :
sudo systemctl start apache2 |
sudo systemctl status apache2 --no-pager |
Commandes utiles :
sudo systemctl stop apache2 |
sudo systemctl restart apache2 |
sudo systemctl reload apache2 |
3.1.1. Changer le port HTTP vers 90 (optionnel)
Un nombre incalculable d'application utilise le port 80, ce qui peut donner des situations particulières. En effet, si votre serveur appache s'ouvre après une application qui l'utilise déjà, vous êtes bloqué.
Sous Debian, le port se configure à deux endroits : l’écoute globale (ports.conf) et chaque Virtual Host. Ne changez pas seulement l’un des deux.
A. Écoute globale :
sudo nano /etc/apache2/ports.conf |
Remplacez :
Listen 80 |
par :
Listen 90 |
Laissez Listen 443 tel quel si la section SSL est présente (inutile pour ce guide local HTTP).
B. Virtual Host par défaut :
sudo nano /etc/apache2/sites-available/000-default.conf |
Remplacez :
<VirtualHost *:80> |
par :
<VirtualHost *:90> |
C. Tester la conf, puis recharger :
sudo apache2ctl configtest |
sudo systemctl reload apache2 |
configtest doit afficher Syntax OK.
D. Vérifier que le port 90 écoute :
ss -tlnp | grep ':90' |
- Accès navigateur : http://localhost:90/
Utilisez bien
http://, pashttps://.
Apache écoute du HTTP plain sur le port 90. Si le navigateur force le HTTPS (mode HTTPS-Only de Firefox, HSTS, etc.), vous aurezSSL_ERROR_RX_RECORD_TOO_LONG. Dans ce cas : tapez explicitementhttp://localhost:90/ou désactivez temporairement le HTTPS-Only pour localhost.
À partir d’ici, toutes les URLs locales utilisent le port 90
(http://localhost:90/,http://localhost:90/info.php,http://localhost:90/phpmyadmin).
Si vous créez d’autres vhosts plus tard, mettez aussi <VirtualHost *:90> (ou le port choisi) dans chaque fichier de site.
3.2. MariaDB
MariaDB remplace MySQL dans les dépôts Debian. L’API reste compatible pour la plupart des projets PHP.
sudo apt install mariadb-server -y |
sudo systemctl enable --now mariadb |
sudo systemctl status mariadb --no-pager |
Sécuriser l’installation :
Sous Debian, MariaDB est déjà sécurisé par défaut. Le script affiche d’ailleurs :
MariaDB is secure by default in Debian. Running this script is useless at best...
On le lance quand même pour choisir clairement le mode d’auth de root :
sudo mariadb-secure-installation |
Deux possibilités existent. Choisissez-en une, notez-la, puis suivez les mentions si option A / si option B dans la suite du guide.
| Option A — simple | Option B — plus sûre | |
|---|---|---|
Auth de root |
Mot de passe SQL | unix_socket |
| Compte pour phpMyAdmin / apps | root + mdp (pas de user dev) |
dev + mdp (créé juste après le script) |
| Admin terminal | mariadb -u root -p |
sudo mariadb |
Créer un user dev ? |
Non | Oui (obligatoire) |
Warning — option A.
Se connecter à phpMyAdmin (et éventuellement aux apps) enrootest le chemin le plus simple.
C'est aussi le moins propre / le moins sûr : un mdp root fuité = toutes les bases.
OK pour un PC perso en local.
L'option B existe précisément pour ceux qui préfèrent ne jamais exposerrootau web.
Option A — root + mot de passe (simple)
Réponses dans mariadb-secure-installation :
| Question | Réponse |
|---|---|
| Current password for root | Entrée (vide) |
| Switch to unix_socket authentication | n |
| Change the root password? | Y → choisissez un mot de passe et notez-le |
| Remove anonymous users? | Y |
| Disallow root login remotely? | Y |
| Remove test database? | Y |
| Reload privilege tables? | Y |
Vérifier :
mariadb -u root -p |
Si option A pour tout le reste du tuto : utilisez uniquement root + ce mot de passe (phpMyAdmin, exemples PDO, etc.).
Ne créez pas d'utilisateur dev.
Option B — unix_socket + utilisateur dev (plus sûre)
Réponses dans mariadb-secure-installation :
| Question | Réponse |
|---|---|
| Current password for root | Entrée (vide) |
| Switch to unix_socket authentication | Y |
| Change the root password? | n |
| Remove anonymous users? | Y |
| Disallow root login remotely? | Y |
| Remove test database? | Y |
| Reload privilege tables? | Y |
Admin terminal (pas de mdp SQL pour root) :
sudo mariadb |
Pourquoi un user dev en option B ?
phpMyAdmin peut se connecter en root quand root a un mot de passe SQL — c'est l'option A.
En option B, root est en unix_socket : MariaDB n'accepte root que si le processus Linux est déjà root (sudo mariadb). Apache / phpMyAdmin tournent en www-data, donc un login web root échoue. Il faut un user SQL avec mot de passe (dev).
Créez immédiatement dev (compte web / apps pour toute la suite du tuto si option B) :
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'change_me_strong_password'; |
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'localhost' WITH GRANT OPTION; |
FLUSH PRIVILEGES; |
EXIT; |
Remplacez change_me_strong_password par un vrai mot de passe et notez-le.
Vérifier :
mariadb -u dev -p |
Si option B pour tout le reste du tuto : phpMyAdmin, PDO, etc. → dev + ce mot de passe. Jamais root depuis le web.
Variante plus stricte (une seule base) :
CREATE DATABASE mon_projet; |
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'change_me_strong_password'; |
GRANT ALL PRIVILEGES ON mon_projet.* TO 'dev'@'localhost'; |
FLUSH PRIVILEGES; |
EXIT; |
Détail des questions du script (commun aux deux)
Enter current password for root
Mot de passe root actuel pour autoriser le script. Sous install fraîche Debian : souvent vide → Entrée.
Switch to unix_socket authentication
- n → option A (mdp SQL).
- Y → option B (socket Linux /
sudo).
Change the root password?
- Option A : Y + définir le mdp.
- Option B : n (inutile au quotidien avec le socket).
Remove anonymous users? → Y (comptes sans user inutiles, quel que soit le mode)
Disallow root login remotely? → Y (root local uniquement ; « disallow » = interdire le distant)
Remove test database? → Y
Reload privilege tables? → Y
Sur la machine où ce guide a été suivi en live : option A (
rootsimple, pas dedev). L'option B reste documentée pour ceux qui la choisissent.
3.3. PHP 8.4
Sous Debian 13, PHP 8.4 est disponible nativement. Aucun dépôt Sury n’est requis.
sudo apt install \ |
php8.4 \ |
php8.4-cli \ |
libapache2-mod-php8.4 \ |
php8.4-mysql \ |
php8.4-xml \ |
php8.4-mbstring \ |
php8.4-curl \ |
php8.4-zip \ |
php8.4-sqlite3 \ |
php8.4-gd \ |
php8.4-intl \ |
-y |
Recharger Apache pour prendre en charge le module PHP :
sudo systemctl restart apache2 |
Vérifier la CLI :
php -v |
Vous devez voir une ligne du type PHP 8.4.x.
Créer un fichier de test :
echo '<?php phpinfo();' | sudo tee /var/www/html/info.php |
Ouvrir http://localhost:90/info.php, vérifier PHP 8.4, puis supprimer le fichier :
sudo rm /var/www/html/info.php |
Ne laissez pas
info.phpen place hors environnement de confiance : il expose la configuration du serveur.
3.4. phpMyAdmin
Ordre obligatoire : installer le paquet (§3.4.1) → vérifier que les fichiers existent → seulement ensuite activer Apache (§3.4.2).
Sans le paquet, /etc/phpmyadmin/apache.conf n’existe pas : un ln crée un lien cassé et a2enconf échoue avec Conf phpmyadmin does not exist!.
3.4.1. Installation
sudo apt update |
sudo apt install phpmyadmin -y |
Pendant l’installation (écrans debconf) :
- Choisir le serveur web : apache2 (Espace pour cocher, Tab, Entrée).
- Faut-il configurer la base de données de phpmyadmin avec dbconfig-common ? → Oui.
MariaDB est déjà installée ;dbconfig-commoncrée pour vous la base et l’utilisateur internes dont phpMyAdmin a besoin.
Répondez Non seulement si vous voulez tout faire à la main (inutile pour un env de dev simple). - Définir un mot de passe pour l’utilisateur MySQL/MariaDB
phpmyadmin(notez-le ; ce n’est pas le même compte querootoudevpour vous connecter à l’interface web).
Point de contrôle — ne passez à 3.4.2 que si ceci est OK :
dpkg -l phpmyadmin | grep '^ii' |
ls -la /etc/phpmyadmin/apache.conf |
- la 1ʳᵉ commande doit montrer
ii phpmyadmin - la 2ᵉ doit lister le fichier (pas « Aucun fichier »)
Si phpmyadmin n’est pas ii, arrêtez-vous : réinstallez (sudo apt install phpmyadmin -y) avant toute conf Apache.
3.4.2. Activer la configuration Apache
À faire uniquement après le point de contrôle §3.4.1.
Le paquet fournit /etc/phpmyadmin/apache.conf. Apache doit la charger via conf-available → a2enconf.
Souvent l’installeur a déjà créé le lien. Vérifiez :
ls -la /etc/apache2/conf-available/phpmyadmin.conf |
- Si le fichier/lien existe et pointe vers
/etc/phpmyadmin/apache.conf→ activez et rechargez seulement :
sudo a2enconf phpmyadmin |
sudo systemctl reload apache2 |
- Sinon, créez le lien (avec sauvegarde si un fichier occupe déjà le nom) :
# Abort if the package config is missing (do not create a broken symlink) |
test -f /etc/phpmyadmin/apache.conf || { |
echo "ERROR: /etc/phpmyadmin/apache.conf missing — finish §3.4.1 first" |
exit 1 |
} |
|
# Keep a copy if a file already occupies that name |
if [ -e /etc/apache2/conf-available/phpmyadmin.conf ]; then |
sudo cp -a /etc/apache2/conf-available/phpmyadmin.conf \ |
/etc/apache2/conf-available/phpmyadmin.conf.bak |
fi |
|
sudo ln -sf /etc/phpmyadmin/apache.conf \ |
/etc/apache2/conf-available/phpmyadmin.conf |
|
sudo a2enconf phpmyadmin |
sudo systemctl reload apache2 |
test -f: bloque si le paquet n’est pas là (évite le symlink cassé).cp -a: vraie sauvegarde avant remplacement.ln -sf: lien vers la conf du paquet.
3.4.3. Accès
URL : http://localhost:90/phpmyadmin
- Si option A : login
root+ mot de passe demariadb-secure-installation. Pas dedev. - Si option B : login
dev+ mot de passe créé en §3.2.
Un login webrootéchoue ici à cause deunix_socket(en option A,root+ mdp fonctionne).
3.4.4. User dev — rappel / réparation (option B uniquement)
Si option A : ignorez cette section. Vous restez sur root.
Si option B : dev a déjà été créé en §3.2. Ici seulement en cas d'oubli ou de reset.
sudo mariadb |
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'change_me_strong_password'; |
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'localhost' WITH GRANT OPTION; |
FLUSH PRIVILEGES; |
EXIT; |
Changer le mot de passe de dev :
ALTER USER 'dev'@'localhost' IDENTIFIED BY 'new_password'; |
FLUSH PRIVILEGES; |
EXIT; |
Une base dédiée (recommandé pour un projet, toujours en option B) :
CREATE DATABASE mon_projet; |
CREATE USER 'dev'@'localhost' IDENTIFIED BY 'change_me_strong_password'; |
GRANT ALL PRIVILEGES ON mon_projet.* TO 'dev'@'localhost'; |
FLUSH PRIVILEGES; |
EXIT; |
3.4.5. Dépannage connexion
Se connecter en admin :
# Si option A : |
mariadb -u root -p |
|
# Si option B : |
sudo mariadb |
Lister les utilisateurs :
SELECT User, Host, plugin FROM mysql.user; |
- Si option A :
roota un plugin mot de passe → phpMyAdmin =root. - Si option B :
roota en généralplugin=unix_socket→ phpMyAdmin =dev.
Changer un mot de passe :
-- Si option A : |
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; |
|
-- Si option B : |
ALTER USER 'dev'@'localhost' IDENTIFIED BY 'new_password'; |
FLUSH PRIVILEGES; |
Quitter :
EXIT; |
3.4.6. Sécurisation rapide (local)
Pour un poste de développement local, l’accès localhost suffit souvent. Pour restreindre davantage, éditez la conf Apache phpMyAdmin et limitez l’accès, par exemple :
Require local |
Puis :
sudo systemctl reload apache2 |
4. Configuration PHP
4.1. Vérifier la version active
php -v |
php -m |
4.2. Plusieurs versions PHP (optionnel)
Si vous installez plus tard d’autres branches (ex. via Sury pour PHP 8.5), basculez la CLI avec :
sudo update-alternatives --display php |
sudo update-alternatives --config php |
Pour Apache mod_php, n’activez qu’un module PHP à la fois :
# Example: switch from php8.4 to another installed version |
sudo a2dismod php8.4 |
sudo a2enmod phpX.Y |
sudo systemctl restart apache2 |
Remplacez phpX.Y par la version réellement installée.
4.3. Fichier php.ini Apache
sudo nano /etc/php/8.4/apache2/php.ini |
Après modification :
sudo systemctl restart apache2 |
Réglages fréquents en local :
display_errors = On |
error_reporting = E_ALL |
upload_max_filesize = 64M |
post_max_size = 64M |
memory_limit = 256M |
5. Fichiers essentiels
5.1. Apache
| Rôle | Chemin |
|---|---|
| Config principale | /etc/apache2/apache2.conf |
| Ports d’écoute | /etc/apache2/ports.conf |
| Document root | /var/www/html/ |
| Sites disponibles | /etc/apache2/sites-available/ |
| Sites activés | /etc/apache2/sites-enabled/ |
| Vhost par défaut | /etc/apache2/sites-available/000-default.conf |
| Logs accès | /var/log/apache2/access.log |
| Logs erreur | /var/log/apache2/error.log |
Activer / désactiver un vhost :
sudo a2ensite nom-du-site.conf |
sudo a2dissite nom-du-site.conf |
sudo systemctl reload apache2 |
5.2. PHP
| Rôle | Chemin |
|---|---|
php.ini (Apache) |
/etc/php/8.4/apache2/php.ini |
php.ini (CLI) |
/etc/php/8.4/cli/php.ini |
| Extensions | voir php -i | grep extension_dir |
5.3. MariaDB
| Rôle | Chemin |
|---|---|
| Config serveur | /etc/mysql/mariadb.conf.d/50-server.cnf |
| Données | /var/lib/mysql/ |
| Logs erreur | /var/log/mysql/error.log |
5.4. phpMyAdmin
| Rôle | Chemin |
|---|---|
| Config app | /etc/phpmyadmin/config.inc.php |
| Conf Apache | /etc/phpmyadmin/apache.conf |
| Logs | /var/log/apache2/error.log et access.log |
6. Checklist de validation
# Services |
systemctl is-active apache2 |
systemctl is-active mariadb |
|
# Versions |
apache2 -v |
php -v |
mariadb --version |
|
# Ports |
ss -tlnp | grep -E ':90|:3306' |
- http://localhost:90/ répond
- Apache écoute bien sur le port 90 (pas 80)
-
php -vaffiche 8.4.x - http://localhost:90/phpmyadmin s’ouvre
- Si option A : phpMyAdmin OK avec
root+ mdp (pas dedev) - Si option B : user
devcréé (§3.2) et phpMyAdmin OK avecdev+ mdp -
info.phpa été supprimé
7. Particularités Debian 13
- PHP 8.4 est natif : pas besoin de dépôt Sury ni de
apt-key(déprécié). - MariaDB est en 11.8 ; le script de sécurisation s’appelle
mariadb-secure-installation. - Apache reste en 2.4, avec les mêmes outils
a2enmod/a2ensite/systemctl. - Ce guide utilise le port HTTP 90 (
ports.conf+ Virtual Host). - MariaDB : option A =
rootsimple (pas dedev) ; option B =unix_socket+dev. L'option B existe pour ceux que le warning A convainc.
8. Suite possible
Pour des projets locaux avec un nom de domaine custom (monprojet.local), configurez un Virtual Host Apache pointant vers un dossier dédié (hors /var/www/html si vous le souhaitez), puis ajoutez l’entrée dans /etc/hosts.
Article détaillé ici : Comment créer un VirtualHost Apache sur Debian 13 pour un projet PHP local
Commentaires
Aucun commentaire approuvé pour le moment.
Connectez-vous avec un compte commentateur pour publier un commentaire. Se connecter.