LAMP
LAMP
Un entorno LAMP es un conjunto de software de código abierto que se utiliza para crear y
alojar sitios web dinámicos y aplicaciones. El acrónimo significa:
● Linux: El sistema operativo.
● Apache: El servidor web.
● MySQL: El sistema de gestión de bases de datos.
● PHP: El lenguaje de programación del lado del servidor.
Juntos, estos componentes forman una plataforma robusta y flexible para el desarrollo web.
Este tutorial se centra en la instalación en Ubuntu, una de las distribuciones de Linux más
populares.
Requisitos previos
Apache es el servidor web que mostrará tu sitio a los visitantes. Para instalarlo, ejecuta el
siguiente comando:
MySQL es el servidor de bases de datos que almacenará la información de tu sitio web (como
usuarios, posts, etc.). Instálalo con el siguiente comando:
Después de la instalación, es una buena práctica ejecutar un script de seguridad que viene
con MySQL. Esto te ayudará a asegurar tu base de datos eliminando usuarios de prueba y
configuraciones inseguras.
sudo mysql_secure_installation
El script te hará varias preguntas. Para la mayoría de los usuarios, es seguro responder Y (sí) a
todas las preguntas. Se te pedirá que configures una contraseña para el usuario root de
MySQL.
Paso 3: Instalar PHP
PHP es el lenguaje de programación que procesa el código de tu sitio web para generar
HTML. Instala PHP y algunos módulos necesarios para que funcione con Apache y MySQL:
Ahora que todos los componentes están instalados, es crucial verificar que están
funcionando juntos correctamente.
Vamos a crear un archivo llamado info.php en el directorio raíz de Apache para verificar la
configuración. El directorio raíz de Apache en Ubuntu es /var/www/html/.
1. Abre un editor de texto con privilegios de administrador para crear el archivo:
sudo nano /var/www/html/info.php
2. En el archivo, pega el siguiente código PHP:
<?php phpinfo(); ?>
3. Guarda el archivo (Ctrl + O, Enter) y sal del editor (Ctrl + X).
4. Abre tu navegador y visita http://localhost/info.php.
Deberías ver una página con información detallada sobre tu instalación de PHP, incluyendo la
versión y los módulos activos. Si ves esta página, ¡felicidades! Tu entorno LAMP está
funcionando.
Para administrar tus bases de datos, puedes usar la línea de comandos de MySQL.
Para desarrollar múltiples proyectos en tu máquina, es una buena práctica usar Hosts
Virtuales en Apache. Esto te permite tener diferentes dominios locales (como
http://mi-proyecto.local) para cada proyecto.
Por seguridad, el usuario www-data de Apache debe tener los permisos correctos para
acceder a tu directorio. Si estás trabajando con un editor de código como Visual Studio Code,
también necesitas permisos.
Para que tu navegador sepa que mi-proyecto.local debe apuntar a tu máquina local, debes
modificar el archivo hosts.
1. sudo nano /etc/hosts
2. Añade la siguiente línea al final del archivo:
127.0.0.1 mi-proyecto.local
3. Guarda y sal.
Uso y Mantenimiento
● Administración de bases de datos: Para una gestión más sencilla de las bases de
datos, puedes instalar una herramienta web como phpMyAdmin.
sudo apt install phpmyadmin
Sigue las instrucciones de instalación en pantalla. Una vez completado, podrás acceder a
phpMyAdmin en http://localhost/phpmyadmin.
● Reiniciar servicios: Si realizas cambios en la configuración de Apache o MySQL, es
posible que necesites reiniciar los servicios:
sudo systemctl restart apache2
sudo systemctl restart mysql
● Deshabilitar un host virtual:
sudo a2dissite mi-proyecto.conf
Este tutorial te ha proporcionado una base sólida para instalar, configurar y usar tu propio
entorno de desarrollo LAMP. Con esta configuración, puedes empezar a crear aplicaciones
web y bases de datos en tu máquina local.
Proyecto de ejemplo
Agenda
Estructura del Proyecto y Configuración de la Base de Datos
Estructura de Directorios
Bash
/var/www/html/agenda/
├── index.php
├── crear.php
├── editar.php
├── eliminar.php
├── db.php
└── estilos.css
Utilizaremos MySQL para almacenar los datos de la agenda. Abre tu terminal y accede a
MySQL con el usuario root (o el usuario que hayas configurado).
Bash
SQL
El siguiente paso es crear el script de conexión a la base de datos y la página principal que
mostrará la lista de contactos.
Archivo db.php
Este archivo contendrá la lógica de conexión. Utilizaremos la extensión PDO (PHP Data
Objects), que es más segura y moderna que las funciones de MySQL antiguas.
/var/www/html/agenda/db.php
PHP
<?php
$host = 'localhost';
$db = 'agenda';
$user = 'root'; // Cambia esto si no usas root
$pass = 'tu_contraseña'; // Cambia por tu contraseña de MySQL
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
throw new \PDOException($e->getMessage(), (int)$e->getCode());
}
?>
Archivo index.php
Este archivo se encargará de mostrar la tabla de contactos y los enlaces para las operaciones
CRUD.
/var/www/html/agenda/index.php
PHP
<?php
require 'db.php';
$stmt = $pdo->query('SELECT * FROM contactos');
$contactos = $stmt->fetchAll();
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Agenda de Contactos</title>
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<h1>Agenda de Contactos</h1>
<p><a href="crear.php">Agregar nuevo contacto</a></p>
<table>
<thead>
<tr>
<th>Nombre</th>
<th>Teléfono</th>
<th>Correo</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($contactos as $contacto): ?>
<tr>
<td><?= htmlspecialchars($contacto['nombre']) . ' ' .
htmlspecialchars($contacto['apellidos']) ?></td>
<td><?= htmlspecialchars($contacto['telefono']) ?></td>
<td><?= htmlspecialchars($contacto['correo']) ?></td>
<td>
<a href="editar.php?id=<?= $contacto['id'] ?>">Editar</a> |
<a href="eliminar.php?id=<?= $contacto['id'] ?>" onclick="return confirm('¿Estás
seguro de que quieres eliminar este contacto?')">Eliminar</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>
Los siguientes archivos contendrán los formularios y la lógica para crear y actualizar los
registros en la base de datos.
Archivo crear.php
Este archivo mostrará un formulario y procesará los datos para insertar un nuevo contacto en
la base de datos.
/var/www/html/agenda/crear.php
PHP
<?php
require 'db.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "INSERT INTO contactos (nombre, apellidos, telefono, correo, domicilio) VALUES (?, ?, ?, ?, ?)";
$stmt= $pdo->prepare($sql);
$stmt->execute([
$_POST['nombre'],
$_POST['apellidos'],
$_POST['telefono'],
$_POST['correo'],
$_POST['domicilio']
]);
header('Location: index.php');
exit;
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Crear Contacto</title>
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<h1>Crear Contacto</h1>
<form method="post">
<label>Nombre: <input type="text" name="nombre" required></label><br>
<label>Apellidos: <input type="text" name="apellidos" required></label><br>
<label>Teléfono: <input type="text" name="telefono"></label><br>
<label>Correo: <input type="email" name="correo"></label><br>
<label>Domicilio: <input type="text" name="domicilio"></label><br>
<button type="submit">Guardar</button>
<a href="index.php">Cancelar</a>
</form>
</body>
</html>
Archivo editar.php
Este archivo recuperará los datos de un contacto por su ID, los mostrará en un formulario y, al
enviarlo, actualizará el registro.
/var/www/html/agenda/editar.php
PHP
<?php
require 'db.php';
$id = $_GET['id'] ?? null;
if (!$id) {
header('Location: index.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$sql = "UPDATE contactos SET nombre=?, apellidos=?, telefono=?, correo=?, domicilio=? WHERE
id=?";
$stmt= $pdo->prepare($sql);
$stmt->execute([
$_POST['nombre'],
$_POST['apellidos'],
$_POST['telefono'],
$_POST['correo'],
$_POST['domicilio'],
$id
]);
header('Location: index.php');
exit;
} else {
$stmt = $pdo->prepare('SELECT * FROM contactos WHERE id = ?');
$stmt->execute([$id]);
$contacto = $stmt->fetch();
if (!$contacto) {
header('Location: index.php');
exit;
}
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Editar Contacto</title>
<link rel="stylesheet" href="estilos.css">
</head>
<body>
<h1>Editar Contacto</h1>
<form method="post">
<input type="hidden" name="id" value="<?= htmlspecialchars($contacto['id']) ?>">
<label>Nombre: <input type="text" name="nombre" value="<?=
htmlspecialchars($contacto['nombre']) ?>" required></label><br>
<label>Apellidos: <input type="text" name="apellidos" value="<?=
htmlspecialchars($contacto['apellidos']) ?>" required></label><br>
<label>Teléfono: <input type="text" name="telefono" value="<?=
htmlspecialchars($contacto['telefono']) ?>"></label><br>
<label>Correo: <input type="email" name="correo" value="<?=
htmlspecialchars($contacto['correo']) ?>"></label><br>
<label>Domicilio: <input type="text" name="domicilio" value="<?=
htmlspecialchars($contacto['domicilio']) ?>"></label><br>
<button type="submit">Actualizar</button>
<a href="index.php">Cancelar</a>
</form>
</body>
</html>
Archivo eliminar.php
Este script se encargará de eliminar un contacto basado en el ID que se recibe por la URL.
/var/www/html/agenda/eliminar.php
PHP
<?php
require 'db.php';
$id = $_GET['id'] ?? null;
if ($id) {
$stmt = $pdo->prepare('DELETE FROM contactos WHERE id = ?');
$stmt->execute([$id]);
}
header('Location: index.php');
exit;
Añadir un archivo de estilos simples hará que la interfaz se vea mucho mejor.
/var/www/html/agenda/estilos.css
CSS
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
color: #333;
padding: 20px;
}
h1, h2 {
color: #0056b3;
}
p {
margin-bottom: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
th, td {
padding: 12px;
border: 1px solid #ddd;
text-align: left;
}
th {
background-color: #007bff;
color: white;
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
form {
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 10px;
}
input[type="text"], input[type="email"] {
width: 100%;
padding: 8px;
margin-top: 5px;
border: 1px solid #ccc;
box-sizing: border-box;
}
button, a.button {
background-color: #007bff;
color: white;
padding: 10px 15px;
border: none;
border-radius: 4px;
cursor: pointer;
text-decoration: none;
}
button:hover, a.button:hover {
background-color: #0056b3;
}