Ubuntu 18.04 Server : installer et configurer Nginx, PHP et MariaDB
Pour utiliser Nginx, PHP-FPM et MariaDB ensemble sur Ubuntu 18.04, vous devez installer chaque package, transmettre les requêtes PHP de Nginx au socket PHP-FPM, puis configurer la base de données avec des comptes séparés. L'exemple ci-dessous est une pratique uniquement locale qui ne modifie pas les sites existants et n'utilise pas le compte root de la base de données pour les applications web.
Portée de la pratique et préparation
La prise en charge générale de la sécurité pour Ubuntu 18.04 a pris fin. Vérifiez si la Maintenance de Sécurité Étendue (ESM) d'Ubuntu Pro est appliquée et la plage de support pour chaque paquet à Programme de Maintenance de la Sécurité d'Ubuntu, et il est recommandé de construire de nouveaux environnements d'exploitation avec des versions prises en charge. Cet article utilise PHP 7.2 du dépôt par défaut à titre d'exemple pour comprendre un serveur 18.04 existant.
Préparez un serveur de test séparé avec des privilèges administrateur et un accès au dépôt. Nginx gère les requêtes web, PHP-FPM (FastCGI Process Manager) exécute le code PHP, et MariaDB stocke les données. Les exemples sont reçus uniquement dans 127.0.0.1:8080, donc vous ne pouvez pas y accéder directement depuis l'extérieur du serveur. Pour un accès à Internet public, un pare-feu, domaine, certificat TLS et une revue de sécurité séparés sont nécessaires.
Sur les serveurs avec des services ou des données existants, préparez les procédures de sauvegarde et de récupération avant de procéder à des modifications. Si les chemins de pratique, comptes, noms de bases de données ou le port 8080 ci-dessous sont déjà utilisés, ne continuez pas en l'état ; utilisez un environnement de test séparé. Vous pouvez vérifier l'utilisation du port avec la commande suivante. S'il n'y a aucune sortie, il n'y a pas de service TCP à l'écoute sur ce port.
sudo ss -lntp | grep ':8080 '
Installation du package et vérification du service
L’installation des paquets peut démarrer automatiquement le site Nginx par défaut, qui écoute sur le port 80. Limiter le site de test au port local 8080 ne limite pas le site par défaut. Isolez le serveur de test à l’aide du réseau et du pare-feu avant l’installation et vérifiez les effets sur les services existants.
Après avoir mis à jour la liste des packages, installez Nginx, PHP 7.2 FPM avec le pilote MySQL, le serveur MariaDB et curl pour la vérification. Si les packages ne peuvent pas être utilisés en raison de problèmes de dépôt ou de support, résolvez les erreurs avant de continuer.
sudo apt update
sudo apt install nginx php7.2-fpm php7.2-mysql mariadb-server curl
Après l'installation, vérifiez l'état du service et le socket PHP-FPM en utilisant les commandes suivantes. Si le service ne fonctionne pas, identifiez la cause et démarrez le service. Si le chemin du socket est différent, ajustez la configuration Nginx ci-dessous pour correspondre au chemin réel.
systemctl is-active nginx php7.2-fpm mariadb
ls -l /run/php/
Vérifiez si chacun des trois services est active. Si php7.2-fpm.sock n'existe pas, vérifiez la cause dans systemctl status php7.2-fpm et les journaux du service. Lorsque la version de PHP est différente, vous devez modifier à la fois le paquet et le chemin du socket ensemble.
Connexion Nginx et PHP-FPM
Créez un nouveau répertoire de pratique et un fichier de configuration. Ne pas écraser /var/www/lnmp-demo, /etc/nginx/sites-available/lnmp-demo ou /etc/nginx/sites-enabled/lnmp-demo s'ils existent déjà. Exécutez les commandes d'édition ci-dessous après avoir confirmé qu'il n'existe aucun chemin sur un serveur propre.
sudo mkdir /var/www/lnmp-demo
sudo nano /etc/nginx/sites-available/lnmp-demo
Enregistrez le bloc de serveur complet suivant dans l'éditeur. fastcgi_pass doit correspondre à la socket PHP-FPM confirmée précédemment. snippets/fastcgi-php.conf est un extrait de configuration du paquet Ubuntu Nginx ; si le fichier n'existe pas, vérifiez les paramètres FastCGI dans la distribution.
server {
listen 127.0.0.1:8080;
server_name localhost;
root /var/www/lnmp-demo;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Activez et vérifiez le fichier de configuration. Rechargez uniquement si nginx -t réussit. En cas d'échec, vérifiez et corrigez les erreurs, les ports et les chemins des sockets, puis revérifiez. Si un problème survient, supprimez uniquement les liens symboliques créés dans cet exercice, puis revérifiez et rechargez pour maintenir la configuration existante du site.
sudo ln -s /etc/nginx/sites-available/lnmp-demo /etc/nginx/sites-enabled/lnmp-demo
sudo nginx -t
sudo systemctl reload nginx
Les connexions FastCGI de Nginx peuvent également être vérifiées dans Guide Officiel Nginx.
Vérifier l'exécution de PHP
Vérifiez qu'il n'y a pas de fichier dans le chemin ci-dessous et créez un nouveau fichier. Enregistrez le code ci-dessous dans votre éditeur.
sudo nano /var/www/lnmp-demo/index.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo "PHP is working\n";
echo 'SAPI: ' . PHP_SAPI . "\n";
Exécutez la commande suivante sur le même serveur. Si PHP is working et SAPI: fpm-fcgi apparaissent, Nginx a exécuté le code via PHP-FPM. Si le code PHP est affiché tel quel, la configuration n'a pas été appliquée, donc ne pas exposer le fichier de test et vérifiez les paramètres FastCGI à nouveau.
curl http://127.0.0.1:8080/
S'il y a une erreur 502, vérifiez le service PHP-FPM, le chemin du socket et les autorisations ; s'il y a une erreur 404, vérifiez le répertoire du document et le chemin du fichier. Ne pas exposer la page phpinfo() qui divulgue les paramètres détaillés du serveur.
Base de données MariaDB et compte séparé
L'authentification de l'administrateur MariaDB dépend de la méthode d'installation. Si l'authentification par socket locale est configurée, vous pouvez ouvrir la console de gestion avec la commande suivante. Si cela échoue, vérifiez la méthode d'authentification de l'administrateur existante. MYSQL_HISTFILE=/dev/null spécifie que cette session client ne doit pas laisser de fichier d'historique des commandes.
sudo env MYSQL_HISTFILE=/dev/null mysql
Ce qui suit est le SQL pour créer une nouvelle base de données de pratique et un compte uniquement local. Si le même nom existe déjà, ne modifiez pas l'entrée existante ; utilisez un nom différent. Avant l'exécution, remplacez CHANGE_ME_STRONG_PASSWORD par un mot de passe long et unique, et assurez-vous que toutes les guillemets ou barres obliques inverses dans la chaîne SQL sont correctement échappés.
CREATE DATABASE lnmp_demo CHARACTER SET utf8mb4;
CREATE USER 'lnmp_demo'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT SELECT ON lnmp_demo.* TO 'lnmp_demo'@'localhost';
EXIT;
Ce compte d'exemple dispose de permissions en lecture seule sur la base de données. Si une application réelle nécessite des permissions d'écriture ou de modification du schéma, accordez uniquement les permissions nécessaires séparément. Ne modifiez pas directement le plugin d'authentification du compte administrateur et ne donnez pas de privilèges root à l'application web. Pour plus de détails sur les comptes et l'authentification, reportez-vous à la documentation MariaDB CREATE USER.
Vérifiez que le nouveau compte peut se connecter localement. N'écrivez pas le mot de passe directement sur la ligne de commande ; saisissez-le à l'invite. Après la connexion, l'exécution de SELECT DATABASE(), CURRENT_USER(); affichera la base de données et les comptes authentifiés. Quittez la console en utilisant EXIT;.
mysql -u lnmp_demo -p lnmp_demo
Vérifiez la connexion à la base de données dans PHP
La méthode suivante est une méthode de vérification temporaire utilisant le compte créé ci-dessus. Conservez les identifiants en dehors du répertoire des documents web. Si /etc/lnmp-demo existe déjà, ne l'écrasez pas ; utilisez un environnement de test séparé à la place. Cela suppose la configuration par défaut où PHP-FPM s'exécute sous le groupe www-data.
sudo install -d -m 750 -o root -g www-data /etc/lnmp-demo
sudo install -m 640 -o root -g www-data /dev/null /etc/lnmp-demo/db.php
sudo nano /etc/lnmp-demo/db.php
Insérez le contenu suivant dans le fichier, et remplacez le mot de passe par la valeur définie pour le compte de la base de données. S'il y a des guillemets ou des barres obliques inverses dans la chaîne PHP, échappez-les correctement. Puisque d'autres applications fonctionnant avec les mêmes permissions www-data peuvent également lire le fichier, une isolation séparée est nécessaire sur les serveurs partagés.
<?php
return array(
'user' => 'lnmp_demo',
'password' => 'CHANGE_ME_STRONG_PASSWORD',
);
Assurez-vous que /var/www/lnmp-demo/db-check.php n'existe pas et enregistrez le code suivant. Indiquez uniquement le succès ou l'échec afin d'éviter d'exposer des messages d'erreur ou des mots de passe dans la réponse web.
sudo nano /var/www/lnmp-demo/db-check.php
<?php
header('Content-Type: text/plain; charset=UTF-8');
ini_set('display_errors', '0');
$config = require '/etc/lnmp-demo/db.php';
try {
$db = new PDO('mysql:host=localhost;dbname=lnmp_demo;charset=utf8mb4',
$config['user'], $config['password'],
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
echo "Database connection OK\n";
} catch (PDOException $e) {
http_response_code(500);
echo "Database connection failed\n";
}
curl -i http://127.0.0.1:8080/db-check.php
Si HTTP 200 et Database connection OK apparaissent, la connexion PHP à MariaDB a réussi. En cas d'échec, vérifiez l'extension PHP MySQL, l'état du service, l'authentification par socket, et le compte/mot de passe. Après vérification, supprimez en toute sécurité les fichiers PHP temporaires et les fichiers d'identifiants, et nettoyez les comptes et bases de données de pratique qui ne sont plus nécessaires, en vérifiant à la fois les cibles réelles et les sauvegardes.
Avant d'appliquer dans l'environnement de production
La configuration de pratique est destinée à la vérification de la connexion locale. Avant de rendre les services réels publics, migrez vers des versions OS et PHP supportées, et configurez le nom du serveur Nginx et le répertoire racine du document, les certificats HTTPS, le pare-feu, et les règles réseau cloud selon l'environnement. Vous devez également examiner la portée de téléchargement/exécution des fichiers PHP, la séparation des utilisateurs FPM, ainsi que l'accès réseau, la sauvegarde et la récupération de MariaDB.
L'outil de configuration de sécurité MariaDB est fourni en tant que mysql_secure_installation ou mariadb-secure-installation selon la version installée. Comme il peut affecter les services existants, lisez chaque question et choisissez en fonction de votre environnement. Les éléments détaillés se trouvent dans Description de l'outil de configuration de sécurité MariaDB.




