--- title: "Cómo instalar Drupal 11 en Ubuntu 24.04 con Apache y MariaDB" description: "Instala Drupal 11 en Ubuntu 24.04 con Apache, PHP 8.3, MariaDB, Composer y Drush, activa HTTPS con Let's Encrypt y protege el sitio con trusted_host_patterns." category: "Hosting de Aplicaciones Web" language: es source: https://cubepath.com/es/docs/hosting-de-aplicaciones-web/instalacion-y-configuracion-de-drupal updated: 2026-09-25 --- # Cómo instalar Drupal 11 en Ubuntu 24.04 con Apache y MariaDB 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): ```bash 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: ```bash php -v composer --version ``` ```output PHP 8.3.x (cli) (built: ...) ... Composer version 2.7.x ... ``` Abre los puertos web en UFW: ```bash 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: ```bash sudo mariadb-secure-installation ``` Entra en la consola de MariaDB: ```bash sudo mariadb ``` Crea la base de datos y un usuario dedicado. Sustituye `your_db_password` por una contraseña segura: ```sql 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: ```bash mariadb -u drupal -p -e "SHOW DATABASES;" ``` ```output +--------------------+ | 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): ```bash 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`: ```bash 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: ```bash cd /var/www/drupal composer require drush/drush ``` Comprueba que Drush funciona: ```bash vendor/bin/drush --version ``` ```output 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: ```bash 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: ```apache ServerName your_domain DocumentRoot /var/www/drupal/web AllowOverride All Require all granted ErrorLog ${APACHE_LOG_DIR}/drupal_error.log CustomLog ${APACHE_LOG_DIR}/drupal_access.log combined ``` Activa el módulo `rewrite`, habilita el sitio, desactiva el sitio por defecto y comprueba la sintaxis: ```bash sudo a2enmod rewrite sudo a2ensite drupal.conf sudo a2dissite 000-default.conf sudo apache2ctl configtest ``` ```output Syntax OK ``` Recarga Apache: ```bash 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`): ```bash 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 ``` ```output [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: ```bash 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: ```bash 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: ```bash vendor/bin/drush status ``` ```output 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: ```bash 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$'`): ```php $settings['trusted_host_patterns'] = [ '^your_domain$', '^www\.your_domain$', ]; ``` Vuelve a dejarlo en solo lectura: ```bash 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: ```bash 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: ```bash sudo certbot renew --dry-run ``` ```output 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`: ```bash sudo crontab -u www-data -e ``` Añade esta línea para ejecutarlo cada 15 minutos: ```text */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: ```bash cd /var/www/drupal vendor/bin/drush pm:uninstall automated_cron --yes ``` Comprueba que el cron funciona lanzándolo a mano como `www-data`: ```bash sudo -u www-data vendor/bin/drush cron ``` ```output [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: ```bash composer require drupal/pathauto vendor/bin/drush pm:install pathauto --yes ``` Comprueba que está activo: ```bash vendor/bin/drush pm:list --status=enabled --filter=pathauto ``` ```output 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.