Cómo configurar virtual hosts en distribuciones Linux basadas en Debian

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.

  1. Creación del host: Se genera el archivo en sites-available. La directiva AllowOverride All es vital para que funcionen los archivos .htaccess (comunes en WordPress o Laravel).

  2. Resolución de nombres: Se añade el dominio al archivo /etc/hosts. Esto hace que tu ordenador resuelva miproyecto.local hacia tu propia IP (127.0.0.1) en lugar de buscarlo en internet.

  3. Activación: El comando a2ensite crea el enlace simbólico hacia sites-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.