Comment installer et configurer une stack LEMP sur un serveur VPS

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
- Un serveur de type VPS, HomeLab ou autre, fonctionnant de préférence sous Debian ou Ubuntu.
- Rien ne vous oblige à utiliser MySQL par exemple, chaque étape peut-être modifiée.
- 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
- Installer le package "UFW" :
bash
sudo apt install ufw
- Activer les règles suivantes :
bash
sudo ufw allow ssh
bash
sudo ufw allow 80
bash
sudo ufw allow 443
- 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 :
- Ajout de la clé au dépôt :
bash
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
- 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
- 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
#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
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
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
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
- Entrer dans MySQL ou MariaDB :
bash
mysql -u <user> -p
- Créer une base de données :
sql
CREATE DATABASE nom_de_la_base;
- Créer un utilisateur pour cette base de données :
sql
CREATE USER 'username'@'%' IDENTIFIED WITH sha256_password BY 'password';
- Donner les droits à cet utilisateur sur la base de données :
sql
GRANT ALL PRIVILEGES ON nom_de_la_base.* TO 'username'@'%';
GRANT ALL donne tous les privilèges (SELECT, INSERT, UPDATE, DELETE, etc.) sur la base de données en question.
PostgreSQL
- Entrer dans PostgreSQL :
bash
sudo -u postgres psql
- Créer une base de données :
sql
CREATE DATABASE nom_de_votre_base;
- Créer un utilisateur pour cette base de données :
sql
CREATE USER nom_utilisateur WITH PASSWORD 'mot_de_passe';
- Donner les droits à cet utilisateur sur la base de données :
sql
GRANT ALL PRIVILEGES ON DATABASE nom_de_votre_base TO nom_utilisateur;
GRANT ALL donne tous les privilèges (SELECT, INSERT, UPDATE, DELETE, etc.) sur la base de données en question.
- Quitter PostgreSQL :
sql
\q
#7. Installer Node et Composer
- Installer Node.js via nvm :
- Installer nvm :
bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
- Ajouter nvm à votre fichier
.bashrc
:
bash
source ~/.bashrc
- Lister les versions de Node.js disponibles :
bash
nvm ls-remote
- Installer la dernière version LTS de Node.js :
Pour installer une version spécifique, remplacezbash
nvm install --lts
--lts
par le numéro de version souhaité. - Installer Composer :
bash
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
- Déplacer Composer :
bash
sudo php8.4 /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer
- 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 :
- Créer une clé SSH :
bash
ssh-keygen -t ed25519 -C "Nom"
- Ensuite, affichons puis copions le contenu de la clé publique :
bash
cat ~/.ssh/id_ed25519.pub
- 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".
- Installer GIT :
bash
sudo apt install git
- 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
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
- Récupérer les dernières modifications :
bash
git pull
#9. Créer un bloc de serveur NGINX
- Créer un fichier de configuration pour votre site :
bash
sudo nano /etc/nginx/sites-available/monsite
- 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;
}
- Lier votre configuration à sites-enabled :
bash
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
- Redémarrez NGINX :
bash
sudo systemctl restart nginx
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 :