Ubuntu 22.04 Server / Installer Apache, PHP et MariaDB
Sur Ubuntu 22.04 Server, installez Apache, son module PHP, MariaDB et l’extension PHP pour les bases de données afin de préparer un environnement Web de base. Séparez ensuite le compte d’administration MariaDB de celui de l’application et vérifiez que PHP peut lire une valeur dans la base.
Périmètre de l’installation et paquets
Ce guide utilise les dépôts par défaut d’Ubuntu 22.04 sur un nouveau serveur hébergeant à la fois Apache et MariaDB. Il faut des droits sudo et une connexion Internet pour télécharger les paquets. Sur un serveur existant, sauvegardez d’abord la configuration Web et les bases, puis vérifiez que les noms de fichiers, comptes et bases de l’exemple sont disponibles. Si vous utilisez déjà PHP-FPM, ne mélangez pas cette configuration avec celle du module Apache.
- Actualisez la liste des paquets et installez les composants.
libapache2-mod-phpexécute PHP dans Apache etphp-mysqlfournit les extensions permettant de joindre MariaDB. Installez aussiphp-clipour les vérifications en ligne de commande. Consultez le guide Ubuntu d’installation de PHP pour cette configuration.
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- Démarrez les services et activez leur lancement au démarrage du système. Vérifiez que le contrôle de configuration Apache indique
Syntax OK, puis redémarrez Apache pour charger le module PHP.
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
La dernière commande affiche active pour chacun des services en cours d’exécution. Consultez les versions installées avec apache2 -v, php -v et mariadb --version. Des dépôts supplémentaires peuvent fournir une version de PHP différente de celle des dépôts par défaut.
Vérifier l’authentification de l’administrateur MariaDB
Les paquets MariaDB par défaut d’Ubuntu utilisent généralement l’authentification par socket Unix pour l’administration locale. Cette méthode vérifie l’identité de l’utilisateur du système ; elle ne signifie pas que tout le monde peut se connecter avec un mot de passe root vide. Ouvrez la session d’administration ci-dessous pour examiner le compte et la configuration actuels.
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
L’authentification de root dépend aussi des réglages existants. Cet exemple conserve le socket et crée un compte applicatif distinct, conformément aux explications sur l’authentification MariaDB depuis la version 10.4. Ne modifiez pas directement la valeur plugin de mysql.user par UPDATE et n’utilisez pas root dans une application Web.
L’outil suivant permet de vérifier les réglages de sécurité initiaux. Le texte et l’ordre des questions varient selon la version et la configuration ; ne répondez pas systématiquement Y à tout.
sudo mariadb-secure-installation
- Si vous administrez déjà MariaDB par authentification socket, vous pouvez la conserver. La documentation officielle de l’outil MariaDB précise qu’un nouveau mot de passe root n’est généralement pas nécessaire dans cette configuration.
- Sur un nouveau serveur, il convient de supprimer les utilisateurs anonymes et la base test inutile, et de limiter les connexions root distantes. Si des services existent déjà, vérifiez leur utilisation avant de décider. Lorsque l’outil propose de recharger les tables de privilèges, appliquez les changements.
Créer une base et un compte dédiés à l’application
Reconnectez-vous avec sudo mariadb --protocol=socket et exécutez le SQL ci-dessous. lampdemo et lamp_app sont les nouveaux noms de cet exercice. S’ils existent, choisissez d’autres noms et adaptez tous les exemples ; n’écrasez ni ne supprimez les objets existants. Remplacez le texte provisoire du mot de passe par un mot de passe long et unique, identique dans la configuration PHP. Une apostrophe dans le mot de passe doit respecter les règles d’échappement des chaînes propres à SQL et à PHP.
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
L’administrateur crée la table ; l’application reçoit uniquement les droits de lecture, insertion, modification et suppression sur cette base. Si un programme d’installation exige le droit de créer des tables, examinez ce besoin séparément. Après attribution des droits avec GRANT, il est inutile d’exécuter un FLUSH PRIVILEGES supplémentaire.
Interrogez la base depuis le terminal avec le compte applicatif et vérifiez la présence de database-ok. N’ajoutez pas le mot de passe après -p : saisissez-le à l’invite.
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
Créer les fichiers PHP de l’exemple
Le répertoire Web du site Apache par défaut d’Ubuntu est généralement /var/www/html. Pour un hôte virtuel existant, examinez sudo apache2ctl -S et son paramètre DocumentRoot, puis adaptez le chemin du fichier Web. Si un fichier indiqué existe déjà, changez de nom. Conservez le fichier contenant le mot de passe en dehors du répertoire Web.
- Créez le répertoire de configuration et ouvrez un éditeur. Ces permissions supposent qu’Apache utilise l’utilisateur et le groupe Ubuntu par défaut,
www-data.
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
Enregistrez tout le contenu suivant dans /etc/lamp-demo/database.php. Remplacez password par le mot de passe applicatif défini auparavant. Comme l’explique la documentation PHP sur la connexion PDO_MYSQL, host=localhost utilise un socket sous Unix. Le remplacer par 127.0.0.1 impose TCP et peut modifier la sélection du compte et les conditions de connexion.
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- Gardez root comme propriétaire du fichier de configuration, lisible uniquement par son propriétaire et le groupe Apache. Ouvrez ensuite le fichier Web de contrôle.
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
Enregistrez tout le contenu suivant dans /var/www/html/lamp-check.php. PDO (PHP Data Objects) est une interface d’accès aux bases de données depuis PHP. Ce code vérifie la valeur réelle de la table avant d’afficher le succès. En cas d’échec, il renvoie HTTP 500 avec un message général et consigne la cause détaillée dans le journal du serveur.
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Rendez le fichier Web de contrôle lisible et vérifiez la syntaxe PHP des deux fichiers.
No syntax errors detectedindique seulement une syntaxe valide, pas une connexion réussie à la base.
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
Un utilisateur ordinaire peut ne pas avoir accès au fichier de configuration : son contrôle de syntaxe utilise donc sudo. Il est inutile de rendre tout le répertoire Web accessible en écriture ou d’appliquer chmod 777.
Vérifier la réponse HTTP et la connexion à la base
Demandez l’URL suivante depuis le serveur lui-même. Installez curl avec sudo apt install curl si nécessaire. Un statut HTTP 200 accompagné des deux lignes ci-dessous signifie qu’Apache a exécuté PHP et que PHP a lu la ligne d’exemple dans MariaDB.
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
Depuis un autre ordinateur, ouvrez http://SERVER-IP/lamp-check.php dans un navigateur. Pour un hôte virtuel, utilisez le nom d’hôte configuré. La seule page d’accueil par défaut ou la commande php -v ne suffit pas à vérifier cette intégration.
Si l’accès fonctionne localement mais pas depuis un autre ordinateur, vérifiez sudo ufw status verbose, les groupes de sécurité du cloud et le routage. Sur un réseau privé de test où UFW est déjà actif, la règle suivante autorise le port HTTP 80 depuis le sous-réseau prévu uniquement. Remplacez 192.168.10.0/24 par votre sous-réseau de confiance. Ne désactivez pas le pare-feu et ne l’activez pas pour la première fois sans autoriser l’accès SSH distant pour ce test.
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHP et MariaDB communiquent par socket sur le même serveur : inutile d’exposer le port 3306. Réalisez cet exercice HTTP dans un environnement de confiance. Avant de transmettre des identifiants ou d’autres données en production, configurez séparément le domaine, l’hôte virtuel et le certificat HTTPS.
Dépanner et nettoyer les tests
Pour isoler un échec de connexion, examinez successivement les services, les modules PHP, les comptes et les permissions des fichiers. Les commandes suivantes affichent la configuration et les modules Apache ainsi que les journaux récents des deux services. Ces journaux peuvent contenir des informations d’exploitation ; ne les publiez pas tels quels.
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- Le code source PHP s’affiche ou se télécharge : interrompez l’accès public et vérifiez l’activation du module PHP Apache et le redémarrage du serveur. Si l’installation de
libapache2-mod-phpne résout rien, examinez également la configuration PHP-FPM et les hôtes virtuels existants. - could not find driver : vérifiez que l’extension
php-mysqlcorrespondant à la version PHP utilisée par Apache est installée et activée, puis redémarrez Apache. PHP en ligne de commande et PHP dans Apache peuvent utiliser des configurations différentes. - Access denied : vérifiez le mot de passe applicatif, le compte
'lamp_app'@'localhost'et ses droits. Ne contournez pas le problème en changeant l’authentification root ou en accordant des droits globaux. Si le socket est introuvable, comparez le résultat MariaDB deSHOW VARIABLES LIKE 'socket';à la configuration socket de PHP. - Permission denied ou 404 : vérifiez que l’utilisateur Apache peut lire la configuration et que le fichier Web se trouve dans le DocumentRoot du site demandé. Contrôlez aussi les droits d’accès au répertoire
/etc/lamp-demo.
Après vérification, supprimez uniquement le fichier Web de test créé dans ce guide avec la commande ci-dessous, puis confirmez que la même URL ne renvoie plus le message de succès. Ne laissez pas de fichiers divulguant l’environnement, comme un ancien phpinfo.php. Si une application réelle utilise la configuration, gardez-la hors du répertoire Web avec des permissions limitées.
sudo rm -- /var/www/html/lamp-check.php
Pour supprimer aussi les données de l’exercice, vérifiez d’abord qu’aucun autre service ne les utilise, puis exécutez le SQL suivant dans une session d’administration. La suppression d’une base est irréversible : sauvegardez les données nécessaires auparavant. Visez uniquement les noms créés pour cet exercice.
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
Sur un serveur unique, conservez la configuration d’écoute locale de MariaDB. Si un accès distant à la base devient nécessaire, ne supprimez pas simplement bind-address : définissez ensemble l’adresse d’écoute, les sources autorisées, le compte dédié et la connexion chiffrée.



