Apache en Producción: VirtualHosts, SSL Wildcard y DNS Local (La Base)

Si llevas tiempo trasteando en tu Homelab, seguro que has pasado por la fase de editar el archivo hosts de tu PC cada vez que creas un proyecto nuevo. Spoiler: es una mala práctica. Si quieres profesionalizarte y dejar de jugar, necesitas replicar una infraestructura real.

En Millaredos nos hemos propuesto construir un entorno de desarrollo definitivo, y esta es la primera entrega de una serie donde transformaremos un servidor Linux básico en una bestia de productividad.

La hoja de ruta de esta serie será:

  1. La Base (Estás aquí): Servidor Web Apache seguro con HTTPS y DNS centralizado.
  2. El Código: Sistema de versionado con Gitea (nuestro GitHub privado) y CI/CD.
  3. Los Datos: Servidor de Base de Datos (MariaDB) accesible en red.
  4. El Flujo: Entorno de desarrollo remoto conectado a VS Code.

Hoy, nos ponemos el casco de obra para cimentar la base: Apache, SSL y DNS.

🛠️ El Escenario: Tu Laboratorio Virtual

Para seguir esta guía, partimos de una infraestructura de red con dominio propio (Active Directory). En nuestro caso, hemos usado millaredos.local.

No importa si virtualizas sobre Hyper-V (con Windows Server 2022 o 2012 R2 como base 1111) o si eres del equipo Proxmox. Lo esencial es que tengas:

  • Un Controlador de Dominio (DC): Windows Server gestionando el DNS.
  • Un Servidor Web: Una VM con Debian (recomendado por su robustez frente a Windows para servir web 2222).
  • Clientes: Equipos unidos al dominio para las pruebas.

💡 ¿Aún no tienes tu laboratorio listo?

Si empiezas de cero, echa un vistazo a nuestra guía sobre cómo crear un entorno de pruebas en Proxmox y configura tus clientes con Windows 11 en laboratorio. Son el punto de partida ideal.


Paso 1: DNS Centralizado (El Maestro de la Orquesta)

Olvídate de editar archivos locales. Si tienes un Controlador de Dominio, úsalo. La forma correcta de que tus equipos encuentren tus webs es mediante registros DNS tipo A 3.

1.1. Obtener la IP del Servidor Web

En tu terminal Debian, averigua su IP con:

Bash

hostname -I

(Supongamos que es 192.168.1.50 4).

1.2. Crear Registros en el DC

Vete a tu Windows Server, abre el Administrador de DNS (dnsmgmt.msc) y, en tu zona de búsqueda directa (millaredos.local), crea estos registros apuntando a la IP de tu Debian 5:

Nombre (Host)Dirección IPFunción
web192.168.1.50Servidor principal (Dashboard)
gitea192.168.1.50Ojo: Lo usaremos para el repositorio en el siguiente post.
w12192.168.1.50Proyecto 1
w13192.168.1.50Proyecto 2

Una vez hecho, lanza un ipconfig /flushdns en tus clientes6. Si haces ping a w12.millaredos.local y responde la IP del Debian, ya tienes la mitad del trabajo hecho7.


Paso 2: Apache y Estructura de Carpetas

En Debian, como usuario root, instalamos el stack básico. Nada de sudo si ya eres root8888:

Bash

apt update && apt install apache2 php libapache2-mod-php -y

El orden es vital. Vamos a crear una estructura limpia para alojar los proyectos separados 9:

Bash

mkdir -p /var/www/w12
mkdir -p /var/www/w13
mkdir -p /var/www/html # Para el Dashboard general

Paso 3: SSL Wildcard Autofirmado (Adiós alertas rojas)

Aquí es donde subimos el nivel. En un entorno local, usar HTTP es «cutre». Vamos a forzar HTTPS con un certificado Wildcard (*.millaredos.local) para cifrar todo el tráfico.

3.1. Instalación en el Servidor

Movemos los certificados (.pem y .key) a las rutas seguras de Debian y ajustamos permisos estrictos para la clave privada 10:

Bash

mv certificate.pem /etc/ssl/certs/millaredos.local.pem
mv private.key /etc/ssl/private/millaredos.local.key
chmod 600 /etc/ssl/private/millaredos.local.key
a2enmod ssl # Activamos el módulo SSL

🗣️ ¿Quieres crear tu propia Autoridad Certificadora (CA)?

Generar estos certificados correctamente da para un artículo entero. Si os interesa que explique cómo crear una CA Raíz y firmar vuestros propios wildcards para que duren años, dejádmelo en los comentarios y prepararé un tutorial detallado.

3.2. El «Truco» de la Confianza en Clientes

Como el certificado es propio, los navegadores de tu red no confiarán en él por defecto. La solución profesional es instalar el certificado público (.pem) en el almacén de «Entidades de certificación raíz de confianza» de tus equipos Windows11.

El detalle de Firefox: Ojo, porque Firefox va por libre e ignora el almacén de Windows. Tendrás que importar el certificado manualmente en sus ajustes y marcar la casilla «Confiar en esta CA para identificar sitios web» 12. Si no lo haces, seguirás viendo la alerta de seguridad.


Paso 4: VirtualHosts Profesionales (La Configuración Final)

Vamos a configurar Apache con una lógica de «Plan A y Plan B».

El «Plan B»: Dashboard Catch-all

Si alguien pone la IP a pelo o un nombre que no existe, queremos que caiga en un Dashboard seguro, no en un error. Crea el archivo /etc/apache2/sites-available/000-dashboard.conf (el 000 asegura que cargue primero) 13:

Apache

<VirtualHost *:80>
    ServerName web.millaredos.local
    ServerAlias localhost 192.168.1.50
    DocumentRoot /var/www/html
    # Permisos básicos
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    # Configuración HTTPS idéntica apuntando al Dashboard
    ServerName web.millaredos.local
    SSLEngine On
    SSLCertificateFile /etc/ssl/certs/millaredos.local.pem
    SSLCertificateKeyFile /etc/ssl/private/millaredos.local.key
    DocumentRoot /var/www/html
    # ... (mismo bloque Directory)
</VirtualHost>

El «Plan A»: Tus Proyectos Reales

Ahora definimos los proyectos. Fíjate en el detalle: redirigimos forzosamente HTTP a HTTPS. Crea /etc/apache2/sites-available/999-talay-final.conf14141414:

Apache

# PROYECTO W12
<VirtualHost *:80>
    ServerName w12.millaredos.local
    Redirect permanent / https://w12.millaredos.local/
</VirtualHost>

<VirtualHost *:443>
    ServerName w12.millaredos.local
    DocumentRoot /var/www/w12
    
    # SSL Obligatorio
    SSLEngine On
    SSLCertificateFile /etc/ssl/certs/millaredos.local.pem
    SSLCertificateKeyFile /etc/ssl/private/millaredos.local.key
    
    <Directory /var/www/w12>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

# ... Repetir bloque para w13, w14, etc.

Paso 5: Despliegue y Verificación

Para terminar, activamos los módulos necesarios (proxy para el futuro Gitea), habilitamos los sitios nuevos y limpiamos el default 15:

Bash

a2enmod proxy proxy_http headers rewrite
a2ensite 000-dashboard.conf 999-talay-final.conf
a2dissite 000-default.conf

Antes de reiniciar, siempre, siempre verifica la sintaxis16:

Bash

apache2ctl configtest

Si recibes un Syntax OK, reinicia el servicio17:

Bash

systemctl restart apache2

¿El Resultado?

Ahora tienes un servidor web que responde por HTTPS, con un DNS centralizado y listo para escalar. Si entras a http://w12.millaredos.local, saltarás automáticamente a la versión segura.

🔜 En el próximo artículo: Aprovecharemos esa entrada DNS gitea que creamos hoy. Vamos a instalar Gitea en modo «Bare Metal» (sin Docker, para máximo rendimiento) y configuraremos un Proxy Inverso en Apache para ocultar el puerto 3000. ¡Suscríbete para no perdértelo!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Francisco Crespo.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a Hostinger que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.