Apuntes sobre Redes

Access.log, donde habitan los monstruos.

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:

  1. El navegador envió GET /articulos.php por HTTP.
  2. Apache recibió la petición y la pasó al intérprete PHP.
  3. PHP se conectó a MySQL, ejecutó la consulta y obtuvo los datos.
  4. PHP generó el HTML y se lo devolvió a Apache.
  5. 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.ini y 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.

TOP