Ubuntu 22.04 Server / Cómo instalar Apache, PHP y MariaDB
En Ubuntu 22.04 Server, instala Apache, su módulo PHP, MariaDB y la extensión de bases de datos de PHP para preparar un entorno Web básico. Después, separa la cuenta administradora de MariaDB de la cuenta de la aplicación y comprueba que PHP pueda leer un valor de la base de datos.
Alcance de la instalación y paquetes
Esta guía ejecuta Apache y MariaDB en un único servidor nuevo con los repositorios predeterminados de Ubuntu 22.04. Necesitas privilegios sudo y conexión a Internet para descargar los paquetes. En un servidor existente, haz primero una copia de la configuración Web y de las bases de datos y comprueba que los nombres de archivos, cuentas y bases del ejemplo estén disponibles. Si ya utilizas PHP-FPM, no mezcles esta configuración del módulo Apache con la actual.
- Actualiza el índice de paquetes e instala los componentes.
libapache2-mod-phpprocesa PHP dentro de Apache yphp-mysqlaporta las extensiones para acceder a MariaDB. Instala tambiénphp-clipara las comprobaciones por terminal. Consulta la guía de instalación de PHP de Ubuntu sobre esta configuración.
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- Inicia los servicios y activa su arranque automático. Comprueba que la prueba de configuración de Apache muestre
Syntax OKy reinicia Apache para cargar el módulo PHP.
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
El último comando muestra active para cada servicio en ejecución. Consulta las versiones instaladas con apache2 -v, php -v y mariadb --version. Los servidores con repositorios adicionales pueden instalar una versión de PHP diferente de la de los repositorios predeterminados.
Comprobar la autenticación del administrador de MariaDB
Los paquetes predeterminados de MariaDB en Ubuntu suelen usar autenticación mediante socket Unix para la administración local. Este método comprueba la identidad del usuario del sistema operativo; no significa que cualquiera pueda conectarse con una contraseña root vacía. Abre la siguiente sesión administrativa e inspecciona la cuenta y la configuración actuales.
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
La autenticación de root puede variar según la configuración existente. Este ejemplo conserva la autenticación por socket y crea una cuenta independiente para la aplicación, siguiendo la explicación de autenticación de MariaDB desde la versión 10.4. No hagas un UPDATE directo del valor plugin de mysql.user ni uses root en una aplicación Web.
La siguiente herramienta permite revisar los ajustes iniciales de seguridad. El texto y el orden de las preguntas dependen de la versión y la configuración; no respondas Y automáticamente a todo.
sudo mariadb-secure-installation
- Si ya administras MariaDB mediante autenticación por socket, puedes mantenerla. La documentación oficial de la herramienta MariaDB explica que normalmente no hace falta establecer una contraseña root nueva en esta configuración.
- En un servidor nuevo, conviene eliminar los usuarios anónimos y la base test innecesaria y limitar el acceso remoto de root. Si existen servicios, comprueba si utilizan esos recursos antes de decidir. Aplica los cambios cuando se solicite recargar las tablas de privilegios.
Crear una base de datos y una cuenta para la aplicación
Conéctate de nuevo con sudo mariadb --protocol=socket y ejecuta el SQL siguiente. lampdemo y lamp_app son nombres nuevos de este ejercicio. Si ya existen, elige otros y adapta de forma coherente los ejemplos posteriores; no sobrescribas ni borres objetos existentes. Sustituye el marcador de contraseña por una contraseña larga y única y usa el mismo valor en PHP. Si contiene comillas simples, respeta las reglas de escape de cadenas de SQL y de PHP por separado.
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
El administrador crea la tabla; la aplicación solo recibe permisos de consulta, inserción, actualización y eliminación sobre esta base. Si un instalador necesita crear tablas, revisa ese permiso por separado. Tras conceder permisos con GRANT, no es necesario un FLUSH PRIVILEGES adicional.
Consulta desde el terminal con la cuenta de la aplicación y comprueba que aparezca database-ok. No escribas la contraseña después de -p; introdúcela cuando se solicite.
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
Crear los archivos PHP del ejemplo de integración
El directorio de documentos Web del sitio Apache predeterminado de Ubuntu suele ser /var/www/html. Para un host virtual existente, revisa sudo apache2ctl -S y su ajuste DocumentRoot y adapta la ruta del archivo Web. Si alguno de los archivos indicados ya existe, utiliza otro nombre. Guarda la configuración que contiene la contraseña fuera del directorio Web.
- Crea el directorio de configuración y abre un editor. Estos permisos suponen que Apache se ejecuta con el usuario y grupo predeterminados de Ubuntu,
www-data.
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
Guarda todo el contenido siguiente en /etc/lamp-demo/database.php. Sustituye password por la contraseña de la aplicación definida antes. Como explica la documentación de conexión PDO_MYSQL de PHP, host=localhost usa un socket en Unix. Cambiarlo por 127.0.0.1 selecciona TCP y puede alterar la selección de la cuenta y los requisitos de conexión.
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- Mantén root como propietario de la configuración y permite su lectura solo al propietario y al grupo de Apache. Después abre el archivo Web de comprobación.
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
Guarda todo el contenido siguiente en /var/www/html/lamp-check.php. PDO (PHP Data Objects) es una interfaz para acceder a bases de datos desde PHP. El código comprueba el valor real de la tabla antes de indicar éxito. Si falla, devuelve HTTP 500 con un mensaje genérico y registra el motivo detallado en el log del servidor.
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Asigna permisos de lectura al archivo Web y comprueba la sintaxis PHP de ambos archivos.
No syntax errors detectedsolo indica una sintaxis válida, no una conexión correcta a la base.
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
Un usuario normal puede no tener acceso a la configuración, por lo que su comprobación de sintaxis usa sudo. No hace falta dar escritura a todo el directorio Web ni aplicar chmod 777.
Comprobar la respuesta HTTP y la conexión a la base
Solicita la siguiente URL desde el propio servidor. Si no hay curl, instálalo con sudo apt install curl. El estado HTTP 200 y las dos líneas siguientes en el cuerpo significan que Apache ejecutó PHP y que PHP leyó la fila de ejemplo de MariaDB.
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
Desde otro ordenador, abre http://SERVER-IP/lamp-check.php en el navegador. Para un host virtual, utiliza el nombre configurado. Ver únicamente la página de bienvenida predeterminada o ejecutar php -v no verifica esta integración.
Si funciona localmente pero no desde otro equipo, comprueba sudo ufw status verbose, los grupos de seguridad de la nube y el enrutamiento. En una red privada de pruebas donde UFW ya esté activo, la siguiente regla permite HTTP en el puerto 80 solo desde la subred prevista. Sustituye 192.168.10.0/24 por tu subred de confianza. No desactives el cortafuegos ni lo actives por primera vez sin permitir SSH remoto para esta prueba.
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHP y MariaDB se comunican por socket en el mismo servidor, por lo que no es necesario exponer el puerto 3306. Realiza el ejercicio HTTP en un entorno de confianza. Antes de enviar credenciales u otros datos en producción, configura por separado el dominio, el host virtual y el certificado HTTPS.
Diagnosticar errores y limpiar las pruebas
Para aislar fallos de conexión, revisa los servicios, los módulos PHP, las cuentas y los permisos de archivos, en ese orden. Los comandos siguientes muestran la configuración y los módulos de Apache y los logs recientes de ambos servicios. Los logs pueden contener información operativa; no los publiques sin revisarlos.
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- Se muestra o descarga el código PHP: detén el acceso público y comprueba la activación del módulo PHP de Apache y el reinicio del servicio. Si instalar
libapache2-mod-phpno lo resuelve, revisa también PHP-FPM y los hosts virtuales existentes. - could not find driver: comprueba que la extensión
php-mysqlcorrespondiente al PHP utilizado por Apache esté instalada y activa, y reinicia Apache. PHP por terminal y PHP en Apache pueden utilizar configuraciones distintas. - Access denied: comprueba la contraseña de la aplicación, la cuenta
'lamp_app'@'localhost'y sus permisos. No cambies la autenticación de root ni otorgues privilegios globales para evitar el error. Si no se encuentra el socket, compara el resultado deSHOW VARIABLES LIKE 'socket';en MariaDB con la configuración del socket de PHP. - Permission denied o 404: verifica que el usuario de Apache pueda leer la configuración y que el archivo Web esté en el DocumentRoot del sitio solicitado. Comprueba también los permisos de acceso al directorio
/etc/lamp-demo.
Al terminar, usa el comando siguiente para borrar únicamente el archivo Web de prueba creado en esta guía y comprueba que la misma URL ya no devuelva el mensaje de éxito. Tampoco dejes archivos que expongan el entorno, como un phpinfo.php existente. Si una aplicación real utiliza la configuración, mantenla fuera del directorio Web con permisos restringidos.
sudo rm -- /var/www/html/lamp-check.php
Para eliminar también los datos del ejercicio, comprueba primero que ningún otro servicio los utiliza y ejecuta el SQL siguiente en una sesión administrativa. Borrar una base de datos es irreversible; guarda antes lo que necesites. Aplícalo solo a los nombres creados para este ejercicio.
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
En una configuración de un solo servidor, conserva la escucha local de MariaDB. Si necesitas acceso remoto a la base, no elimines simplemente bind-address: planifica conjuntamente la dirección de escucha, los orígenes permitidos, la cuenta dedicada y la conexión cifrada.



