Instalar Moodle 3.2 en CentOS 7 con Nginx, PHP-FPM y MariaDB

Resumen rápido de la intención
- Objetivo principal: instalar y dejar operativo Moodle 3.2 en CentOS 7 con pila Nginx + PHP-FPM + MariaDB.
- Variantes relacionadas: instalación con Apache, uso de Docker/containers, instalación en Ubuntu/Debian, migración a versiones más recientes de Moodle, uso de Let’s Encrypt para SSL.
Requisitos previos
- Servidor CentOS 7 con acceso root o usuario con privilegios sudo.
- Conexión a Internet para descargar paquetes y repositorios.
- Dominio apuntando a la IP del servidor (recomendado, aunque la guía muestra ejemplo con moodle.hakase-labs.com).
Important: En entornos de producción use contraseñas seguras y certificados válidos (Let’s Encrypt o CA de confianza).
Qué haremos
- Instalar Nginx
- Instalar y configurar PHP-FPM 7.0
- Instalar y configurar MariaDB
- Descargar y configurar Moodle
- Configurar SSL y host virtual en Nginx
- Ajustar SELinux y Firewalld
- Ejecutar la instalación de Moodle vía web
- Probar la instalación
Paso 1 - Instalar Nginx
Instalaremos Nginx desde el repositorio EPEL, ya que CentOS 7 no lo incluye por defecto.
Instale el repositorio EPEL:
yum -y install epel-release
Instale Nginx:
yum -y install nginx
Inicie y habilite el servicio para que arranque en el inicio:
systemctl start nginx
systemctl enable nginx
Verifique que Nginx esté escuchando en el puerto 80 con netstat:
netstat -plntu
Si no tiene netstat, instale net-tools:
yum -y install net-tools
Notas: si prefiere usar módulos de Nginx adicionales o una versión concreta, puede compilar desde la fuente o usar repositorios de terceros, pero en esta guía usamos la versión del EPEL por simplicidad y estabilidad.
Paso 2 - Instalar y configurar PHP-FPM
Moodle 3.2 soporta PHP 7.0; usaremos PHP-FPM 7.0 desde el repositorio webtatic.
Añada el repositorio webtatic:
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
Instale PHP-FPM y las extensiones necesarias para 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
Edite la configuración php.ini:
vim /etc/php.ini
Descomente y establezca:
cgi.fix_pathinfo=0
Edite la configuración de PHP-FPM (pool www):
cd /etc/php-fpm.d/
vim www.conf
Cambie usuario y grupo a nginx:
user = nginx
group = nginx
Use un socket en lugar de puerto para comunicar Nginx con PHP-FPM:
listen = /run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Permita sólo .php:
security.limit_extensions = .php
Descomente variables de entorno útiles:
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
Cree directorio de sesiones y ajuste permisos:
mkdir -p /var/lib/php/session/
chown -R nginx:nginx /var/lib/php/session/
chown -R nginx:nginx /run/php-fpm/
Inicie y habilite PHP-FPM:
systemctl start php-fpm
systemctl enable php-fpm
Verifique socket:
netstat -lx | grep php-fpm.sock
Notas de estilo: usar socket mejora seguridad y rendimiento local. Si necesita escalado horizontal con varios hosts PHP use TCP y con balanceador.
Paso 3 - Instalar y configurar MariaDB
Usaremos MariaDB como motor de base de datos. Instalaremos el paquete desde el repositorio de CentOS.
yum -y install mariadb-server mariadb
Edite /etc/my.cnf y añada en la sección [mysqld]:
default_storage_engine = innodb
innodb_file_per_table = 1
innodb_file_format = Barracuda
Inicie y habilite MariaDB:
systemctl start mariadb
systemctl enable mariadb
Asegure la instalación y establezca contraseña root:
mysql_secure_installation
Siga las preguntas interactivas y responda afirmativamente salvo que tenga una razón para no hacerlo. Luego cree la base de datos y el usuario para Moodle. Conéctese al shell MySQL:
mysql -u root -p
# TYPE YOUR PASSWORD
Ejecute estas consultas (reemplace la contraseña por una segura):
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: cambie ‘hakaselabs123’ por una contraseña robusta en entornos reales.
Paso 4 - Descargar y configurar Moodle
Instale git y clone el repositorio oficial:
yum -y install git
mkdir -p /var/www/
cd /var/www/
git clone https://github.com/moodle/moodle.git
Vaya al directorio y liste ramas para escoger la estable 3.2:
cd moodle/
git branch -a
Para seleccionar la rama estable 3.2:
git branch --track MOODLE_32_STABLE origin/MOODLE_32_STABLE
git checkout MOODLE_32_STABLE
Verifique el estado:
git status
Debería ver:
# On branch MOODLE_32_STABLE
nothing to commit, working directory clean
Cree el directorio moodledata y ajuste permisos:
mkdir -p /var/moodledata
chown -R nginx:nginx /var/moodledata
chmod 777 /var/moodledata
chown -R nginx:nginx /var/www/moodle
chmod 755 /var/www/moodle
Nota: chmod 777 en /var/moodledata es permisivo; en producción prefiera permisos más restrictivos y que el propietario sea el usuario del servidor web.
Paso 5 - Configurar SSL y host virtual
Para HTTPS puede usar certificados de CA (recomendado) o uno auto-firmado para pruebas. Ejemplo con certificado auto-firmado:
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
Cree el archivo de virtual host en /etc/nginx/conf.d/moodle.conf:
cd /etc/nginx/
vim conf.d/moodle.conf
Pegue la configuración de ejemplo (se muestra la configuración básica necesaria):
# 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;
}
}
}
Valide la configuración y reinicie Nginx:
nginx -t
systemctl restart nginx
Notas: sustituya moodle.hakase-labs.com por su dominio. Para producción cambie ssl_protocols y cipher list por políticas modernas y habilite OCSP stapling.
Paso 6 - Configurar SELinux y Firewalld
Compruebe el estado de SELinux:
sestatus
Si SELinux está activo y en modo Enforcing, instale las utilidades y ajuste contextos:
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/'
Instale y configure firewalld si no está presente:
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
Notas: si gestiona el tráfico con un firewall externo, abra sólo los puertos necesarios y limite acceso administrativo a direcciones IP de confianza.
Paso 7 - Instalar Moodle vía web
Con todo preparado, abra un navegador y visite el dominio configurado, por ejemplo:
https://moodle.hakase-labs.com
Siga el asistente: elija idioma, confirme rutas (web address, moodledir, moodledata), seleccione motor de base de datos (MySQL/MariaDB) y proporcione credenciales.
Ejemplos de pantalla (traducciones de las etiquetas en la interfaz web):
En la sección de base de datos use los datos creados previamente:
- Host: localhost
- Nombre BD: moodledb
- Usuario BD: moodleuser
- Contraseña BD: hakaselabs123 (reemplace por una segura)
- Prefijo: moodle_
- Puerto: 3306
- Socket Unix: /var/lib/mysql/mysql.sock
Acepte la licencia y siga hasta que el instalador verifique requisitos PHP. Asegúrese de que todas las extensiones necesarias aparezcan como OK.
Complete la creación del usuario administrador y la configuración de la página principal.
Al finalizar debería llegar al panel de administrador de Moodle.
Paso 8 - Pruebas y verificación
Visite varias páginas para comprobar que todo responde por HTTPS:
- Página principal: https://moodle.hakase-labs.com
- Página de inicio de sesión: https://moodle.hakase-labs.com/login/
La instalación ha sido completada si puede iniciar sesión como administrador, crear un curso de prueba y cargar archivos en moodledata.
Buenas prácticas de seguridad (lista breve)
- Use certificados TLS válidos (Let’s Encrypt para entornos públicos).
- Desactive versiones TLS obsoletas (evite TLSv1 y TLSv1.1 en producción).
- Aplique actualizaciones de seguridad del sistema y de Moodle con regularidad.
- Restrinja permisos de archivos (no use 777 salvo en pruebas locales).
- Habilite copias de seguridad periódicas de base de datos y moodledata.
- Limite el acceso a puertos administrativos con listas blancas de IP y SSH key.
Checklist de despliegue (SOP condensed)
- Actualice CentOS y paquetes: yum update -y
- Instale EPEL y Nginx, verifique servicio.
- Añada repositorio webtatic e instale PHP-FPM y extensiones.
- Configure php.ini y pool PHP-FPM (usuario nginx, socket).
- Instale MariaDB, configure innodb, asegure root y cree BD/usuario.
- Clone Moodle, prepare /var/moodledata y permisos.
- Configure Nginx con SSL y pruebe nginx -t.
- Ajuste SELinux y firewalld según política.
- Complete instalación web de Moodle y pruebe login.
- Configurar backups automáticos y monitorización.
Criterios de aceptación
- La página de inicio carga por HTTPS sin errores de certificado (en producción).
- Inicio de sesión con el usuario admin funciona y permite crear un curso.
- Moodle puede escribir en /var/moodledata y procesar cargas de archivos.
- Todas las extensiones PHP requeridas aparecen como OK en el instalador.
- La base de datos moodledb responde y el usuario moodleuser tiene permisos.
Casos de prueba básicos
- Crear curso: el sistema crea el curso y aparece en la lista.
- Subida de archivo: subir un archivo grande (ej. 20 MB) y comprobar almacenamiento en moodledata.
- Cron de Moodle: ejecutar cron.php y comprobar que no muestra errores.
- Inicio de sesión simultáneo: 10 usuarios concurrentes intentan iniciar sesión sin caídas.
Comando cron manual:
php /var/www/moodle/admin/cli/cron.php
Solución de problemas comunes
- Error: “Missing PHP extension” — instale la extensión faltante y reinicie php-fpm.
- Error 502 Bad Gateway — verifique que php-fpm está corriendo y que el socket /run/php-fpm/php-fpm.sock existe y tiene permisos nginx.
- Problema de permisos con moodledata — ajuste contextos SELinux y propiedad de archivos a nginx.
- Problemas SSL — valide rutas de ssl_certificate y ssl_certificate_key, y permisos (600 para clave privada).
Alternativas y migración
- Apache + mod_php: opción válida si ya domina Apache o necesita .htaccess.
- Docker/Containers: utilice imágenes oficiales o community para despliegues reproducibles.
- Distribuciones Debian/Ubuntu: mismos pasos pero use apt y repositorios PHP (ondrej/php) o paquetes oficiales.
- Migración desde Moodle antiguo: realice copia de seguridad completa, verifique compatibilidad de plugins y convierta base de datos según guía oficial.
Notas de privacidad y GDPR
- Si procesa datos personales de alumnos, documente tratamiento y base legal.
- Active TLS para todas las conexiones de usuarios.
- Minimice retención de datos no necesarios y configure políticas de privacidad y eliminación.
- Considere cifrado a nivel de disco y copias de seguridad cifradas si maneja datos sensibles.
Caja de facts (datos clave)
- Versión objetivo: Moodle 3.2
- Sistema operativo: CentOS 7
- Webserver: Nginx
- PHP: 7.0 (PHP-FPM)
- Base de datos: MariaDB
- Puertos usados: 80 (HTTP), 443 (HTTPS), 3306 (MariaDB)
- Rutas importantes: /var/www/moodle, /var/moodledata, /etc/nginx/ssl/
Snippets y comandos útiles (hoja rápida)
- Revisar logs Nginx:
journalctl -u nginx -f
cat /var/log/nginx/error.log
- Revisar logs PHP-FPM:
journalctl -u php-fpm -f
cat /var/log/php-fpm/error.log
- Comprobar conexión a DB:
mysql -u moodleuser -p -D moodledb -h localhost
- Respaldar base de datos:
mysqldump -u root -p moodledb > moodledb-$(date +%F).sql
Roles y responsabilidades (checklist por rol)
- Administrador de sistema: instalar y parchear OS, configurar Nginx, PHP-FPM, MariaDB, SELinux y firewall.
- Administrador Moodle: crear cursos, gestionar usuarios, instalar plugins desde interfaz.
- Responsable de seguridad: gestionar certificados, auditorías, control de accesos.
- Backup & recovery: probar restauración periódica de BD y moodledata.
Resumen final
Has instalado Moodle 3.2 en CentOS 7 sobre una pila Nginx + PHP-FPM 7.0 y MariaDB. La guía ofrece comandos exactos, configuración de SELinux/Firewalld y buenas prácticas. En producción reemplace certificados auto-firmados, use contraseñas robustas y aplique políticas de actualización y backup.
Notas finales: revise regularmente la documentación oficial de Moodle para parches y requisitos de versiones. La referencia utilizada: https://docs.moodle.org/32/en/RedHat_Linux_installation
Anuncio corto (para comunicación interna, 100–200 palabras):
He desplegado una instancia funcional de Moodle 3.2 sobre CentOS 7 con Nginx, PHP-FPM 7.0 y MariaDB. El sitio está accesible por HTTPS (certificado auto-firmado en pruebas) y cuenta con directorio de datos separado (/var/moodledata). Se aplicaron contextos SELinux y reglas de Firewalld. Próximos pasos: instalar certificado TLS válido, endurecer TLS y probar restauración desde backup. Para acceso administrativo, utilice el usuario creado durante la instalación y cambie la contraseña por una segura.
Referencias:
Materiales similares

Ajustar barras de desplazamiento en Windows 10 y 11

Actualizaciones automáticas en Ubuntu 16.04

Restringir permisos de apps en Android

Instalar Chef Server en Ubuntu 17.04

Solución al error 500 de Microsoft Teams
