Drupal es un sistema de gestión de contenidos de código abierto escrito en PHP, pensado para sitios con tipos de contenido, permisos y flujos editoriales complejos. En este tutorial instalarás Drupal 11 en Ubuntu 24.04 con Apache, PHP 8.3 y MariaDB, usando Composer y la plantilla oficial drupal/recommended-project, y harás la instalación del sitio con Drush. Al final tendrás el sitio servido por HTTPS, con permisos de archivos correctos y el cron configurado.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS y al menos 2 GB de RAM, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo, representado aquí como your_user.
  • Un dominio, your_domain, con un registro DNS A apuntando a la IP del servidor.
  • Los puertos 22, 80 y 443 abiertos.

Drupal 11 requiere PHP 8.3 o superior y MariaDB 10.6 o superior; Ubuntu 24.04 incluye PHP 8.3 y MariaDB 10.11, así que no hacen falta repositorios externos.

Paso 1: Instalar Apache, PHP y MariaDB

Instala Apache, PHP 8.3 con las extensiones que necesita Drupal, MariaDB, Composer y unzip (Composer lo usa para extraer paquetes):

sudo apt update
sudo apt install apache2 mariadb-server \
  php8.3 libapache2-mod-php8.3 php8.3-cli php8.3-mysql php8.3-gd php8.3-xml \
  php8.3-mbstring php8.3-curl php8.3-zip php8.3-intl php8.3-opcache \
  composer unzip

Comprueba las versiones de PHP y Composer:

php -v
composer --version
PHP 8.3.x (cli) (built: ...)
...
Composer version 2.7.x ...

Abre los puertos web en UFW:

sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full'
sudo ufw enable

Paso 2: Crear la base de datos

Ejecuta el asistente 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 respondiendo n a la pregunta de cambiar a unix_socket y a la de cambiar la contraseña de root, y Y al resto:

sudo mariadb-secure-installation

Entra en la consola de MariaDB:

sudo mariadb

Crea la base de datos y un usuario dedicado. Sustituye your_db_password por una contraseña segura:

CREATE DATABASE drupal CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'drupal'@'localhost' IDENTIFIED BY 'your_db_password';
GRANT ALL PRIVILEGES ON drupal.* TO 'drupal'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Comprueba que el usuario tiene acceso:

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

Paso 3: Descargar Drupal con Composer

Drupal se instala y actualiza con Composer. Crea el directorio del proyecto con tu usuario como propietario y el grupo www-data (el de Apache):

sudo mkdir -p /var/www/drupal
sudo chown your_user:www-data /var/www/drupal

Crea el proyecto a partir de la plantilla oficial. Ejecuta Composer siempre con tu usuario, nunca con sudo:

composer create-project drupal/recommended-project /var/www/drupal

La descarga tarda uno o dos minutos. Añade Drush, la herramienta de línea de comandos de Drupal:

cd /var/www/drupal
composer require drush/drush

Comprueba que Drush funciona:

vendor/bin/drush --version
Drush Commandline Tool 13.x.y

La estructura del proyecto separa el código público del resto: Apache solo servirá el directorio web/, mientras que vendor/ y composer.json quedan fuera de la raíz web.

Paso 4: Configurar Apache

Crea el host virtual del sitio:

sudo nano /etc/apache2/sites-available/drupal.conf

La raíz del documento apunta a web/ y AllowOverride All permite que funcione el .htaccess que Drupal usa para las URL limpias:

<VirtualHost *:80>
    ServerName your_domain
    DocumentRoot /var/www/drupal/web

    <Directory /var/www/drupal/web>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/drupal_error.log
    CustomLog ${APACHE_LOG_DIR}/drupal_access.log combined
</VirtualHost>

Activa el módulo rewrite, habilita el sitio, desactiva el sitio por defecto y comprueba la sintaxis:

sudo a2enmod rewrite
sudo a2ensite drupal.conf
sudo a2dissite 000-default.conf
sudo apache2ctl configtest
Syntax OK

Recarga Apache:

sudo systemctl reload apache2

Paso 5: Instalar el sitio con Drush

Drush crea settings.php, el directorio de archivos y las tablas de la base de datos en un solo comando. Sustituye la contraseña de la base de datos, el nombre del sitio, el correo y la contraseña del administrador (your_strong_password):

cd /var/www/drupal
vendor/bin/drush site:install standard \
  --db-url='mysql://drupal:your_db_password@localhost/drupal' \
  --site-name='Your Site' \
  --account-name=admin \
  --account-pass='your_strong_password' \
  --account-mail='admin@your_domain' \
  --yes
 [notice] Starting Drupal installation. This takes a while.
 [notice] Performed install task: install_select_language
 ...
 [success] Installation complete.

Si la contraseña de la base de datos contiene caracteres especiales como @, : o /, codifícalos en la URL (por ejemplo @ como %40).

Paso 6: Ajustar permisos de archivos

Apache necesita escribir en web/sites/default/files (imágenes subidas, CSS y JS agregados), pero no debe poder modificar el código ni settings.php. Da al grupo www-data escritura solo en el directorio de archivos:

sudo chown -R your_user:www-data /var/www/drupal/web/sites/default/files
sudo find /var/www/drupal/web/sites/default/files -type d -exec chmod 2775 {} +
sudo find /var/www/drupal/web/sites/default/files -type f -exec chmod 664 {} +

Protege settings.php y su directorio contra escritura:

chmod 444 /var/www/drupal/web/sites/default/settings.php
chmod 555 /var/www/drupal/web/sites/default

Comprueba que Drush ve el sitio instalado y conectado a la base de datos:

vendor/bin/drush status
 Drupal version   : 11.x.y
 Site URI         : http://default
 DB driver        : mysql
 DB hostname      : localhost
 DB name          : drupal
 Database         : Connected
 Drupal bootstrap : Successful
 ...

Paso 7: Configurar trusted_host_patterns

Drupal muestra un aviso en el informe de estado si no se limita qué nombres de host acepta; esto evita ataques de cabecera Host falsificada. Da permiso de escritura temporal a settings.php y edítalo:

chmod 644 /var/www/drupal/web/sites/default/settings.php
nano /var/www/drupal/web/sites/default/settings.php

Añade al final del archivo tu dominio como expresión regular, escapando los puntos (por ejemplo '^example\.com$'):

$settings['trusted_host_patterns'] = [
  '^your_domain$',
  '^www\.your_domain$',
];

Vuelve a dejarlo en solo lectura:

chmod 444 /var/www/drupal/web/sites/default/settings.php

Paso 8: Activar HTTPS con Let's Encrypt

Instala Certbot con su plugin de Apache y solicita el certificado:

sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d your_domain

Certbot crea el host virtual en el puerto 443 y redirige HTTP a HTTPS. Comprueba que el certificado se renovará solo:

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

Visita https://your_domain/user/login e inicia sesión con el usuario admin. En Informes > Informe de estado (/admin/reports/status) no debería aparecer ningún error.

Paso 9: Configurar el cron

Drupal ejecuta tareas periódicas (indexar búsquedas, limpiar cachés, buscar actualizaciones) con su cron. Por defecto el módulo Automated Cron lo lanza durante las visitas; es más fiable ejecutarlo desde el sistema. Abre el crontab del usuario www-data:

sudo crontab -u www-data -e

Añade esta línea para ejecutarlo cada 15 minutos:

*/15 * * * * cd /var/www/drupal && vendor/bin/drush cron --quiet

Después desinstala Automated Cron para que no se ejecute también en las visitas:

cd /var/www/drupal
vendor/bin/drush pm:uninstall automated_cron --yes

Comprueba que el cron funciona lanzándolo a mano como www-data:

sudo -u www-data vendor/bin/drush cron
 [notice] Cron run completed.

Paso 10: Instalar un módulo contribuido

Los módulos se descargan con Composer y se activan con Drush. Por ejemplo, Pathauto genera URL legibles automáticamente:

composer require drupal/pathauto
vendor/bin/drush pm:install pathauto --yes

Comprueba que está activo:

vendor/bin/drush pm:list --status=enabled --filter=pathauto
 Package   Name                  Status    Version
 SEO       Pathauto (pathauto)   Enabled   8.x-1.x

Para actualizar Drupal y sus módulos más adelante usa composer update "drupal/core-*" --with-all-dependencies seguido de vendor/bin/drush updatedb y vendor/bin/drush cache:rebuild.

Solución de problemas

  • Las URL devuelven 404 salvo la portada: falta a2enmod rewrite o AllowOverride All en el host virtual.
  • "The provided host name is not valid for this server": el dominio no coincide con trusted_host_patterns; revisa las expresiones regulares.
  • Errores de permisos al subir imágenes: vuelve a aplicar los permisos del paso 6 sobre web/sites/default/files.
  • Errores 500: consulta /var/log/apache2/drupal_error.log y vendor/bin/drush watchdog:show.

Conclusión

Tienes Drupal 11 funcionando en Ubuntu 24.04 con Apache, PHP 8.3 y MariaDB, instalado con Composer, servido por HTTPS y con el cron del sistema. Como siguientes pasos, configura copias de seguridad de la base de datos y de web/sites/default/files, activa una caché de páginas con Redis o Varnish si esperas mucho tráfico y guarda composer.json y composer.lock en un repositorio Git.