Poniendo en marcha el stack LAMP: tu primer sitio dinámico
Esta lección recorre, paso a paso, la instalación completa del stack LAMP en Ubuntu/Debian y termina con una página PHP funcional que lee datos de una base de datos MySQL. Es el punto de encuentro de todo lo que hemos visto en las lecciones anteriores.
Paso 1: Instalar Apache
Si aún no lo tienes instalado:
sudo apt update && sudo apt install apache2 -y
sudo systemctl enable apache2
sudo systemctl start apache2
Verifica en el navegador: http://localhost debe mostrar la página de bienvenida de Apache.
Paso 2: Instalar MySQL
sudo apt install mysql-server -y
# Ejecutar el asistente de seguridad inicial (recomendado)
sudo mysql_secure_installation
El asistente te pedirá configurar la contraseña de root y eliminar usuarios y bases de datos de prueba. En un entorno de desarrollo local puedes ser más permisivo, pero acostúmbrate a hacerlo bien desde el principio.
# Verificar que MySQL está activo
sudo systemctl status mysql
Paso 3: Instalar PHP
# PHP + módulo para Apache + extensión para MySQL
sudo apt install php libapache2-mod-php php-mysql -y
# Verificar versión instalada
php -v
El paquete libapache2-mod-php conecta Apache con el intérprete PHP. El paquete php-mysql permite que PHP se conecte a MySQL mediante PDO y MySQLi.
# Reiniciar Apache para que cargue el módulo PHP
sudo systemctl restart apache2
Paso 4: Verificar que PHP funciona en Apache
Crea un archivo de prueba en el Document Root:
sudo nano /var/www/html/info.php
<?php
phpinfo();
?>
Abre http://localhost/info.php en el navegador. Deberías ver la página de información de PHP con todos los módulos cargados.
Nota: Elimina info.php una vez hayas verificado la instalación. Esta página expone información sensible del servidor y no debe ser accesible en producción.
Paso 5: Crear una base de datos y un usuario
sudo mysql -u root -p
-- Crear base de datos
CREATE DATABASE mi_proyecto CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Crear usuario dedicado (nunca uses root para la aplicación)
CREATE USER 'mi_usuario'@'localhost' IDENTIFIED BY 'mi_contraseña_segura';
-- Dar permisos solo sobre esta base de datos
GRANT ALL PRIVILEGES ON mi_proyecto.* TO 'mi_usuario'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Paso 6: Crear una tabla de ejemplo
mysql -u mi_usuario -p mi_proyecto
CREATE TABLE articulos (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(200) NOT NULL,
cuerpo TEXT,
fecha DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO articulos (titulo, cuerpo) VALUES
('Bienvenido al stack LAMP', 'Este es el primer artículo de prueba.'),
('Apache sirve, PHP procesa, MySQL almacena', 'Los tres trabajan juntos en cada petición.');
Paso 7: Página PHP que lee de MySQL
Crea el archivo del proyecto fuera del Document Root por defecto, en tu propio VirtualHost, o directamente en /var/www/html/ para esta prueba:
sudo nano /var/www/html/articulos.php
<?php
// Datos de conexión
$host = 'localhost';
$dbname = 'mi_proyecto';
$user = 'mi_usuario';
$pass = 'mi_contraseña_segura';
// Conectar con PDO
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Consultar artículos
$stmt = $pdo->query('SELECT * FROM articulos ORDER BY fecha DESC');
$articulos = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Artículos</title>
</head>
<body>
<h1>Artículos</h1>
<?php foreach ($articulos as $art): ?>
<article>
<h2><?= htmlspecialchars($art['titulo']) ?></h2>
<p><?= htmlspecialchars($art['cuerpo']) ?></p>
<small><?= $art['fecha'] ?></small>
</article>
<hr>
<?php endforeach; ?>
</body>
</html>
Abre http://localhost/articulos.php. Deberías ver los dos artículos que insertaste.
¿Qué ha ocurrido?
El flujo completo que describíamos en la introducción acaba de funcionar de verdad:
- El navegador envió
GET /articulos.phppor HTTP. - Apache recibió la petición y la pasó al intérprete PHP.
- PHP se conectó a MySQL, ejecutó la consulta y obtuvo los datos.
- PHP generó el HTML y se lo devolvió a Apache.
- Apache envió el HTML al navegador con código
200 OK.
Próximos pasos
Con el stack funcionando, el camino natural es:
- Crear un VirtualHost propio para tu proyecto en lugar de usar
/var/www/html/. - Configurar mod_rewrite para URLs limpias.
- Revisar
php.iniy ajustarlo para desarrollo local. - Explorar el manual de PHP para aprender a estructurar la lógica de la aplicación.
Has completado el manual de Redes y Servidores. Continúa con el manual de PHP para aprender a construir aplicaciones web sobre esta infraestructura.
- Anterior « php.ini
- Siguiente Fin del tema »