Instalar un stack LAMP en Debian 13 y Debian 12: Apache2, PHP 8, MariaDB y phpMyAdmin

Publicado el Actualizado el 8 min de lectura

Apache2, PHP 8, MariaDB y phpMyAdmin en Debian 13 o Debian 12: toda la instalación paso a paso, incluidos el aseguramiento y la solución de los errores más frecuentes.

¿Quieres instalar Apache2, PHP 8, una base de datos MySQL y phpMyAdmin, es decir, un stack LAMP completo, en tu servidor Debian 13 (Trixie) o Debian 12 (Bookworm)? Esta guía te lleva paso a paso por toda la instalación, desde el servidor web hasta el acceso protegido a la base de datos.

Importante sobre el servidor de bases de datos: Debian no incluye ningún paquete mysql-server, en ninguna versión actual. En Debian instalas siempre MariaDB. MariaDB surgió de MySQL, habla el mismo protocolo y el mismo lenguaje de consulta, y herramientas como phpMyAdmin o la extensión de PHP php-mysql funcionan con ella sin ningún cambio. Cuando esta guía habla de bases de datos MySQL, por debajo está funcionando MariaDB.

Requisitos

Necesitas un acceso SSH con permisos de root (o un usuario con sudo) en un Debian actual. Se recomiendan Debian 13 "Trixie" y Debian 12 "Bookworm". Debian 10 llegó al final de su soporte en junio de 2024 y ya no recibe actualizaciones de seguridad regulares, así que no resulta apto para el uso en producción.

Actualiza primero la lista de paquetes e instala las actualizaciones disponibles:

apt update

apt upgrade -y

Instalar Apache2 y los paquetes base

Instala el servidor web junto con los paquetes auxiliares que vas a necesitar en los siguientes pasos:

apt install -y nano curl wget unzip ca-certificates apt-transport-https lsb-release gnupg apache2

Abre después http://<IP-de-tu-servidor>/ en el navegador. Si aparece la página predeterminada de Apache2, el servidor web ya está funcionando.

Instalar PHP 8

La versión de PHP que obtienes desde los repositorios depende de tu distribución. Por eso un comando con un número de versión fijo como apt install php8.4 falla en Debian 12, donde solo existe PHP 8.2. Esta tabla muestra la versión que incluye cada distribución (a fecha de julio de 2026):

DistribuciónVersión de PHP en los repositorios
Debian 13PHP 8.4
Debian 12PHP 8.2
Debian 11PHP 7.4

Usa por eso los metapaquetes sin número de versión. Instalan automáticamente la versión que corresponde a tu distribución y se comportan igual en cualquier Debian:

apt install -y php php-cli php-common php-curl php-gd php-intl php-mbstring php-mysql php-opcache php-readline php-xml php-zip php-bz2 libapache2-mod-php

Si prefieres ejecutar PHP mediante FPM en lugar del módulo de Apache, se aplica el mismo principio. También aquí el metapaquete te lleva al objetivo de forma fiable, mientras que los nombres con versión como php8.4-fpm solo existen en Debian 13:

apt install -y php-fpm

Para ver qué versión se ha instalado realmente:

php -v

Si necesitas una versión que tu edición de Debian no trae (por ejemplo PHP 8.4 en Debian 12), añade el repositorio de PHP de Ondřej Surý. La clave de firma se instala mediante un paquete keyring propio y queda asociada en la línea de sources a ese repositorio concreto con signed-by=:

curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb

dpkg -i /tmp/debsuryorg-archive-keyring.deb

echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list

apt update

La vía antes habitual con apt-key add está obsoleta desde Debian 11 y no debería seguir usándose, porque una clave registrada así sería válida para todos los repositorios del sistema.

Solo a través de este repositorio quedan disponibles los nombres de paquete con versión para todas las ediciones de Debian. A continuación instalas la versión de PHP que quieras junto con las extensiones habituales:

apt install -y php8.4 php8.4-cli php8.4-common php8.4-curl php8.4-gd php8.4-intl php8.4-mbstring php8.4-mysql php8.4-opcache php8.4-readline php8.4-xml php8.4-zip php8.4-bz2 libapache2-mod-php8.4

Si después conviven varias versiones de PHP en paralelo, define cuál debe usar Apache2:

a2dismod php8.2

a2enmod php8.4

systemctl restart apache2

Con php -v compruebas qué versión está activa en la línea de comandos.

Instalar y asegurar MariaDB como servidor de bases de datos

Como se mencionó al principio, en Debian no existe el paquete mysql-server. Aquí el servidor de bases de datos se llama MariaDB, y la edición concreta depende de tu versión de Debian:

DistribuciónServidor de bases de datos en los repositorios
Debian 13MariaDB 11.8
Debian 12MariaDB 10.11
Debian 11MariaDB 10.5

Instala el servidor e inicia justo después el proceso de aseguramiento:

apt install -y mariadb-server mariadb-client

mysql_secure_installation

El script hace varias preguntas. Las versiones actuales de MariaDB preguntan primero si quieres cambiar a la autenticación unix_socket. Esa opción tiene sentido, porque así el usuario de base de datos root solo puede iniciar sesión como usuario del sistema root. Responde y a todas las demás preguntas (eliminar usuarios anónimos, prohibir el inicio de sesión remoto para root, borrar la base de datos de prueba, recargar los privilegios). Asigna además una contraseña de base de datos robusta.

Comprueba después si el servicio está funcionando:

systemctl status mariadb

Instalar phpMyAdmin

Para phpMyAdmin tienes dos opciones. El paquete phpmyadmin está en los repositorios de todas las versiones actuales de Debian y se instala en un solo paso:

apt install phpmyadmin -y

Es cómodo, pero la versión suele ir por detrás de la que publica el fabricante. Si quieres siempre la edición más reciente, descarga phpMyAdmin directamente. Ese es justo el camino que describen los siguientes pasos:

cd /usr/share && wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip -O phpmyadmin.zip && unzip phpmyadmin.zip && rm phpmyadmin.zip && mv phpMyAdmin-*-all-languages phpmyadmin && chmod -R 0755 phpmyadmin

Crea a continuación el archivo de configuración:

cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

phpMyAdmin necesita un valor aleatorio como blowfish_secret, con el que se cifran los datos de sesión guardados en la cookie. Genera ese valor:

openssl rand -base64 32

Introdúcelo después en el archivo de configuración:

nano /usr/share/phpmyadmin/config.inc.php

La línea correspondiente es:

$cfg['blowfish_secret'] = 'INTRODUCE_AQUI_EL_VALOR_GENERADO';

Enlazar phpMyAdmin con Apache2

Crea un archivo de configuración de Apache2 propio para phpMyAdmin:

nano /etc/apache2/conf-available/phpmyadmin.conf

El contenido de phpmyadmin.conf:

#Configuración Apache2 para PHPMyAdmin

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
</Directory>

<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

Activa la configuración, recarga Apache2 y crea el directorio temporal con los permisos adecuados:

a2enconf phpmyadmin && systemctl reload apache2 && mkdir -p /usr/share/phpmyadmin/tmp/ && chown -R www-data:www-data /usr/share/phpmyadmin/tmp/

Crear un usuario de base de datos

Inicia sesión en la base de datos como usuario del sistema root:

mysql -u root

Crea ahora tu propio usuario de base de datos. No uses "root", "admin", "user" ni "username" como nombre, sino un nombre de usuario propio y una contraseña larga y aleatoria:

#¡IMPORTANTE! SUSTITUYE USER Y PASSWORD POR TUS PROPIAS CREDENCIALES.

CREATE USER 'USER'@'localhost' IDENTIFIED BY 'PASSWORD';

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Para aplicaciones concretas deberías crear además usuarios con permisos limitados, que solo puedan acceder a su propia base de datos:

CREATE DATABASE miapp;

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'PASSWORD';

GRANT ALL PRIVILEGES ON miapp.* TO 'appuser'@'localhost';

FLUSH PRIVILEGES;

Puedes salir de la consola de base de datos en cualquier momento con:

exit

Probar el stack LAMP

Abre phpMyAdmin en http://<IP-de-tu-servidor>/phpmyadmin e inicia sesión con el usuario que acabas de crear. Si el inicio de sesión funciona, Apache2, PHP y MariaDB trabajan correctamente juntos.

La integración de PHP la compruebas además con un pequeño archivo de prueba:

echo "<?php phpinfo();" > /var/www/html/info.php

Después de abrir http://<IP-de-tu-servidor>/info.php, borra el archivo sin falta, porque revela detalles sobre la configuración de tu servidor:

rm /var/www/html/info.php

Consejos de seguridad para el uso en producción

Un stack LAMP recién instalado todavía no está asegurado. Deberías completar estos puntos:

  • phpMyAdmin es un objetivo de ataque muy frecuente. Restringe el acceso a tu propia dirección IP usando Require ip 203.0.113.10 en el bloque Directory, en lugar de dejarlo abierto a todo el mundo.
  • Configura HTTPS para que las contraseñas no viajen en texto plano. Sin cifrado, tus credenciales se pueden leer en el camino hacia el servidor.
  • Mantén phpMyAdmin actualizado. Como lo has instalado manualmente, apt upgrade no lo actualiza automáticamente.
  • Crea copias de seguridad periódicas de las bases de datos y guárdalas fuera del servidor.

Errores frecuentes y soluciones

El navegador descarga el archivo PHP en lugar de ejecutarlo: el módulo de PHP no está activo en Apache2. Actívalo con a2enmod php8.4 y reinicia el servidor web con systemctl restart apache2.

phpMyAdmin avisa con "The configuration file now needs a secret passphrase": falta el valor de blowfish_secret en config.inc.php. Genéralo con openssl rand -base64 32 e introdúcelo ahí.

"Access denied for user" al iniciar sesión en phpMyAdmin: tras mysql_secure_installation, el usuario de base de datos root usa por lo general la autenticación unix_socket y por eso no puede iniciar sesión a través de la interfaz web. Utiliza el usuario que has creado aparte.

Apache2 ya no arranca tras un cambio en la configuración: comprueba la configuración con apachectl configtest, la salida indica el archivo y la línea del error.

Preguntas frecuentes

¿Por qué Debian instala MariaDB en lugar de MySQL?
Ninguna versión actual de Debian contiene un paquete llamado mysql-server. El servidor de base de datos incluido es MariaDB, un servidor nacido de MySQL que usa el mismo protocolo y el mismo lenguaje de consulta. Debian 13 incluye MariaDB 11.8, Debian 12 la versión 10.11 y Debian 11 la versión 10.5.
¿Qué versión de PHP incluye Debian?
Debian 13 trae PHP 8.4, Debian 12 trae PHP 8.2 y Debian 11 todavía trae PHP 7.4. Por eso conviene usar los metapaquetes sin número de versión, es decir php y php-fpm. Un comando con un número fijo como apt install php8.4 falla en Debian 12, donde ese paquete no existe.
¿Cómo consigo una versión de PHP más reciente que la de Debian?
A través del repositorio de PHP de Ondřej Surý. La clave de firma entra en el sistema como paquete keyring propio y queda asociada con signed-by exactamente a ese repositorio. Solo entonces quedan disponibles en cualquier edición de Debian los nombres de paquete con versión, como php8.4-fpm.
¿Por qué el navegador descarga el archivo PHP en lugar de ejecutarlo?
En ese caso el módulo de PHP no está activo en Apache2. Actívalo con a2enmod y el nombre de tu versión de PHP, por ejemplo a2enmod php8.4, y reinicia después Apache2 con systemctl restart apache2.
¿Por qué no puedo iniciar sesión en phpMyAdmin como root?
Después de ejecutar mysql_secure_installation, el usuario de base de datos root usa por regla general la autenticación unix_socket y por eso no puede iniciar sesión a través de la interfaz web. Crea para ello un usuario de base de datos propio.

LAMP Apache2 PHP MariaDB MySQL phpMyAdmin Debian 13 Debian