Installer Moodle 3.2 sur CentOS 7 avec Nginx, PHP‑FPM et MariaDB
Ce guide explique pas à pas comment installer Moodle 3.2 sur CentOS 7 en utilisant Nginx, PHP‑FPM 7.0 et MariaDB. Vous trouverez les commandes exactes, la configuration SELinux/Firewalld, la génération d’un certificat SSL auto-signé et des sections pratiques : vérification, dépannage et checklists par rôle.
Important : adaptez les mots de passe et les noms d’hôte à votre environnement en production.
Objectif et variantes d’intention
Objectif principal : installer et configurer Moodle sur CentOS 7 avec une pile Nginx + PHP‑FPM + MariaDB. Variantes d’intention connexes : installer Moodle sur CentOS, configurer PHP‑FPM pour Moodle, sécuriser Moodle (SELinux/Firewalld/SSL), migrer Moodle vers Nginx, installer Moodle avec Docker.
Pré-requis
- Serveur CentOS 7 à jour
- Accès root ou utilisateur avec privilèges sudo
- Connexion internet pour récupérer paquets et code source
- Nom DNS ou hôte pour le serveur (ex. moodle.votre-domaine.tld)
Remarque : les commandes utilisent yum et systemctl et supposent un accès shell avec sudo ou root.
Aperçu des étapes
- Installer Nginx
- Installer et configurer PHP‑FPM 7.0
- Installer et configurer MariaDB
- Télécharger et préparer Moodle
- Configurer SSL et hôte virtuel Nginx
- Configurer SELinux et Firewalld
- Lancer l’installation via l’interface web
- Tester et vérifier l’installation
Définitions rapides
- PHP‑FPM : FastCGI Process Manager pour PHP, gère les processus PHP en dehors du serveur web.
- SELinux : module de sécurité renforçant le contrôle d’accès.
- Firewalld : gestionnaire de pare-feu dynamique pour zones et services.
Étape 1 - Installer Nginx
Nginx n’est pas fourni par défaut dans les dépôts CentOS. Nous utilisons le dépôt EPEL.
Installez le dépôt EPEL :
yum -y install epel-releaseInstallez Nginx :
yum -y install nginxDémarrez et activez Nginx pour qu’il démarre au boot :
systemctl start nginx
systemctl enable nginxVérifiez que Nginx écoute sur le port 80 :
netstat -plntu
Si netstat n’est pas installé :
yum -y install net-toolsNote : sur des systèmes récents, vous pouvez également utiliser ss -tulpen.
Étape 2 - Installer et configurer PHP‑FPM
Moodle 3.2 fonctionne avec PHP 7.0. Le dépôt Webtatic fournit les paquets PHP 7.0 pour CentOS 7.
Ajoutez le dépôt Webtatic :
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpmInstallez PHP‑FPM et les extensions requises :
yum install -y graphviz aspell php70w-fpm php70w-cli php70w-pspell php70w-curl php70w-gd php70w-intl php70w-mysql php70w-xml php70w-xmlrpc php70w-ldap php70w-zip php70w-json php70w-opcache php70w-readline php70w-mbstring php70w-soapÉditez la configuration PHP globale :
vim /etc/php.iniRecherchez et modifiez :
cgi.fix_pathinfo=0Ce réglage évite que PHP ne tente de traiter des chemins ambigus — important côté sécurité.
Configurez PHP‑FPM :
cd /etc/php-fpm.d/
vim www.confModifiez les lignes suivantes pour que PHP‑FPM s’exécute sous l’utilisateur et le groupe nginx :
user = nginx
group = nginxUtilisez un socket Unix pour la communication entre Nginx et PHP‑FPM :
listen = /run/php-fpm/php-fpm.sockDécommentez et adaptez la propriété du socket :
listen.owner = nginx
listen.group = nginx
listen.mode = 0660Limitez les extensions traitées par PHP :
security.limit_extensions = .phpDécommentez les variables d’environnement utiles :
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmpCréez le répertoire de sessions et fixez les permissions :
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/Assurez-vous que le répertoire du socket existe et appartient à nginx :
chown -R nginx:nginx /run/php-fpm/Démarrez et activez PHP‑FPM :
systemctl start php-fpm
systemctl enable php-fpmVérifiez le socket :
netstat -lx | grep php-fpm.sockConseil : si le socket n’apparaît pas, consultez les logs systemd : journalctl -u php-fpm -e.
Étape 3 - Installer et configurer MariaDB
Nous utilisons MariaDB comme serveur de base de données. Installez les paquets :
yum -y install mariadb-server mariadbÉditez /etc/my.cnf et ajoutez dans la section [mysqld] :
default_storage_engine = innodb
innodb_file_per_table = 1
innodb_file_format = BarracudaDémarrez et activez le service :
systemctl start mariadb
systemctl enable mariadbSécurisez l’installation MySQL/MariaDB :
mysql_secure_installationRépondez aux questions pour définir un mot de passe root et supprimer les comptes anonymes et la base test.
Créez la base de données et l’utilisateur pour Moodle. Remplacez les mots de passe avant usage en production.
Connectez‑vous :
mysql -u root -pPuis :
CREATE DATABASE moodledb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
GRANT ALL PRIVILEGES ON moodledb.* TO 'moodleuser'@'localhost' IDENTIFIED BY 'hakaselabs123';
FLUSH PRIVILEGES;
Important : choisissez des mots de passe forts et stockez‑les dans un gestionnaire de secrets.
Étape 4 - Télécharger et préparer Moodle
Installez git :
yum -y install gitCréez le répertoire web root et clonez Moodle :
mkdir -p /var/www/
cd /var/www/
git clone https://github.com/moodle/moodle.gitChoisissez la branche stable 3.2 :
cd moodle/
git branch -a
# Exemple pour suivre la branche stable 3.2
git branch --track MOODLE_32_STABLE origin/MOODLE_32_STABLE
git checkout MOODLE_32_STABLEVérifiez l’état :
git statusVous devriez voir :
# On branch MOODLE_32_STABLE
# nothing to commit, working directory clean
Créez le répertoire moodledata et fixez les permissions :
mkdir -p /var/moodledata
chown -R nginx:nginx /var/moodledata
chmod 777 /var/moodledataFixez le propriétaire du code Moodle :
chown -R nginx:nginx /var/www/moodle
chmod 755 /var/www/moodleNote sur permissions : chmod 777 sur moodledata est pratique pour tests locaux. En production, préférez 770 et utilisateur de groupe restreint.
Étape 5 - Configurer SSL et hôte virtuel Nginx
Sur un serveur de production, utilisez un certificat valide (Let’s Encrypt ou CA commerciale). Ici, un certificat auto-signé convient pour tests.
Créez le répertoire SSL et générez le certificat :
mkdir -p /etc/nginx/ssl/
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/moodle.crt -keyout /etc/nginx/ssl/moodle.keySécurisez la clé privée :
chmod 600 /etc/nginx/ssl/moodle.key
Créez un fichier de configuration Nginx pour Moodle :
cd /etc/nginx/
vim conf.d/moodle.confCollez la configuration suivante (adaptez server_name) :
# PHP Upstream Handler
upstream php-handler {
server unix:/run/php-fpm/php-fpm.sock;
}
# Nginx redirect HTTP to HTTPS - moodle.hakase-labs.com
server {
listen 80;
server_name moodle.hakase-labs.com;
# enforce https
return 301 https://$server_name$request_uri;
}
# HTTPS Configuration
server {
server_name moodle.hakase-labs.com;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
# SSL Configuration
ssl on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_session_tickets off;
#ssl_stapling on;
#ssl_stapling_verify on;
resolver_timeout 5s;
ssl_certificate /etc/nginx/ssl/moodle.crt;
ssl_certificate_key /etc/nginx/ssl/moodle.key;
# Root Moodle Data DIrectory
root /var/www/moodle;
rewrite ^/(.*\.php)(/)(.*)$ /$1?file=/$3 last;
location ^~ / {
try_files $uri $uri/ /index.php?q=$request_uri;
index index.php index.html index.htm;
location ~ \.php$ {
include fastcgi.conf;
fastcgi_pass php-handler;
}
}
}Testez la configuration et redémarrez Nginx :
nginx -t
systemctl restart nginxConseil sécurité : la liste des ciphers et protocoles ci-dessus contient TLSv1 et TLSv1.1 qui sont aujourd’hui déconseillés. Sur un serveur public, limitez à TLSv1.2 et TLSv1.3 si disponible.
Étape 6 - Configurer SELinux et Firewalld
Vérifiez l’état de SELinux :
sestatus
Si SELinux est en mode Enforcing, installez les outils si nécessaire :
yum -y install policycoreutils-pythonAjustez les contextes pour les répertoires web et moodledata :
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/moodle(/.*)?'
restorecon -Rv '/var/www/moodle/'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/moodledata(/.*)?'
restorecon -Rv '/var/moodledata/'Ces commandes autorisent les processus HTTPd/Nginx à lire et écrire là où Moodle en a besoin.
Installez et configurez firewalld si requis :
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalldOuvrez les services HTTP/HTTPS/SSH :
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-allNote : adaptez les règles en cas d’utilisation de ports non standards.
Étape 7 - Installer Moodle via l’interface Web
Ouvrez un navigateur et rendez-vous sur l’URL configurée (ex. https://moodle.hakase-labs.com).
Choisissez la langue, indiquez :
- URL du site : moodle.hakase-labs.com
- Répertoire web : /var/www/moodle
- Répertoire moodledata : /var/moodledata
Sélectionnez le pilote de base de données MySQL et renseignez les paramètres :
- hôte : localhost
- base : moodledb
- utilisateur : moodleuser
- mot de passe : hakaselabs123
- préfixe de tables : moodle_
- port : 3306
- socket Unix : /var/lib/mysql/mysql.sock
Continuez, acceptez les mentions de copyright, puis laissez Moodle vérifier les extensions PHP requises.
Si tout est OK, cliquez pour démarrer l’installation automatique. Créez le compte administrateur puis configurez la page d’accueil.
Images d’exemples :








Étape 8 - Tests et vérifications
Visitez la page d’accueil : https://moodle.hakase-labs.com

Page de connexion : https://moodle.hakase-labs.com/login/

Accédez au tableau de bord, aux préférences utilisateur et à la zone d’administration :



L’installation est maintenant terminée.
Bonnes pratiques et sécurité
- Utilisez des certificats TLS valides (Let’s Encrypt automatisé via Certbot). Evitez les certificats auto-signés en production.
- Réduisez la surface d’attaque TLS : désactivez TLSv1 et TLSv1.1, privilégiez TLSv1.2/1.3.
- Sauvegardez régulièrement la base MariaDB et le répertoire moodledata.
- Appliquez les mises à jour de sécurité pour CentOS, PHP, Nginx et Moodle.
- Utilisez des mots de passe robustes et un coffre pour secrets.
Sauvegarde et restauration (mini méthodologie)
- Stoppez les cron/jobs qui écrivent dans Moodle si possible.
- Dump de la base :
mysqldump -u root -p moodledb > moodledb-YYYYMMDD.sql. - Sauvegarde du code :
tar czf moodle-code-YYYYMMDD.tar.gz /var/www/moodle. - Sauvegarde des données :
tar czf moodledata-YYYYMMDD.tar.gz /var/moodledata. - Testez la restauration sur un serveur séparé régulièrement.
Dépannage courant
- Erreur 502 Bad Gateway : vérifiez que php-fpm tourne (
systemctl status php-fpm) et que le socket est accessible (ls -l /run/php-fpm/php-fpm.sock). - Erreur de permissions sur moodledata : vérifiez SELinux et owner/group (nginx:nginx) et contextes
httpd_sys_rw_content_t. - Module PHP manquant : relisez la page de vérification des extensions Moodle et installez le paquet manquant (ex. php70w-intl).
- Problèmes de connexion à la base : testez
mysql -u moodleuser -p -h localhost moodledbdepuis le serveur.
Alternatives et approches différentes
- Apache au lieu de Nginx : si vous préférez mod_php ou prefork, Apache est officiellement pris en charge.
- Installer Moodle via Docker : images officielles Moodle disponibles, pratiques pour test et CI.
- Utiliser une image cloud/marketplace (AWS, Azure) si vous voulez déployer rapidement.
Compatibilité et migration
- Moodle 3.2 cible PHP 7.0 ; vérifier la compatibilité si vous migrez vers une version PHP plus récente.
- Sauvegardez la base et moodledata avant toute migration de version.
- Testez les plugins tiers sur un environnement de préproduction.
Checklist par rôle
Administrateur système
- Installer Nginx, PHP, MariaDB
- Ouvrir ports et configurer SELinux
- Créer comptes système et répertoires
- Mettre en place sauvegardes automatiques
Administrateur Moodle
- Effectuer l’installation web
- Créer comptes admin et vérifier notifications
- Configurer cron jobs (ex. /admin/cli/cron.php)
Formateur
- Créer cours de test
- Importer ressources et vériier droits
- Tester interactions et forums
Critères d’acceptation
- Le site moodle répond sur HTTPS avec certificat valide.
- La page d’accueil s’affiche et la connexion admin fonctionne.
- Les tâches cron de Moodle s’exécutent sans erreurs.
- Les sauvegardes de la base et du répertoire moodledata sont réalisables et restaurables.
Tests d’acceptation
- Tester la création d’un utilisateur, sa connexion et l’accès à un cours.
- Upload d’un fichier via interface enseignant et lecture via étudiant.
- Export d’une sauvegarde de cours et import sur autre instance.
Sécurité supplémentaire
- Forcer HSTS sur domaine principal.
- Installer fail2ban pour limiter les tentatives de login bruteforce.
- Désactiver l’accès direct aux répertoires sensibles via Nginx.
Migration vers une version supérieure
- Lisez la documentation officielle de la version cible.
- Mettez à jour PHP et extensions avant Moodle si nécessaire.
- Mettez à jour les plugins étape par étape et testez.
Glossaire (1 ligne)
- moodledata : répertoire stockant cours, fichiers et uploads séparé du code.
Annexe : commandes utiles récapitulatives
Démarrer/arrêter les services :
systemctl start nginx php-fpm mariadb
systemctl enable nginx php-fpm mariadbVérifier les logs :
journalctl -u nginx -e
journalctl -u php-fpm -e
journalctl -u mariadb -eVérifier la connectivité DB :
mysql -u moodleuser -p -h localhost moodledbRéférence
Fin du guide. Bonne installation et pensez à automatiser les sauvegardes et les mises à jour.
Matériaux similaires
Installer et utiliser Podman sur Debian 11
Guide pratique : apt-pinning sur Debian
OptiScaler : activer FSR 4 dans n'importe quel jeu
Dansguardian + Squid NTLM sur Debian Etch
Corriger l'erreur d'installation Android sur SD