Comment installer et configurer une stack LEMP sur un serveur VPS

linuxdebianubuntunginxdeploywebserveurvpsmysqlbddphp
Image de couverture l'article

Vous avez loué un serveur VPS et vous souhaitez y installer une stack LEMP (Linux, Nginx, MySQL, PHP) pour héberger vos sites web ? Dans ce tutoriel, je vais vous montrer comment installer et configurer une stack LEMP sur un serveur VPS sous Debian ou Ubuntu.

#0. Prérequis & informations

  1. Un serveur de type VPS, HomeLab ou autre, fonctionnant de préférence sous Debian ou Ubuntu.
  2. Rien ne vous oblige à utiliser MySQL par exemple, chaque étape peut-être modifiée.
  3. Pour copier/coller les commandes, vous pouvez utiliser Shift + Insert pour coller.

#1. Choisir une image & nettoyer l'installation

Plusieurs images s'offrent à nous, des images dites basiques telles qu'Ubuntu 24.04 ou encore Debian 12. Des images préconfigurées existent également, comme des stacks LEMP (Linux, Nginx, MySQL, etc.). Vous pouvez choisir une image neutre et suivre cette note dans son intégralité, ou bien opter pour une installation préconfigurée et vous aider de cette note pour la personnaliser.

Ici, nous choisirons de partir sur une installation vierge de

.

Une fois le serveur en place, avant toute chose, nettoyons l'installation avec les commandes suivantes dans votre terminal :

bash

sudo apt update

bash

sudo apt upgrade

bash

sudo apt autoremove

bash

sudo apt autoclean

bash

sudo apt clean

#2. Installer NGINX

Pour ce faire :

bash

sudo apt install nginx

#3. Installer un pare-feu

  1. Installer le package "UFW" :

bash

sudo apt install ufw
  1. Activer les règles suivantes :

bash

sudo ufw allow ssh

bash

sudo ufw allow 80

bash

sudo ufw allow 443
  1. Activer le pare-feu :

bash

sudo ufw enable

#4. Installer PHP et les extensions nécessaires

Pour installer PHP ainsi que les extensions nécessaires au bon fonctionnement de notre serveur web, nous aurons besoin de quelques prérequis :

D'abord, ajoutons le dépôt "Sury" pour PHP :

  1. Ajout de la clé au dépôt :

bash

wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
  1. Ajout du dépôt Sury à la liste des sources :

bash

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
  1. Mettons à jour notre liste de paquets :

bash

sudo apt update

Ensuite, installons la bonne version de PHP ainsi que la dépendance de la BDD :

bash

sudo apt-get install php8.4-fpm php8.4-mysql

Remplacer php8.4-mysql par votre driver de base de donnée. Et n'oubliez pas d'activer les extensions dans votre php.ini : /etc/php/8.4/fpm/php.ini.

Vous pouvez installer toutes les extensions que vous souhaitez, voici quelques exemples :

bash

sudo apt install php8.4-mbstring php8.4-xml php8.4-bcmath php8.4-curl php8.4-zip
(remplacé 8.4 par votre version)

#5. Installer et configurer une base de données

MySQL

Dans un premier temps, téléchargeons puis installons MySQL depuis le site officiel :

bash

wget https://dev.mysql.com/get/mysql-apt-config_0.8.30-1_all.deb

bash

sudo apt install ./mysql-apt-config_0.8.30-1_all.deb
Vous verrez un message vous demandant de choisir la version de MySQL que vous souhaitez installer. Choisissez la version voulue puis valider avec flèche de droite ensuite espace.

bash

sudo apt-get update

bash

sudo apt install mysql-server

Pour sécuriser l'installation de MySQL, exécutez la commande suivante :

bash

sudo mysql_secure_installation

Si la commande vous demande d'activer unix_socket mais que vous souhaitez utiliser un mot de passe, répondez "n" :

bash

Switch to unix_socket authentication [Y/n] n

Ensuite, créons un compte administrateur pour accéder à MySQL :

bash

sudo mysql
Ajoutez le flag-p si vous avez un mot de passe pour l'utilisateur root.

sql

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

sql

GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost' WITH GRANT OPTION;

sql

FLUSH PRIVILEGES;

MariaDB

Pour installer MariaDB, exécutez les commandes suivantes :

bash

sudo apt install mariadb-server

Pour sécuriser l'installation de MariaDB, exécutez la commande suivante :

bash

sudo mysql_secure_installation

La commande vous demandera si vous souhaitez activer unix_socket, si vous souhaitez utiliser un mot de passe, répondez "n" :

bash

Switch to unix_socket authentication [Y/n] n

Ensuite, créons un compte administrateur pour accéder à MariaDB :

bash

sudo mariadb

sql

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

sql

FLUSH PRIVILEGES;

PostgreSQL

Pour installer PostgreSQL, commençons par mettre à jour notre liste de paquets :

bash

sudo apt update && sudo apt upgrade

Ensuite, installons PostgreSQL :

bash

sudo apt install postgresql postgresql-contrib

Pour configurer PostgreSQL, nous devons nous assurer qu'il est démarré :

bash

sudo systemctl start postgresql && sudo systemctl enable postgresql

Ensuite, nous devons nous connecter à PostgreSQL. Par défaut, Postgre créer un utilisateur postgres au quelle nous allons nous connecter puis changer le mot de passe :

bash

sudo -u postgres psql

sql

\password postgres
Entrez un nouveau mot de passe, confirmer le puis quitter avec \q.

Enfin, pour que PHP puisse se connecter à PostgreSQL, nous devons installer l'extension PHP :

bash

sudo apt install php8.4-pgsql

Enfin, redémarrons PHP-FPM :

bash

sudo systemctl restart php8.4-fpm

SQLite

Commençons par installer SQLite :

bash

sudo apt-get install php-sqlite3

Ensuite, activons l'extension dans notre fichier php.ini, ouvrez le fichier :

bash

nano /etc/php/<version>/fpm/php.ini

Au niveau des extensions, ajoutez la ligne suivante :

bash

extension=sqlite3

Enfin, il vous faudra vous assurer que votre projet ait les permissions nécessaires sur votre fichier de base de données :

bash

chmod 664 /var/www/projet/ficher_bdd.sqlite

bash

chown www-data:www-data /var/www/projet/ficher_bdd.sqlite

bash

chown -R /var/www/projet/dossier_du_fichier_bdd

#6. Créer une base de données

MySQL ou MariaDB

  1. Entrer dans MySQL ou MariaDB :

bash

mysql -u <user> -p
  1. Créer une base de données :

sql

CREATE DATABASE nom_de_la_base;
  1. Créer un utilisateur pour cette base de données :

sql

CREATE USER 'username'@'%' IDENTIFIED WITH sha256_password BY 'password';
  1. Donner les droits à cet utilisateur sur la base de données :

sql

GRANT ALL PRIVILEGES ON nom_de_la_base.* TO 'username'@'%';
important :

GRANT ALL donne tous les privilèges (SELECT, INSERT, UPDATE, DELETE, etc.) sur la base de données en question.

PostgreSQL

  1. Entrer dans PostgreSQL :

bash

sudo -u postgres psql
  1. Créer une base de données :

sql

CREATE DATABASE nom_de_votre_base;
  1. Créer un utilisateur pour cette base de données :

sql

CREATE USER nom_utilisateur WITH PASSWORD 'mot_de_passe';
  1. Donner les droits à cet utilisateur sur la base de données :

sql

GRANT ALL PRIVILEGES ON DATABASE nom_de_votre_base TO nom_utilisateur;
important :

GRANT ALL donne tous les privilèges (SELECT, INSERT, UPDATE, DELETE, etc.) sur la base de données en question.

  1. Quitter PostgreSQL :

sql

\q

#7. Installer Node et Composer

  1. Installer Node.js via nvm :
    1. Installer nvm :

    bash

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
    
    1. Ajouter nvm à votre fichier .bashrc :

    bash

    source ~/.bashrc
    
    1. Lister les versions de Node.js disponibles :

    bash

    nvm ls-remote
    
    1. Installer la dernière version LTS de Node.js :

    bash

    nvm install --lts
    
    Pour installer une version spécifique, remplacez --lts par le numéro de version souhaité.
  2. Installer Composer :

bash

curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
  1. Déplacer Composer :

bash

sudo php8.4 /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
  1. Vérifier l'installation :

bash

composer --version && node -v && npm -v

#8. Cloner un projet sur le serveur

Pour ce faire, nous aurons besoin dans un premier temps de créer une clé SSH et de la renseigner dans GIT afin de s'assurer une connexion sécurisée :

  1. Créer une clé SSH :

bash

ssh-keygen -t ed25519 -C "Nom"
  1. Ensuite, affichons puis copions le contenu de la clé publique :

bash

cat ~/.ssh/id_ed25519.pub
Sélectionner l'entièreté du contenu afficher puis copier le.
  1. Ajouter la clé SSH dans GIT :

Accéder au dépôt GitHub de votre choix puis accéder à "Settings" et enfin "Deploy keys". Ensuite, cliquer sur "Add deploy key", renseigner un nom pour votre clé et ajouter le contenu préalablement copier de la clé publique. Cliquer enfin sur "Add key".

  1. Installer GIT :

bash

sudo apt install git
  1. Cloner le projet :

Naviguer jusqu'à l'endroit où vous souhaitez ajouter votre projet, habituellement /var/www/ et cloner votre dépôt grâce à la méthode SSH de GIT :

bash

git clone git@github.com:llayz46/<depot>.git
astuce :

Pour cloner une branche spécifique de votre repository, ajoutez le nom de la branche à la fin de la commande :

bash

git clone -b <nom_de_la_branche> git@github.com:llayz46/<depot>.git

  1. Récupérer les dernières modifications :

bash

git pull

#9. Créer un bloc de serveur NGINX

  1. Créer un fichier de configuration pour votre site :

bash

sudo nano /etc/nginx/sites-available/monsite
  1. Ajouter le contenu suivant :

Version HTTP

nginx

server {
        listen 80 http2 default_server;
        listen [::]:80 http2 default_server ipv6only=on;

        root /var/www/<dossier_projet>/<dossier_public>;
        index index.php;

        server_name nom_de_domaine www.nom_de_domaine;

        add_header X-Content-Type-Options "nosniff";
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";

        location / {
                try_files $uri /index.php$is_args$args;
        }

        location ~ ^/index\.php(/|$) {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php<PHP_VERSION>-fpm.sock;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                internal;
        }

        location ~ \.php$ {
                return 404;
        }

        error_log /var/log/nginx/your_domain_error.log;
        access_log /var/log/nginx/your_domain_access.log;
}

Version HTTPS

nginx

server {
        listen 443 ssl http2 default_server; # default_server permet de définir ce serveur comme serveur par défaut
        listen [::]:443 ssl http2 default_server ipv6only=on;

        root /var/www/<dossier_projet>/<dossier_public>;
        index index.php;

        server_name nom_de_domaine www.nom_de_domaine;
    
        add_header X-Frame-Options "SAMEORIGIN"; 
        add_header X-Content-Type-Options "nosniff"; 
        add_header X-XSS-Protection "1; mode=block";

        ssl_certificate /etc/letsencrypt/live/nom_de_domaine/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/nom_de_domaine/privkey.pem;

        # include /etc/nginx/snippets/ssl-params.conf;

        location / {
                try_files $uri /index.php$is_args$args;
        }

        location ~ ^/index\.php(/|$) {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php<PHP_VERSION>-fpm.sock;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                internal;
        }

        location ~ \.php$ {
                return 404;
        }

        error_log /var/log/nginx/your_domain_error.log;
        access_log /var/log/nginx/your_domain_access.log;
}
  1. Lier votre configuration à sites-enabled :

bash

sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
  1. Redémarrez NGINX :

bash

sudo systemctl restart nginx
Vérifier la configuration

bash

sudo nginx -t


#10. Dépendances & configuration du projet


#11. Optimisation & sécurité

Votre serveur est en ligne mais vous souhaitez améliorer les performances des tests.

Plusieurs actions possibles :


#12. Conclusion

Vous avez maintenant une stack LEMP fonctionnelle sur votre serveur VPS. Vous pouvez maintenant héberger vos sites web.

Quelques conseils pour aller plus loin :