--- title: "Cómo instalar Matomo Analytics en Ubuntu 24.04 con Nginx" description: "Instala Matomo en Ubuntu 24.04 con Nginx, PHP 8.3 y MySQL, protégelo con HTTPS, activa el archivado por cron y configura la anonimización de IP para el RGPD." category: "Hosting de Aplicaciones Web" language: es source: https://cubepath.com/es/docs/hosting-de-aplicaciones-web/instalacion-y-configuracion-de-matomo-analytics updated: 2026-09-25 --- # Cómo instalar Matomo Analytics en Ubuntu 24.04 con Nginx Matomo es una plataforma de analítica web de código abierto que ofrece informes comparables a los de Google Analytics, pero con los datos almacenados en tu propio servidor. En este tutorial instalarás Matomo en Ubuntu 24.04 con Nginx, PHP 8.3 y MySQL 8, lo publicarás con HTTPS, activarás el procesamiento de informes por cron y configurarás las opciones de privacidad necesarias para cumplir el RGPD. ## 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 libres en disco. Los sitios con mucho tráfico necesitan más memoria y disco para la base de datos. - Un usuario no root con privilegios `sudo`. - Un subdominio para Matomo, por ejemplo `analytics.example.com`, con un registro DNS A apuntando a la IP del servidor. En esta guía se usa `your_domain`. - Los puertos 22, 80 y 443 abiertos. ## Paso 1: Instalar Nginx, PHP y MySQL Matomo necesita PHP con las extensiones de MySQL, GD, XML, cURL y mbstring. Ubuntu 24.04 incluye PHP 8.3, compatible con Matomo 5: ```bash sudo apt update sudo apt install nginx mysql-server unzip php-fpm php-cli php-mysql php-gd php-xml php-curl php-mbstring php-zip php-intl ``` Comprueba que PHP-FPM está activo: ```bash systemctl status php8.3-fpm --no-pager ``` ```output ● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager Active: active (running) ``` El archivado de informes consume bastante memoria. Aumenta el límite de PHP tanto para PHP-FPM como para la línea de comandos, que es la que usará el cron del paso 7: ```bash sudo sed -i 's/^memory_limit = .*/memory_limit = 512M/' /etc/php/8.3/fpm/php.ini /etc/php/8.3/cli/php.ini sudo systemctl restart php8.3-fpm ``` Verifica el valor de la línea de comandos: ```bash php -i | grep '^memory_limit' ``` ```output memory_limit => 512M => 512M ``` Si usas UFW, abre los puertos web: ```bash sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable ``` ## Paso 2: Crear la base de datos Ejecuta el asistente de seguridad de MySQL y responde `Y` a las preguntas: ```bash sudo mysql_secure_installation ``` Abre la consola de MySQL como root (en Ubuntu se autentica por socket con `sudo`): ```bash sudo mysql ``` Crea la base de datos y su usuario. Sustituye `your_strong_password` por una contraseña robusta: ```sql CREATE DATABASE matomo CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER 'matomo'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON matomo.* TO 'matomo'@'localhost'; FLUSH PRIVILEGES; EXIT; ``` Comprueba el acceso con el nuevo usuario: ```bash mysql -u matomo -p -e "SELECT CURRENT_USER();" ``` ```output +-------------------+ | CURRENT_USER() | +-------------------+ | matomo@localhost | +-------------------+ ``` ## Paso 3: Descargar Matomo Descarga la última versión estable desde el servidor oficial de builds y descomprímela en `/var/www`. El archivo contiene un directorio `matomo/`: ```bash cd /tmp curl -fLO https://builds.matomo.org/matomo.zip sudo unzip -q matomo.zip -d /var/www/ sudo chown -R www-data:www-data /var/www/matomo ``` El zip incluye también un archivo `How to install Matomo.html` fuera del directorio `matomo/`, que ha quedado en `/var/www`. No lo necesitas, así que elimínalo: ```bash sudo rm -f "/var/www/How to install Matomo.html" ``` Comprueba que los archivos principales están en su sitio: ```bash ls /var/www/matomo/index.php /var/www/matomo/console ``` ```output /var/www/matomo/console /var/www/matomo/index.php ``` Matomo necesita escribir en `config/` y `tmp/`; al asignar todo a `www-data` ya tiene esos permisos. No uses permisos `777`. ## Paso 4: Configurar Nginx La configuración recomendada por Matomo solo permite ejecutar los scripts PHP públicos (`index.php`, `matomo.php` y los de seguimiento) y bloquea el acceso directo a directorios internos como `config/`, `tmp/` o `core/`. Crea el bloque de servidor: ```bash sudo nano /etc/nginx/sites-available/matomo ``` ```nginx server { listen 80; listen [::]:80; server_name your_domain; root /var/www/matomo; index index.php; # Solo estos scripts PHP son accesibles desde fuera location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.3-fpm.sock; } # Cualquier otro .php se bloquea location ~* ^.+\.php$ { deny all; return 403; } location / { try_files $uri $uri/ =404; } location ~ ^/(config|tmp|core|lang) { deny all; return 403; } location ~ /\.ht { deny all; return 403; } location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2)$ { allow all; expires 1h; add_header Pragma public; add_header Cache-Control "public"; } location ~ ^/(libs|vendor|plugins|misc|node_modules) { deny all; return 403; } location ~ /(.*\.md|LEGALNOTICE|LICENSE) { default_type text/plain; } } ``` El orden importa: Nginx evalúa las expresiones regulares de arriba abajo, de modo que los recursos estáticos de `plugins/` (JavaScript, CSS, imágenes) se sirven, y el resto de ese directorio queda bloqueado. Activa el sitio, desactiva el sitio por defecto y comprueba la sintaxis: ```bash sudo ln -s /etc/nginx/sites-available/matomo /etc/nginx/sites-enabled/ sudo rm /etc/nginx/sites-enabled/default sudo nginx -t sudo systemctl reload nginx ``` ```output nginx: configuration file /etc/nginx/nginx.conf test is successful ``` Verifica que el directorio de configuración no es accesible: ```bash curl -s -o /dev/null -w '%{http_code}\n' http://your_domain/config/config.ini.php ``` ```output 403 ``` ## Paso 5: Activar HTTPS con Let's Encrypt Instala Certbot con su plugin de Nginx y solicita el certificado. Certbot configurará TLS y la redirección de HTTP a HTTPS: ```bash sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d your_domain ``` Comprueba que la renovación automática funciona: ```bash sudo certbot renew --dry-run ``` ```output Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ``` ## Paso 6: Completar el asistente de instalación Abre `https://your_domain` en el navegador. El asistente de Matomo te guiará por estas pantallas: 1. **Comprobación del sistema**: todas las comprobaciones obligatorias deben aparecer en verde. Si falta alguna extensión de PHP, instálala con `apt`, reinicia `php8.3-fpm` y recarga la página. 2. **Base de datos**: servidor `127.0.0.1`, usuario `matomo`, la contraseña del paso 2, base de datos `matomo`, prefijo `matomo_` y adaptador `PDO\MYSQL`. 3. **Superusuario**: crea la cuenta de administrador con un correo real y una contraseña robusta. 4. **Primer sitio web**: nombre, URL y zona horaria del sitio que quieres medir. 5. **Código de seguimiento**: Matomo muestra el fragmento de JavaScript de ese sitio. Al terminar, la configuración queda guardada en `/var/www/matomo/config/config.ini.php`. Para forzar que el panel se use siempre por HTTPS, edita ese archivo: ```bash sudo nano /var/www/matomo/config/config.ini.php ``` Añade la línea `force_ssl` dentro de la sección `[General]`, que ya existe y contiene `trusted_hosts[]`: ```ini [General] force_ssl = 1 ``` ## Paso 7: Programar el archivado de informes Por defecto, Matomo genera los informes cuando alguien abre el panel, lo que lo vuelve lento con tráfico real. Lo recomendado es desactivar ese comportamiento y procesar los informes cada hora con el comando `core:archive`. En el panel, ve a **Administración > Sistema > Configuración general** y, en **Configuración de archivado**, marca que los informes no se archiven desde el navegador. Guarda los cambios. Crea después la tarea programada, que se ejecuta como `www-data`: ```bash echo '5 * * * * www-data /usr/bin/php /var/www/matomo/console core:archive --url=https://your_domain/ > /dev/null' | sudo tee /etc/cron.d/matomo-archive ``` Lanza el archivado una vez a mano para comprobar que funciona: ```bash sudo -u www-data php /var/www/matomo/console core:archive --url=https://your_domain/ ``` La salida termina con un resumen de los sitios procesados y sin errores. Si ves `Allowed memory size exhausted`, aumenta `memory_limit` en `/etc/php/8.3/cli/php.ini`. ## Paso 8: Añadir el código de seguimiento Copia el código que muestra Matomo en **Administración > Sitios web > Código de seguimiento**. Para el sitio con ID 1 tiene esta forma: ```html ``` Insértalo antes del cierre de `` en todas las páginas. Para verificarlo, visita tu web en una ventana privada y abre **Visitantes > Visitas en tiempo real** en Matomo: la visita aparece en unos segundos, aunque los informes agregados no se actualizarán hasta la siguiente ejecución del archivado. Para registrar acciones concretas, como un clic en un botón de descarga, envía un evento con categoría, acción y nombre: ```html ``` ## Paso 9: Configurar la privacidad para el RGPD Matomo incluye las opciones de privacidad en **Administración > Privacidad**. Revisa al menos estas: - **Anonimizar datos**: activa la anonimización de la IP de los visitantes. Enmascarar 2 bytes es un buen equilibrio entre privacidad y precisión de la geolocalización. - **Eliminar datos antiguos**: programa el borrado automático de los registros de visitas en bruto pasado un tiempo (por ejemplo, 180 días). Los informes ya agregados se conservan. - **Consentimiento**: si tu política exige consentimiento previo, añade `_paq.push(['requireConsent']);` antes de `trackPageView` y llama a `_paq.push(['setConsentGiven']);` cuando el usuario acepte. ## Paso 10: Programar copias de seguridad Lo imprescindible es la base de datos y el archivo `config/config.ini.php`, que contiene la sal usada por Matomo. Crea un script: ```bash sudo nano /usr/local/bin/matomo-backup ``` ```bash #!/usr/bin/env bash set -euo pipefail BACKUP_DIR="/var/backups/matomo" STAMP="$(date +%F_%H%M)" mkdir -p "$BACKUP_DIR" chmod 700 "$BACKUP_DIR" mysqldump --single-transaction matomo | gzip > "$BACKUP_DIR/matomo-db-$STAMP.sql.gz" cp /var/www/matomo/config/config.ini.php "$BACKUP_DIR/config-$STAMP.ini.php" find "$BACKUP_DIR" -type f -mtime +14 -delete ``` El script se ejecuta como root, que accede a MySQL por socket sin guardar contraseñas. Hazlo ejecutable, pruébalo y prográmalo cada noche: ```bash sudo chmod 750 /usr/local/bin/matomo-backup sudo /usr/local/bin/matomo-backup sudo ls -lh /var/backups/matomo echo '30 2 * * * root /usr/local/bin/matomo-backup' | sudo tee /etc/cron.d/matomo-backup ``` Guarda también copias fuera del servidor. ## Actualizar Matomo Cuando haya una versión nueva, Matomo lo indica en el panel y permite actualizar con un clic desde **Administración > Sistema > Actualizar**. Haz antes una copia de seguridad. Si la actualización requiere cambios en la base de datos y el sitio tiene mucho tráfico, aplícalos desde la línea de comandos para evitar tiempos de espera del navegador: ```bash sudo /usr/local/bin/matomo-backup sudo -u www-data php /var/www/matomo/console core:update --yes ``` ## Solución de problemas - **"Hostname de confianza no válido"**: añade el dominio a `trusted_hosts[]` en la sección `[General]` de `config/config.ini.php`. - **El panel va muy lento**: el archivado desde el navegador sigue activo o el cron no se ejecuta. Revisa el paso 7 y los registros de cron con `journalctl -u cron --since today`. - **Los estilos o iconos no cargan**: el bloque de recursos estáticos debe ir antes del que bloquea `plugins/` en la configuración de Nginx. - **502 Bad Gateway**: comprueba `systemctl status php8.3-fpm` y que existe `/run/php/php8.3-fpm.sock`. ## Conclusión Matomo está instalado en Ubuntu 24.04 con Nginx y HTTPS, con archivado de informes por cron, IP anonimizadas y copias de seguridad diarias. Como siguientes pasos, puedes definir objetivos de conversión, crear usuarios con acceso de solo lectura para tu equipo y configurar el envío de informes por correo con un servidor SMTP.