Configurar proyectos web en local suele empezar con la típica dirección localhost/mi-proyecto. Aunque funciona, es poco profesional y mezcla todas las configuraciones en un mismo saco. La solución técnica es el host virtual (virtual host), que permite que tu ordenador asocie un nombre de dominio falso (como tienda.local) a una carpeta específica de tu disco duro.
La anatomía de un sitio bien configurado
En Ubuntu y otras distribuciones basadas en Debian, Apache organiza los sitios en dos carpetas clave dentro de /etc/apache2/:
-
sites-available: donde guardas los borradores de tus configuraciones.
-
sites-enabled: donde Apache busca los sitios que realmente deben estar encendidos.
Para que un sitio funcione, necesitas tres cosas: un archivo .conf con las reglas, un enlace simbólico que lo active y una entrada en tu "agenda" del sistema (el archivo /etc/hosts). Esta estructura permite que el archivo principal de Apache simplemente contenga la línea IncludeOptional sites-enabled/*.conf, cargando automáticamente todo lo que hayas activado.
Automatizando el proceso con un script
Escribir estos archivos a mano es repetitivo y propenso a errores. Por eso, hemos diseñado un pequeño programa que hace el trabajo sucio por ti: crea la carpeta, genera el archivo de configuración, añade el dominio a tus hosts locales y reinicia el servidor.
El código del script (crear-sitio.sh):
#!/bin/bash
# Comprobamos que tengas permisos de administrador
if [ "$EUID" -ne 0 ]; then
echo "Por favor, usa: sudo ./crear-sitio.sh"
exit
fi
# Recogemos la información necesaria
read -p "Dominio deseado (ej: miproyecto.local): " DOMAIN
read -p "Ruta de la carpeta (ej: /var/www/html/miproyecto): " DIR
# 1. Crear la carpeta si no existe y dar permisos al servidor
if [ ! -d "$DIR" ]; then
mkdir -p "$DIR"
chown -R www-data:www-data "$DIR"
echo "Carpeta creada en $DIR"
fi
# 2. Crear la configuración de Apache
echo "<VirtualHost *:80>
ServerName $DOMAIN
DocumentRoot $DIR
<Directory $DIR>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>" > "/etc/apache2/sites-available/$DOMAIN.conf"
# 3. Engañar al sistema para que reconozca el dominio local
if ! grep -q "$DOMAIN" /etc/hosts; then
echo "127.0.0.1 $DOMAIN" >> /etc/hosts
echo "Dominio añadido a /etc/hosts"
fi
# 4. Activar el sitio y refrescar el servidor
a2ensite "$DOMAIN.conf" > /dev/null
systemctl reload apache2
echo "-----------------------------------------------"
echo "¡Hecho! Entra en: http://$DOMAIN"
echo "-----------------------------------------------"
Explicación paso a paso de lo que ocurre
Cuando ejecutas este script, suceden cuatro eventos críticos:Gestión de archivos: El script verifica si la carpeta existe. Si no, la crea y le asigna el usuario www-data (el "usuario" de Apache), asegurando que el servidor pueda leer los archivos.
-
Creación del host: Se genera el archivo en
sites-available. La directivaAllowOverride Alles vital para que funcionen los archivos.htaccess(comunes en WordPress o Laravel). -
Resolución de nombres: Se añade el dominio al archivo
/etc/hosts. Esto hace que tu ordenador resuelvamiproyecto.localhacia tu propia IP (127.0.0.1) en lugar de buscarlo en internet. -
Activación: El comando
a2ensitecrea el enlace simbólico haciasites-enabled. Es una herramienta escrita en Perl que evita errores de rutas manuales.
Matices y verificación
Una vez terminado, puedes usar sudo apache2ctl -S para ver el listado de todos tus dominios activos.
Ten en cuenta que en Debian puro, es posible que debas entrar como root con su - si tu usuario no está en el grupo de sudoers. Además, si instalas aplicaciones como phpMyAdmin manualmente, asegúrate de indicar la ruta exacta (como /usr/share/phpmyadmin) cuando el script te lo pida.
Este método es universal para el ecosistema Debian. Al usarlo, garantizas que tu configuración sigue las mejores prácticas, facilitando la migración de tus proyectos a servidores de producción en el futuro.