LEMP Stack sur Rocky Linux 9
Installation de Nginx + MariaDB + PHP 8.2 sur Rocky Linux 9.
| Composant | Version |
|---|---|
| Rocky Linux | 9.x |
| Nginx | 1.20+ |
| MariaDB | 10.11 |
| PHP | 8.2 (Remi) |
Durée estimée : 30 minutes
Prérequis
- Rocky Linux 9 minimal installé
- Accès root ou sudo
- Connexion Internet
1. Mise à jour du système
2. Installation de Nginx
# Installer Nginx
dnf install -y nginx
# Activer et démarrer
systemctl enable --now nginx
# Vérifier
systemctl status nginx
nginx -v
Firewall
# Ouvrir HTTP/HTTPS
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
3. Installation de MariaDB
# Installer MariaDB 10.11
dnf install -y mariadb-server mariadb
# Activer et démarrer
systemctl enable --now mariadb
# Sécurisation
mariadb-secure-installation
Réponses recommandées :
| Question | Réponse |
|---|---|
| Switch to unix_socket authentication | n |
| Change root password | Y |
| Remove anonymous users | Y |
| Disallow root login remotely | Y |
| Remove test database | Y |
| Reload privilege tables | Y |
4. Installation de PHP 8.2
Activer le dépôt Remi
# Installer EPEL et Remi
dnf install -y epel-release
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
# Activer PHP 8.2
dnf module reset php -y
dnf module enable php:remi-8.2 -y
Installer PHP-FPM
# Packages PHP essentiels
dnf install -y php php-fpm php-mysqlnd php-opcache php-gd php-xml php-mbstring php-json php-curl php-zip php-intl
# Vérifier la version
php -v
Configurer PHP-FPM pour Nginx
Modifier :
; Changer l'utilisateur
user = nginx
group = nginx
; Utiliser socket Unix (plus performant)
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
5. Configuration de Nginx pour PHP
Configuration globale
Vérifier dans le bloc http :
Virtual Host par défaut
server {
listen 80;
listen [::]:80;
server_name _;
root /var/www/html;
index index.php index.html index.htm;
# Logs
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Fichiers statiques
location / {
try_files $uri $uri/ =404;
}
# PHP via FPM
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Sécurité - bloquer .htaccess
location ~ /\.ht {
deny all;
}
# Sécurité - bloquer fichiers cachés
location ~ /\. {
deny all;
}
}
Vérifier et recharger
6. Test de l'installation
Permissions du dossier web
# Créer le dossier si nécessaire
mkdir -p /var/www/html
# Permissions
chown -R nginx:nginx /var/www/html
chmod -R 755 /var/www/html
Page de test PHP
Tester
Sécurité
Supprimer info.php après les tests : rm /var/www/html/info.php
7. Test de connexion PHP-MariaDB
cat > /var/www/html/test-db.php << 'EOF'
<?php
$host = 'localhost';
$user = 'root';
$pass = 'VOTRE_MOT_DE_PASSE';
try {
$pdo = new PDO("mysql:host=$host", $user, $pass);
echo "Connexion MariaDB réussie!\n";
echo "Version: " . $pdo->query('SELECT VERSION()')->fetchColumn() . "\n";
} catch (PDOException $e) {
echo "Erreur: " . $e->getMessage() . "\n";
}
EOF
8. Virtual Host personnalisé
Créer un site
# Structure
mkdir -p /var/www/monsite.local/public
chown -R nginx:nginx /var/www/monsite.local
# Page d'accueil
echo '<?php echo "Bienvenue sur monsite.local!"; ?>' > /var/www/monsite.local/public/index.php
Configuration Nginx
server {
listen 80;
listen [::]:80;
server_name monsite.local www.monsite.local;
root /var/www/monsite.local/public;
index index.php index.html;
access_log /var/log/nginx/monsite.local.access.log;
error_log /var/log/nginx/monsite.local.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\. {
deny all;
}
}
9. SELinux
# Autoriser Nginx à se connecter au réseau (pour PHP-FPM, bases de données)
setsebool -P httpd_can_network_connect 1
setsebool -P httpd_can_network_connect_db 1
# Contexte pour les fichiers web
semanage fcontext -a -t httpd_sys_content_t "/var/www(/.*)?"
restorecon -Rv /var/www
10. Optimisation PHP-FPM
; Pool de processus
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
11. Optimisation Nginx
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
http {
# Buffers
client_body_buffer_size 16k;
client_max_body_size 64m;
# Timeouts
client_body_timeout 60;
client_header_timeout 60;
keepalive_timeout 65;
send_timeout 60;
# Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;
# Cache fichiers statiques
open_file_cache max=10000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
include /etc/nginx/conf.d/*.conf;
}
Vérification finale
# Services actifs
systemctl is-active nginx php-fpm mariadb
# Ports en écoute
ss -tlnp | grep -E ':(80|443|3306)'
# Versions
nginx -v
php -v
mariadb --version
Dépannage
| Problème | Solution |
|---|---|
| 502 Bad Gateway | Vérifier PHP-FPM : systemctl status php-fpm |
| Permission denied | Vérifier utilisateur PHP-FPM et permissions |
| SELinux bloque | setsebool -P httpd_can_network_connect 1 |
| Socket non trouvé | Vérifier listen dans /etc/php-fpm.d/www.conf |
Changelog
| Date | Modification |
|---|---|
| 2024-12 | Création initiale |