
Procédure d'installation de PHP, MariaDB et NGINX sur un serveur Ubuntu. Protéger votre domain en Installant vos certificats de sécurité avec Let's Encrypt.
LEMP fait référence à “Linux, Nginx, MariaDB et PHP”. Il est a noté que le “E” fait référence à la prononciation de NGINX “Engine-X”.
NGINX est un serveur Web rapide, asynchrone et peu coûteux en ressources. Il remplace rapidement le serveur Web Apache. C’est lui qui traîtera principalement toutes les requêtes Web afin de retourner les fichiers statiques tels que JavaScript, CSS et images. Il invoquera alors une instance de PHP par l’entremise de PHP-FPM (FastCGI Process Manager).
En ce qui concerne MariaDB et MySQL, les deux sont très similaires et vous ne verrez probablement pas de différence quant à son utilisation. Sommairement, MariaDB a été créé en 2008 et son code ouvert provient de MySQL avant l’achat de ce dernier par JAVA. Pour en savoir plus, vous pouvez lire les références à la fin de mon article!
Avec ce bref aperçu, passons maintenant à l’action.
Installer NGINX, MariaDB, PHP, PHP-FPM
Voici comment installer les services de base.
sudo apt install -y nginx
sudo apt install -y mariadb-server
sudo apt install -y php-mysql
sudo apt install -y php-fpm
Sécuriser MariaDB
Nous allons nous connecter au service de MariaDB pour créer un nouvel utilisateur, une nouvelle base de donnée et donner les privilèges de l’utilisateur envers la base de données. Recharger la table des privilèges étant donné que nous les avons modifié.
sudo mysql -u root
> CREATE DATABASE testdb;
> CREATE USER 'mysqluser' IDENTIFIED BY 'mysqlpassword';
> GRANT ALL PRIVILEGES ON testdb.* TO 'mysqluser';
> FLUSH PRIVILEGES;
> quit;
Maintenant que nous avons un nouvel utilisateur, nous pouvons sécurisé le service en utilisant l’outil “mysql_secure_installation”. Cet outil demandera un nouveau mot de passe pour l’utilisateur “root” du service et vous devrez accepter les questions subséquentes.
# Exécuter l'outil de sécurité pour MySQL
sudo mysql_secure_installation
# Répondre aux questions suivantes en acceptant
Set root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
Sécuriser PHP-FPM
Voici une petite modification au fichier de configuration PHP-FPM afin qu’il accepte seulement les URIs duquel les fichiers existent sur le serveur. Ceci corriger une brèche de sécurité où que l’interpréteur PHP peut être trompé et ainsi exécuté du code non-désiré si le fichier PHP réquisitionné n’est pas présent sur le serveur.
Pour appliquer ce correctif, vous devez savoir quel version de PHP vous utiliser. Prenez seulement les 2 premiers chiffres représentant la version majeur “7” et la version mineur “4”, comme dans l’example suivant:
php -v
PHP 7.4.3 (cli) (built: Oct 6 2020 15:47:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
Remplacer “7.4” ce la commande suivante par votre version de PHP
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini
Configuration de votre premier site web
Premièrement, nous devons créer un répertoire “website.com/public_html/”sur votre serveur pour détenir la structure de fichier web. Un répertoire “/var/www/html” est déjà présent sur Ubuntu pour recevoir de nouveaux projets HTML.
# Créer le répertoire du projet Web
sudo mkdir -p /var/www/html/website.com/public_html
# Créer un fichier "index.php"
sudo nano /var/www/html/website.com/public_html/index.php
Écrire un simple fichier Hello World dans le fichier “index.php” qui testera du même coup si la connexion à la base de données est fonctionnel
<html>
<head>
<h2>LEMP Stack Test</h2>
</head>
<body>
<?php echo '<p>Hello,</p>';
// Define PHP variables for the MySQL connection.
$servername = "localhost";
$username = "mysqluser";
$password = "mysqlpassword";
// Create a MySQL connection.
$conn = mysqli_connect($servername, $username, $password);
// Report if the connection fails or is successful.
if (!$conn) {
exit('<p>Your connection has failed.<p>' . mysqli_connect_error());
}
echo '<p>You have connected successfully.</p>';
?>
</body>
</html>
Nous allons créer un fichier de configuration NGINX pour votre nouveau site web. Copier la configuration par défaut de NGINX pour le nouveau site. Modifier la configuration NGINX du nouveau site et remplacer la version “7.4” de php-fpm par votre version.
# Copier le fichier de configuration par défaut
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/website.com.conf
#Modifier le fichier de configuration
sudo nano /etc/nginx/sites-available/website.com.conf
server {
listen 80;
listen [::]:80;
server_name website.com www.website.com;
root /var/www/html/website.com/public_html;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~* \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
}
Activer la configuration NGINX en ajoutant un lien symbolique dans le répertoire /etc/nginx/sites-enabled/
Test your NGINX configuration
If successfull, reload NGINX configuration
# Créer un lien symbolique pour activer votre fichier de configuration
sudo ln -s /etc/nginx/sites-available/website.com.conf /etc/nginx/sites-enabled/
# Valider les configurations de NGINX
sudo nginx -t
# Redémarrer le service NGINX
sudo systemctl reload nginx
# Vous pouvez faire le test de configuration et redémarrer le service en une seule ligne de commande
sudo nginx -t && sudo systemctl reload nginx
Avec votre navigateur, accéder maintenant à L’URL de votre domaine. Vous devrez voir ceci:
LEMP Stack Test
Hello,
You have connected successfully.
Si vous n’avez pas changé le DNS de votre domaine afin qu’il pointe vers votre serveur, faites-le maintenant. En attendant la propagation DNS, vous pouvez imité votre test en utilisant la commande “cURL” depuis votre serveur.
curl -H "Host: website.com" http:///index.php
En résumé
Nous avons installé NGINX, PHP, PHP-FPM, MariaDB et servir un fichier PHP par HTTP.
Il est a noté que le répertoire web est la propriété de l’utilisateur “root” et sera prochainement corrigé pour être détenu par l’utilisateur et le groupe “www-data”, qui vient par défaut avec ubuntu.
Mais avant toute chose, nous voulons sécurisé l’accès au domaine en ajoutant un certificat SSL avec Let’s Encrypt.
Références
- https://www.linode.com/docs/guides/how-to-install-the-lemp-stack-on-ubuntu-18-04/
- https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/?highlight=pitfalls#passing-uncontrolled-requests-to-php
- https://www.php.net/manual/en/install.fpm.php
- https://www.stackscale.com/blog/php-fpm-high-traffic-websites/
- https://kinsta.com/blog/mariadb-vs-mysql/
- https://kinsta.com/blog/nginx-vs-apache/