Guía de tecnologías

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

9 min read Tutorial Actualizado 08 Oct 2025
Instalar Moodle 3.2 en CentOS 7 con Nginx
Instalar Moodle 3.2 en CentOS 7 con Nginx

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

  1. Instalar Nginx
  2. Instalar y configurar PHP-FPM 7.0
  3. Instalar y configurar MariaDB
  4. Descargar y configurar Moodle
  5. Configurar SSL y host virtual en Nginx
  6. Ajustar SELinux y Firewalld
  7. Ejecutar la instalación de Moodle vía web
  8. 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

Pantalla de verificación de Nginx en CentOS 7 mostrando puertos abiertos y servicio activo

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;

Pantalla de configuración de base de datos mostrando creación de usuario y base para Moodle

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

Pantalla mostrando descarga y ramas de Moodle desde GitHub

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

Creación de certificado auto-firmado para pruebas con OpenSSL

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

Comprobación del estado de SELinux mostrando modo Enforcing

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):

Selección de idioma durante la instalación de Moodle

Configuración de URL, directorios moodle y moodledata

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

Configuración de la base de datos para Moodle

Acepte la licencia y siga hasta que el instalador verifique requisitos PHP. Asegúrese de que todas las extensiones necesarias aparezcan como OK.

Verificación de requisitos del sistema y extensiones PHP

Complete la creación del usuario administrador y la configuración de la página principal.

Configuración del usuario administrador

Configuración de la página principal de Moodle

Al finalizar debería llegar al panel de administrador de Moodle.

Panel de administración de Moodle

Paso 8 - Pruebas y verificación

Visite varias páginas para comprobar que todo responde por HTTPS:

Página principal de Moodle

Página de inicio de sesión de Moodle

Panel de usuario

Administración del sitio Moodle

Preferencias del usuario

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)

  1. Actualice CentOS y paquetes: yum update -y
  2. Instale EPEL y Nginx, verifique servicio.
  3. Añada repositorio webtatic e instale PHP-FPM y extensiones.
  4. Configure php.ini y pool PHP-FPM (usuario nginx, socket).
  5. Instale MariaDB, configure innodb, asegure root y cree BD/usuario.
  6. Clone Moodle, prepare /var/moodledata y permisos.
  7. Configure Nginx con SSL y pruebe nginx -t.
  8. Ajuste SELinux y firewalld según política.
  9. Complete instalación web de Moodle y pruebe login.
  10. 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:

Autor
Edición

Materiales similares

Ajustar barras de desplazamiento en Windows 10 y 11
Windows

Ajustar barras de desplazamiento en Windows 10 y 11

Actualizaciones automáticas en Ubuntu 16.04
Seguridad

Actualizaciones automáticas en Ubuntu 16.04

Restringir permisos de apps en Android
Seguridad Móvil

Restringir permisos de apps en Android

Instalar Chef Server en Ubuntu 17.04
DevOps

Instalar Chef Server en Ubuntu 17.04

Solución al error 500 de Microsoft Teams
Soporte técnico

Solución al error 500 de Microsoft Teams

Elegir bróker online fiable en 6 pasos
Inversión

Elegir bróker online fiable en 6 pasos