MediaWiki es el software de wiki que usa Wikipedia: un motor PHP con historial de revisiones, control de permisos y un amplio catálogo de extensiones, muy usado para bases de conocimiento y documentación interna. En este tutorial instalarás la versión de soporte extendido (LTS) de MediaWiki en Ubuntu 24.04 con Nginx, PHP-FPM 8.3 y MariaDB, la publicarás con HTTPS y dejarás configuradas las extensiones, las tareas en segundo plano y las copias de seguridad.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM y 20 GB de disco.
  • Un usuario no root con privilegios sudo.
  • Un dominio o subdominio (en esta guía, wiki.example.com) con un registro DNS A que apunte a la IP del servidor. Sustituye wiki.example.com por tu dominio en todos los pasos.
  • Los puertos 80 y 443 abiertos.

Paso 1: Instalar Nginx, PHP y MariaDB

Actualiza el índice de paquetes e instala el servidor web, PHP-FPM con las extensiones que MediaWiki necesita y el servidor de base de datos:

sudo apt update
sudo apt install -y nginx mariadb-server php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-gd php8.3-curl php-apcu imagemagick
  • php8.3-intl, php8.3-mbstring y php8.3-xml son obligatorias para MediaWiki.
  • php-apcu proporciona la caché de objetos local que el instalador detecta y usa automáticamente.
  • imagemagick genera las miniaturas de las imágenes subidas.

Comprueba que los tres servicios están activos:

systemctl is-active nginx php8.3-fpm mariadb
active
active
active

Si usas UFW, abre HTTP y HTTPS:

sudo ufw allow 'Nginx Full'

Paso 2: Crear la base de datos

Ejecuta el script de seguridad de MariaDB para eliminar usuarios anónimos y la base de datos de pruebas. Puedes mantener la autenticación por socket de root, que es la opción por defecto en Ubuntu:

sudo mariadb-secure-installation

Abre la consola de MariaDB como root:

sudo mariadb

Crea la base de datos y un usuario exclusivo para la wiki. Sustituye your_strong_password por una contraseña robusta:

CREATE DATABASE mediawiki CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mediawiki'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON mediawiki.* TO 'mediawiki'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Comprueba que el usuario puede conectarse:

mariadb -u mediawiki -p -e "SHOW DATABASES;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mediawiki          |
+--------------------+

Paso 3: Descargar MediaWiki

Descarga el paquete oficial en tu directorio personal y extráelo en /var/www/mediawiki:

cd ~
wget https://releases.wikimedia.org/mediawiki/1.43/mediawiki-1.43.9.tar.gz
sudo mkdir -p /var/www/mediawiki
sudo tar -xzf mediawiki-1.43.9.tar.gz -C /var/www/mediawiki --strip-components=1

El código debe pertenecer a root para que el proceso de PHP no pueda modificarlo. Solo el directorio images, donde se guardan los archivos subidos y las miniaturas, necesita permisos de escritura para www-data:

sudo chown -R root:root /var/www/mediawiki
sudo chown -R www-data:www-data /var/www/mediawiki/images

Verifica la versión extraída:

grep "MW_VERSION'" /var/www/mediawiki/includes/Defines.php
define( 'MW_VERSION', '1.43.9' );

Paso 4: Configurar Nginx

Crea el bloque de servidor de la wiki:

sudo nano /etc/nginx/sites-available/mediawiki

Pega esta configuración:

server {
    listen 80;
    listen [::]:80;
    server_name wiki.example.com;

    root /var/www/mediawiki;
    index index.php;

    client_max_body_size 50M;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Directorios internos que nunca deben servirse
    location ~ ^/(cache|includes|languages|maintenance|serialized|tests|vendor|images/deleted)/ {
        deny all;
    }

    # Los archivos subidos se sirven como estáticos, nunca se ejecutan
    location ^~ /images/ {
        add_header X-Content-Type-Options nosniff;
        try_files $uri =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Las ubicaciones con expresión regular se evalúan en orden, por eso el bloqueo de directorios internos va antes que el de PHP. El prefijo ^~ en /images/ impide que un archivo .php subido llegue a PHP-FPM.

Activa el sitio, desactiva el sitio por defecto y comprueba la sintaxis:

sudo ln -s /etc/nginx/sites-available/mediawiki /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recarga Nginx:

sudo systemctl reload nginx

Para permitir subidas de hasta 50 MB también en PHP, edita la configuración de PHP-FPM:

sudo nano /etc/php/8.3/fpm/php.ini

Busca y ajusta estas directivas:

upload_max_filesize = 50M
post_max_size = 50M
memory_limit = 256M

Reinicia PHP-FPM para aplicar los cambios:

sudo systemctl restart php8.3-fpm

Paso 5: Activar HTTPS con Let's Encrypt

Instala Certbot con el plugin de Nginx y solicita el certificado. Certbot modifica el bloque de servidor para escuchar en el puerto 443 y redirigir HTTP a HTTPS:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d wiki.example.com

Cuando termine, comprueba que la renovación automática funciona:

sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/wiki.example.com/fullchain.pem (success)

Paso 6: Ejecutar el instalador web

Abre https://wiki.example.com/mw-config/index.php en el navegador. El instalador comprueba el entorno y te guía en varias pantallas:

  1. Idioma: elige el idioma de la interfaz y el del contenido de la wiki.
  2. Entorno: debe indicar que el entorno es correcto y que APCu está disponible. Si falta alguna extensión de PHP, instálala, reinicia php8.3-fpm y recarga la página.
  3. Base de datos: tipo MariaDB/MySQL, servidor localhost, nombre mediawiki, usuario mediawiki y la contraseña del paso 2. En la pantalla siguiente marca la opción de usar la misma cuenta que para la instalación.
  4. Nombre: el nombre de la wiki y la cuenta de administrador (usuario, contraseña y correo).
  5. Opciones: perfil de permisos (wiki abierta, solo usuarios registrados pueden editar, privada, etc.), subida de archivos, licencia y extensiones. Marca las que vayas a usar; el paquete incluye, entre otras, VisualEditor, ParserFunctions, Cite, CategoryTree y SyntaxHighlight.

Al finalizar, el instalador crea las tablas y te ofrece descargar LocalSettings.php, el archivo de configuración de la wiki. Descárgalo en tu equipo y súbelo al servidor desde tu máquina local:

scp LocalSettings.php your_user@your_server_ip:/tmp/

En el servidor, muévelo a la raíz de la wiki. Contiene la contraseña de la base de datos, así que solo root y el grupo www-data deben poder leerlo:

sudo mv /tmp/LocalSettings.php /var/www/mediawiki/LocalSettings.php
sudo chown root:www-data /var/www/mediawiki/LocalSettings.php
sudo chmod 640 /var/www/mediawiki/LocalSettings.php

Recarga https://wiki.example.com: verás la página principal de tu wiki. Inicia sesión con la cuenta de administrador y abre Especial:Versión (https://wiki.example.com/index.php?title=Special:Version) para confirmar la versión de MediaWiki, PHP y MariaDB, y las extensiones cargadas.

Paso 7: Ajustar LocalSettings.php

Casi toda la configuración posterior se hace en LocalSettings.php. Ábrelo:

sudo nano /var/www/mediawiki/LocalSettings.php

Comprueba que $wgServer usa HTTPS y tu dominio:

$wgServer = "https://wiki.example.com";

Las extensiones que marcaste en el instalador aparecen al final como llamadas a wfLoadExtension(). Para activar después otra extensión incluida en el paquete, añade su línea al final del archivo:

wfLoadExtension( 'SyntaxHighlight_GeSHi' );

Para extensiones que no vienen en el paquete, descarga la rama que coincide con tu versión (en este caso REL1_43) en /var/www/mediawiki/extensions/ y añade su wfLoadExtension(). Algunas extensiones necesitan además actualizar la base de datos:

cd /var/www/mediawiki
sudo -u www-data php maintenance/run.php update --quick

Comprueba de nuevo Especial:Versión para ver la extensión en la lista.

Paso 8: Procesar la cola de trabajos con cron

MediaWiki deja en una cola tareas como actualizar enlaces o regenerar categorías, y por defecto las ejecuta durante las peticiones web. En una wiki con tráfico es mejor procesarlas en segundo plano. Desactiva la ejecución en peticiones añadiendo esta línea a LocalSettings.php:

$wgJobRunRate = 0;

Crea un trabajo de cron del sistema que procese la cola cada cinco minutos como www-data:

sudo nano /etc/cron.d/mediawiki
*/5 * * * * www-data /usr/bin/php /var/www/mediawiki/maintenance/run.php runJobs --maxtime=240 > /dev/null 2>&1

Comprueba que el comando funciona ejecutándolo a mano:

sudo -u www-data php /var/www/mediawiki/maintenance/run.php runJobs --maxtime=60

Si no hay trabajos pendientes, termina sin mostrar nada o con un resumen de las tareas procesadas.

Paso 9: Programar copias de seguridad

Una copia útil de MediaWiki incluye la base de datos, el directorio images y LocalSettings.php. Crea un script para ello:

sudo nano /usr/local/sbin/mediawiki-backup
#!/usr/bin/env bash
set -euo pipefail

backup_dir="/var/backups/mediawiki"
wiki_dir="/var/www/mediawiki"
stamp="$(date +%Y%m%d-%H%M%S)"

mkdir -p "$backup_dir"

# Base de datos: root se autentica por socket, sin contraseña en el script
mariadb-dump --single-transaction --default-character-set=utf8mb4 mediawiki \
  | gzip > "$backup_dir/mediawiki-db-$stamp.sql.gz"

# Archivos subidos y configuración
tar -czf "$backup_dir/mediawiki-files-$stamp.tar.gz" \
  -C "$wiki_dir" images LocalSettings.php

# Conservar 14 días
find "$backup_dir" -type f -name 'mediawiki-*' -mtime +14 -delete

Hazlo ejecutable y pruébalo:

sudo chmod 750 /usr/local/sbin/mediawiki-backup
sudo /usr/local/sbin/mediawiki-backup
sudo ls -lh /var/backups/mediawiki
-rw-r--r-- 1 root root 1.2M Sep 25 03:00 mediawiki-db-20260925-030000.sql.gz
-rw-r--r-- 1 root root  18M Sep 25 03:00 mediawiki-files-20260925-030000.tar.gz

Prográmalo cada noche a las 3:00:

echo '0 3 * * * root /usr/local/sbin/mediawiki-backup' | sudo tee /etc/cron.d/mediawiki-backup

Copia periódicamente /var/backups/mediawiki a otro servidor o a un almacenamiento externo: una copia en el mismo disco no te protege si pierdes el servidor.

Solución de problemas

Error 502 Bad Gateway. Nginx no encuentra el socket de PHP-FPM. Comprueba que el servicio está activo con systemctl status php8.3-fpm y que la ruta del socket en la configuración es /run/php/php8.3-fpm.sock.

No se pueden subir archivos. Verifica que $wgEnableUploads = true; está en LocalSettings.php, que images pertenece a www-data y que los límites de php.ini y client_max_body_size son suficientes para el tamaño del archivo.

Errores tras actualizar MediaWiki o una extensión. Ejecuta el actualizador de esquema y revisa el registro de Nginx:

cd /var/www/mediawiki
sudo -u www-data php maintenance/run.php update --quick
sudo tail -n 50 /var/log/nginx/error.log

Conclusión

Tienes MediaWiki funcionando en Ubuntu 24.04 con Nginx, PHP-FPM y MariaDB, servido por HTTPS, con la cola de trabajos en segundo plano y copias de seguridad diarias. Como siguientes pasos, configura URL cortas (por ejemplo /wiki/Página) con $wgArticlePath, ajusta los permisos de grupos con $wgGroupPermissions según quién deba poder editar, y configura el envío de correo con $wgSMTP para las notificaciones y la recuperación de contraseñas.