Installer une pile LEMP sur un VPS Linux AlmaLinux 9

2 min
Hébergement VPS/VDS

Une pile LEMP (Linux, Nginx, MariaDB, PHP-FPM) est une alternative rapide et légère à Apache pour servir des sites PHP. Sur AlmaLinux 9, tout vient du dépôt officiel AppStream, mais SELinux et firewalld demandent un peu d'attention. Ce guide vous accompagne pour une installation propre sur votre VPS Linux Infrawire ; les mêmes étapes fonctionnent sur Rocky Linux 9.

📋 Prérequis

  • Un VPS KVM sous AlmaLinux 9 (l'IP et le mot de passe root se trouvent dans votre espace client)
  • Un accès SSH en root
  • Un domaine example.com pointant vers VPS_IP

1. Mettre à jour le système et installer les outils

Bash
dnf -y update dnf -y install nano policycoreutils-python-utils

policycoreutils-python-utils fournit semanage, utilisé dans la section SELinux.

2. Installer Nginx et ouvrir le pare-feu

Bash
dnf -y install nginx systemctl enable --now nginx firewall-cmd --permanent --add-service=http --add-service=https firewall-cmd --reload firewall-cmd --list-services

3. Installer MariaDB

Bash
dnf -y install mariadb-server systemctl enable --now mariadb mysql_secure_installation

Répondez à l'assistant pour définir un mot de passe root, supprimer les utilisateurs anonymes, interdire la connexion root à distance et supprimer la base de test. Créez ensuite une base et un utilisateur dédiés :

Bash
mysql -u root -p
SQL
1CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD'; 3GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; 4FLUSH PRIVILEGES; 5EXIT;

4. Installer PHP 8.3 depuis le module AppStream

AppStream propose plusieurs flux PHP. Sélectionnez celui que vous voulez avant l'installation :

Bash
dnf module list php dnf -y module reset php dnf -y module enable php:8.3 dnf -y install php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-intl php-opcache php-pecl-zip php -v

Par défaut, le pool PHP-FPM tourne sous l'utilisateur apache. Nginx tournant sous nginx, alignez le pool et les répertoires de sessions :

Bash
sed -i 's/^user = apache/user = nginx/; s/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf chown -R root:nginx /var/lib/php/session /var/lib/php/wsdlcache /var/lib/php/opcache grep -E '^(user|group|listen)' /etc/php-fpm.d/www.conf systemctl enable --now php-fpm

Le pool écoute sur le socket Unix /run/php-fpm/www.sock.

5. Créer le server block

Bash
mkdir -p /var/www/example.com/public chown -R nginx:nginx /var/www/example.com nano /etc/nginx/conf.d/example.com.conf
Nginx
1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com www.example.com; 5 root /var/www/example.com/public; 6 index index.php index.html; 7 8 location / { 9 try_files $uri $uri/ /index.php?$query_string; 10 } 11 12 location ~ \.php$ { 13 include fastcgi_params; 14 fastcgi_pass unix:/run/php-fpm/www.sock; 15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 16 } 17 18 location ~ /\.(?!well-known) { 19 deny all; 20 } 21}
Bash
nginx -t && systemctl reload nginx

6. Configurer SELinux

Laissez SELinux en mode enforcing (getenforce). Les fichiers créés sous /var/www reçoivent déjà l'étiquette httpd_sys_content_t, mais ceux déplacés avec mv depuis ailleurs gardent l'ancienne. Réétiquetez-les et n'accordez l'écriture qu'aux répertoires qui en ont besoin :

Bash
restorecon -Rv /var/www/example.com mkdir -p /var/www/example.com/public/uploads semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/example.com/public/uploads(/.*)?' restorecon -Rv /var/www/example.com/public/uploads

N'activez ensuite les booléens que si votre application en a besoin :

Bash
# PHP se connecte à une base en TCP (serveur distant ou 127.0.0.1) setsebool -P httpd_can_network_connect_db 1 # PHP ou Nginx émet des connexions sortantes (API, proxy_pass vers une appli) setsebool -P httpd_can_network_connect 1

Une base MariaDB locale jointe par son socket n'a besoin ni de l'un ni de l'autre. Pour voir ce que SELinux bloque, lancez ausearch -m avc -ts recent. Ne « réparez » jamais un problème avec setenforce 0.

7. Tester PHP puis supprimer le fichier de test

Bash
echo '<?php phpinfo();' > /var/www/example.com/public/info.php curl -sI http://example.com/info.php | head -n 1 rm /var/www/example.com/public/info.php

Attendez-vous à HTTP/1.1 200 OK. La page phpinfo() révèle votre configuration : supprimez-la aussitôt. Vérifiez enfin les services :

Bash
systemctl is-active nginx php-fpm mariadb

🛠️ Dépannage

502 Bad Gateway. PHP-FPM est arrêté ou le chemin du socket dans fastcgi_pass est faux. Lancez systemctl status php-fpm, vérifiez ls -l /run/php-fpm/www.sock et lisez /var/log/nginx/error.log. Si le journal indique Permission denied sur le socket, cherchez un refus AVC avec ausearch.

403 Forbidden ou Permission denied. Vérifiez le propriétaire (nginx:nginx) et l'étiquette SELinux avec ls -Z /var/www/example.com/public. Elle doit être httpd_sys_content_t ; sinon, lancez restorecon -Rv.

« File not found. » ou page blanche. Le chemin root ou la ligne SCRIPT_FILENAME est incorrect. Contrôlez les deux, puis nginx -t.

Impossible de joindre une base ou une API externe. SELinux bloque par défaut les connexions sortantes : activez httpd_can_network_connect_db ou httpd_can_network_connect comme indiqué plus haut.


🎉 Nginx, MariaDB et PHP-FPM tournent sur AlmaLinux 9, avec SELinux toujours en mode enforcing.

Restez à jour avec les dernières offres, réductions et promotions spéciales.

Voir les promotions

Nous utilisons des cookies

Nous utilisons des cookies analytiques pour améliorer votre expérience sur notre site. Aucune donnée n'est revendue à des tiers. En savoir plus dans notre politique de confidentialité.