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í comoyour_user. - Un dominio,
your_domain, con un registro DNSAapuntando 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 rewriteoAllowOverride Allen 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.logyvendor/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.
