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

Configurar proyectos web en local suele empezar con la típica dirección <code>localhost/mi-proyectocode>. 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 <code>tienda.localcode>) 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 <code>/etc/apache2/code>:

  • 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 <code>.confcode> con las reglas, un enlace simbólico que lo active y una entrada en tu "agenda" del sistema (el archivo <code>/etc/hostscode>). Esta estructura permite que el archivo principal de Apache simplemente contenga la línea <code>IncludeOptional sites-enabled/*.confcode>, 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 (<code>crear-sitio.shcode>):

<code class="code-container formatted ng-tns-c1743905215-197">#!/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 "-----------------------------------------------"
code>

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 <code>www-datacode> (el "usuario" de Apache), asegurando que el servidor pueda leer los archivos.

  1. Creación del host: Se genera el archivo en <code>sites-availablecode>. La directiva <code>AllowOverride Allcode> es vital para que funcionen los archivos <code>.htaccesscode> (comunes en WordPress o Laravel).

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

  3. Activación: El comando <code>a2ensitecode> crea el enlace simbólico hacia <code>sites-enabledcode>. Es una herramienta escrita en Perl que evita errores de rutas manuales.

Matices y verificación

Una vez terminado, puedes usar <code>sudo apache2ctl -Scode> para ver el listado de todos tus dominios activos.

Ten en cuenta que en Debian puro, es posible que debas entrar como root con <code>su -code> 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 <code>/usr/share/phpmyadmincode>) 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.