Configuration LEMP – Ubuntu 20.04

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.

Installer NGINX, MariaDB, PHP, PHP-FPM
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é.

Créer utilisateur et base de données
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.

Script de sécurité MySQL
# 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:

Sécuriser PHP-FPM
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

Search and replace PHP-FPM config
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 un répertoire récursivement et un fichier PHP
# 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

Test de connection à la base de données
<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.

Fichier de configuration NGINX
# 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

Activer le fichier de configuration NGINX
# 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:

Test local
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.

Test local
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.

Autres articles de cette série

  • #1 - Se connecter au serveur
    Après avoir louer votre nouveau serveur, votre hébergeur vous donne un accès avec un nom d'utilisateur et un mot de passe. Cet article vous guidera à la première étape de se connecter avec le protocol SSH, modifier le mot de passe de votre utilisateur et définir un mot de passe de l'utilisateur "root".
  • #2 - Service SSH
    Mettre à jour le système d'exploitation et renforcir la sécurité du service SSH en ajoutant quelques configurations supplémentaires.
  • #3 - Gestion d'utilisateurs
    Comment ajouter de nouveaux utilisateurs, de nouveaux groupes et associer des utilisateurs aux groupes. Voici la liste des commandes facilitant la gestion de vos utilisateurs système.
  • #4 - Configuration LEMP - Ubuntu 20.04
    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.