Installare Moodle 3.2 su CentOS 7 con Nginx, PHP-FPM 7.0 e MariaDB

Questo tutorial spiega passo passo come installare Moodle 3.2 su CentOS 7 usando Nginx come web server, PHP-FPM 7.0 e MariaDB come database. Include comandi pratici, configurazioni di SELinux e firewalld, creazione del virtual host HTTPS (self-signed o Let’s Encrypt), suggerimenti di sicurezza, test e procedure di backup e manutenzione.
Important: scegli password sicure per il database e per l’account amministratore di Moodle. Questo tutorial usa esempi didattici che devono essere adattati per produzione.
Per chi è questa guida
- Amministratori di sistema che devono installare Moodle su server CentOS 7.
- Docenti che vogliono comprendere l’architettura server di Moodle.
- Team DevOps che cercano una checklist completa per rollout e hardening.
Varianti di intento correlate
- Installare Moodle su CentOS 7 con Apache e MariaDB
- Moodle con Nginx e PHP-FPM in produzione
- Configurare PHP 7 per Moodle
- Hardening di Moodle su Linux
- Backup e ripristino di Moodle
Sommario dell’articolo
- Requisiti e terminologia essenziale
- Installazione e configurazione di Nginx
- Installazione e configurazione di PHP-FPM 7.0
- Installazione e configurazione di MariaDB
- Download e preparazione di Moodle
- Virtual host HTTPS e certificati
- SELinux e firewalld
- Installazione via web installer
- Test e verifica
- Sicurezza e hardening
- Backup, monitoraggio e manutenzione
- Troubleshooting e casi limite
- Checklist per ruoli
- FAQ e risorse
1. Requisiti e terminologia essenziale
Prerequisiti minimi
- Server CentOS 7 aggiornato
- Accesso root o sudo
- Connettività per scaricare pacchetti e git
- Nome DNS o indirizzo IP pubblico (per HTTPS usare un dominio valido)
Definizioni rapide
- Moodle: piattaforma LMS open source scritta in PHP.
- Nginx: web server leggero e reverse proxy.
- PHP-FPM: FastCGI Process Manager per PHP.
- MariaDB: fork di MySQL, usato come database per Moodle.
Nota sulla versione
Questa guida è orientata a Moodle 3.2 e PHP 7.0 come nell’esempio originale. Molte procedure valgono anche per versioni successive, ma verificare sempre i requisiti ufficiali di Moodle prima dell’aggiornamento.
2. Installare Nginx
Nginx non è incluso nel repository base di CentOS 7, quindi usiamo EPEL.
Installare EPEL e Nginx:
yum -y install epel-release
yum -y install nginx
Avviare e abilitare Nginx:
systemctl start nginx
systemctl enable nginx
Verificare porte aperte (netstat è comodo; installare net-tools se necessario):
netstat -plntu
yum -y install net-tools
Note pratiche
- Se netstat non è disponibile, usare ss -tulpen.
- Verificare che SELinux o firewall non blocchino la porta 80/443.
3. Installare e configurare PHP-FPM 7.0
Moodle 3.2 è compatibile con PHP 7.0; su CentOS 7 spesso serve un repository esterno (es. webtatic).
Aggiungere il repository webtatic:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Installare PHP-FPM 7.0 e le estensioni richieste da Moodle:
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
Modifiche chiave a /etc/php.ini
- Impostare cgi.fix_pathinfo=0 per sicurezza.
- Controllare memory_limit, max_execution_time e post_max_size secondo il carico previsto.
vim /etc/php.ini
# Cerca e modifica:
cgi.fix_pathinfo=0
Configurare php-fpm pool (www.conf):
cd /etc/php-fpm.d/
vim www.conf
Cambi rilevanti:
user = nginx
group = nginx
listen = /run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
security.limit_extensions = .php
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Creare directory per sessioni PHP e impostare permessi:
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/
chown -R nginx:nginx /run/php-fpm/
Avviare PHP-FPM:
systemctl start php-fpm
systemctl enable php-fpm
Verificare socket:
netstat -lx | grep php-fpm.sock
Suggerimenti di tuning PHP-FPM
- Per siti con molti utenti contemporanei regolare pm = dynamic/static, pm.max_children, pm.start_servers.
- Abilitare opcache e verificare configuratione opcache.memory_consumption.
4. Installare e configurare MariaDB
Installare MariaDB:
yum -y install mariadb-server mariadb
Aggiungere impostazioni InnoDB in /etc/my.cnf (se non già presenti):
vim /etc/my.cnf
# Alla fine della sezione [mysqld]
default_storage_engine = innodb
innodb_file_per_table = 1
innodb_file_format = Barracuda
Avviare MariaDB:
systemctl start mariadb
systemctl enable mariadb
Eseguire mysql_secure_installation per impostare la password di root e rimuovere account pericolosi:
mysql_secure_installation
Creare database e utente per Moodle (usare password sicura):
mysql -u root -p
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';
FLUSH PRIVILEGES;
Security note
- Non usare password di esempio in produzione. Considerare autenticazione tramite socket per accesso locale sicuro.
- Valutare cifratura a riposo e backup cifrati per dati sensibili.
5. Scaricare e preparare Moodle
Installare git e clonare repository ufficiale:
yum -y install git
mkdir -p /var/www/
cd /var/www/
git clone https://github.com/moodle/moodle.git
Selezionare ramo stabile per Moodle 3.2:
cd /var/www/moodle
git branch -a
git checkout MOODLE_32_STABLE
git status
Creare la directory moodledata e impostare permessi corretti:
mkdir -p /var/moodledata
chown -R nginx:nginx /var/moodledata
chmod 770 /var/moodledata
chown -R nginx:nginx /var/www/moodle
chmod 755 /var/www/moodle
Nota: evitare 777 in produzione. Privilegi più restrittivi riducono il rischio.
6. Configurare HTTPS e virtual host Nginx
Creare certificato self-signed (esempio) o usare Let’s Encrypt per produzione.
Self-signed:
mkdir -p /etc/nginx/ssl/
openssl req -new -x509 -days 365 -nodes -out /etc/nginx/ssl/moodle.crt -keyout /etc/nginx/ssl/moodle.key
chmod 600 /etc/nginx/ssl/moodle.key
Creare file di configurazione Nginx in /etc/nginx/conf.d/moodle.conf:
cd /etc/nginx/
vim conf.d/moodle.conf
Esempio di configurazione Nginx (adattare server_name):
# PHP Upstream Handler
upstream php-handler {
server unix:/run/php-fpm/php-fpm.sock;
}
server {
listen 80;
server_name moodle.hakase-labs.com;
return 301 https://$server_name$request_uri;
}
server {
server_name moodle.hakase-labs.com;
listen *:443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/nginx/ssl/moodle.crt;
ssl_certificate_key /etc/nginx/ssl/moodle.key;
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;
}
}
}
Verificare la configurazione e riavviare Nginx:
nginx -t
systemctl restart nginx
Se si desidera usare Let’s Encrypt con certbot (consigliato per produzione):
yum -y install certbot-nginx
certbot --nginx -d moodle.tuodominio.example
Consigli SSL
- Preferire TLS 1.2+ e suite moderne; aggiornare la direttiva ssl_protocols.
- Abilitare HSTS e valutare OCSP stapling.
7. Configurare SELinux e Firewalld
Controllare stato SELinux:
sestatus
Se SELinux è Enforcing, impostare contesti coerenti:
yum -y install policycoreutils-python
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/'
Installare e configurare firewalld:
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all
Note SELinux e permessi
- Se riscontri 403 o errori di scrittura, verifica audit log (/var/log/audit/audit.log) e usa audit2allow per diagnosticare.
- Evita di disabilitare SELinux in produzione; correggi i contesti.
8. Installare Moodle tramite interfaccia web
Aprire il browser e puntare al dominio configurato (nell’esempio moodle.hakase-labs.com). Seguire il setup web:
- Scegli lingua
- Conferma percorso web root (/var/www/moodle) e moodledata (/var/moodledata)
- Seleziona driver database MySQL (MariaDB)
- Inserire credenziali DB e socket/porta: host localhost, nome moodledb, utente moodleuser, password, porta 3306, socket /var/lib/mysql/mysql.sock
Verificare che tutte le estensioni PHP richieste risultino OK. Compilare i dettagli admin e la configurazione della homepage.
Se l’installazione si completa senza errori vedrai la dashboard amministrativa.
9. Test e verifica
Pagine chiave da testare:
- Homepage: https://moodle.hakase-labs.com
- Login: https://moodle.hakase-labs.com/login/
- Dashboard amministrazione
Controlli funzionali
- Login con utente admin
- Creazione corso di prova e upload file
- Invio attività di prova e download
10. Sicurezza e hardening
Checklist di hardening rapido
- Usare HTTPS con certificato valido (Let’s Encrypt o commerciale).
- Limitare accesso SSH con chiavi e change porta se necessario.
- Applicare aggiornamenti regolari OS e PHP/Moodle.
- Disabilitare plugin non necessari di Moodle.
- Impostare permessi file stretti (non 777).
- Effettuare backup regolari del DB e della directory moodledata.
Configurazioni consigliate
- Impostare Strict-Transport-Security header:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
- Limitare upload file a tipi consentiti e dimensione massima.
- Abilitare autenticazione a due fattori per gli account amministrativi tramite plugin ufficiale.
Privacy e GDPR
- Informare gli utenti su raccolta dati e utilizzo dei cookie.
- Se memorizzi dati sensibili, considera cifratura e minimizzazione dei dati.
- Fornire meccanismi per esportare o rimuovere dati utente su richiesta.
11. Backup, monitoraggio e manutenzione
Strategia di backup minima
- Backup giornaliero del database (mysqldump) con conservazione rotativa.
- Backup della directory moodledata e della directory del codice (var/www/moodle).
- Conservare backup in location offsite e monitorarne l’integrità.
Esempio semplice di dump giornaliero:
#!/bin/bash
BACKUP_DIR=/backup/moodle
mkdir -p $BACKUP_DIR/$(date +%F)
mysqldump -u root -p'ROOTPASS' moodledb > $BACKUP_DIR/$(date +%F)/moodledb.sql
rsync -a /var/moodledata $BACKUP_DIR/$(date +%F)/
Monitoraggio
- Abilitare monitor per processi PHP-FPM, Nginx, MariaDB.
- Utilizzare strumenti come Prometheus + Grafana o Zabbix per metriche.
- Controllare log di errore Nginx (/var/log/nginx/error.log) e log PHP-FPM.
Manutenzione
- Programmare manutenzione per aggiornamenti di Moodle (usare modalità manutenzione in Moodle admin).
- Testare patch in staging prima di applicarle in produzione.
12. Troubleshooting e casi limite
Errore 403 dopo aver impostato permessi
- Verificare SELinux con getenforce e cercare voci in audit.log. Applicare restorecon e semanage fcontext come mostrato.
Errori PHP o mancanza estensioni
- Controllare php -v e php -m, e i log PHP-FPM.
- Installare estensioni mancanti (gd, intl, mbstring, xml, xmlrpc ecc.).
Problemi con socket PHP-FPM
- Se fastcgi_pass non trova il socket, controllare che /run/php-fpm/php-fpm.sock esista e appartenga a nginx: nginx.
- In alternativa configurare PHP-FPM per ascoltare su TCP 127.0.0.1:9000 e aggiornare fastcgi_pass.
Errori DB: accesso negato
- Controllare utente DB, host e password. Verificare che l’utente sia definito per ‘localhost’ o ‘%’ secondo necessità.
Performance degradata
- Abilitare opcache e regolare parametri PHP-FPM.
- Usare caching lato Moodle (Redis/Memcached) per sessioni e cache delle pagine.
13. Checklist per ruoli
Checklist: Amministratore di sistema
- Aggiornare CentOS e pacchetti
- Configurare firewall e SELinux
- Implementare certificati HTTPS
- Gestire backup e disaster recovery
- Monitoraggio e alerting
Checklist: Amministratore Moodle
- Configurare categorie e corsi di prova
- Installare plugin necessari e verificarne sicurezza
- Configurare autenticazione esterna (LDAP/SAML) se necessario
- Testare ruoli e permessi
Checklist: Docente
- Creare corso, attività e valutazioni
- Caricare materiali e verificare accessibilità
- Testare flussi di consegna compiti
14. Mini metodologia di rilascio e rollback
Fasi di rilascio
- Ambiente di staging con mirror identico alla produzione
- Test funzionali e di carico su staging
- Backup completo prima del deploy
- Modalità manutenzione su produzione e deploy
- Verifica post-deploy e disattivare modalità manutenzione
Rollback rapido
- Ripristinare dump DB precedente e sincronizzare moodledata dalla copia di backup.
- Documentare tempi RTO/RPO e testare procedure di restore regolarmente.
15. Domande frequenti
Quali sono i permessi corretti per moodledata?
Impostare proprietario nginx:nginx e permessi restrittivi (es. 770) evitando 777.
Posso usare Apache invece di Nginx?
Sì. Le istruzioni variano per il virtual host e la configurazione FastCGI; Apache con mod_php o mpm_event + PHP-FPM è supportato.
Come aggiornare Moodle in produzione?
Eseguire backup DB e moodledata, testare l’aggiornamento in staging, applicarlo in manutenzione e verificare notifiche di aggiornamento plugin.
16. Risorse utili
- Documentazione ufficiale Moodle: https://docs.moodle.org/32/en/RedHat_Linux_installation
- Documentazione CentOS e MariaDB
17. Riepilogo
- Questa guida spiega come installare Moodle 3.2 su CentOS 7 con Nginx, PHP-FPM 7.0 e MariaDB, coprendo installazione, HTTPS, SELinux, firewall, test, sicurezza, backup e troubleshooting.
- Adattare le password e i permessi per ambienti di produzione e pianificare backup e monitoraggio.
Note finali
- Non usare password d’esempio in ambienti reali.
- Testare ogni cambiamento su staging e documentare la configurazione per futuri aggiornamenti.
FAQ
Dove modifico la configurazione della cron di Moodle? Moodle richiede una cron periodica; configurare un job cron (es. ogni minuto) che esegue /usr/bin/php /var/www/moodle/admin/cli/cron.php con utente nginx o www-data a seconda della configurazione.
È necessario Redis o Memcached? Per siti con molti utenti concorrenti, usare Redis o Memcached per sessioni e cache migliora le prestazioni.
Posso usare SELinux permissive? SELinux permissive aiuta il debug, ma non è raccomandato in produzione; meglio correggere i contesti.
Materiali simili

Limitare le autorizzazioni delle app Android

Installare Chef su Ubuntu 17.04

Correggere l'errore 500 di Microsoft Teams

Trovare un broker online affidabile in 6 passaggi

Testo colorato su Discord: guida pratica
