README - Guía Completa de Proxy Inverso en Apache

Hola. ¡Bienvenido! Esta guía te ayudará a configurar un **proxy inverso** en Apache, paso a paso y sin complicaciones. No necesitas ser un experto en Linux ni en redes. He preparado esta guía para que sea fácil de seguir y entender. Con esta configuración, podrás hacer que tu servidor principal (el **proxy**) muestre varias páginas web que están en otros servidores, como si todas estuvieran en una sola página principal.


1. Habilitar los Módulos de Apache

Los módulos son como "superpoderes" para Apache. Para que el proxy funcione, necesitas activar los módulos que hacen el trabajo de reenvío y reescritura de direcciones. Simplemente copia y pega este comando en tu terminal.

# Habilita los módulos esenciales. Si te pide tu contraseña, escríbela y presiona Enter.
sudo a2enmod proxy proxy_http proxy_html proxy_wstunnel headers

Si más adelante quieres usar HTTPS (conexión segura), también puedes habilitar el módulo SSL.

sudo a2enmod ssl

2. Configurar el Puerto de Escucha

Tu servidor Apache debe "escuchar" en un puerto específico para saber dónde recibir las solicitudes de los usuarios. Si ya usas el puerto 80 (el predeterminado para HTTP), puedes usar un puerto diferente para el proxy, como el 9090. Para configurarlo, abre el archivo /etc/apache2/ports.conf y añade una línea.

# Contenido del archivo /etc/apache2/ports.conf
Listen 80
Listen 443
Listen 9090  <-- Añade esta línea y guarda los cambios

3. Crear y Entender el VirtualHost

Imagina un **VirtualHost** como una recepcionista que decide a dónde enviar a cada visitante. Esta recepcionista recibe a los usuarios que llegan a tu servidor y, según la dirección que piden (por ejemplo, /page1/), los envía al servidor correcto sin que ellos se den cuenta.

Aquí te explico las directivas clave que usarás en el archivo de configuración.

El código de VirtualHost que necesitas está en la sección "Ejemplo de VirtualHost Completo" de más abajo.


4. Cómo Poner en Marcha tu Configuración

Sigue estos sencillos pasos para activar tu archivo de configuración de Apache.

  1. Crear el archivo: Copia el código de la sección 6 de esta guía y pégalo en un archivo. Luego, usa nano para guardarlo en la ubicación correcta.
  2. sudo nano /etc/apache2/sites-available/mi-proxy.conf
  3. Habilitar el sitio: Este comando le dice a Apache que use el archivo que acabas de crear.
  4. sudo a2ensite mi-proxy.conf
  5. Verificar la sintaxis: Siempre revisa que no haya errores antes de reiniciar. Si todo está bien, verás el mensaje `Syntax OK`.
  6. sudo apache2ctl configtest
  7. Reiniciar Apache: Finalmente, reinicia el servicio para aplicar todos los cambios.
  8. sudo systemctl restart apache2

5. Ejemplo de VirtualHost Completo

Copia y pega este código en tu archivo .conf. Está diseñado para resolver los problemas más comunes de un proxy.

<VirtualHost *:9090>
    ServerName 172.164.10.133

    # Directiva que evita errores de decodificación (ERR_CONTENT_DECODING_FAILED)
    RequestHeader unset Accept-Encoding

    # MApeo de rutas para page1
    # Le dice a Apache que todo lo que se cargue desde la raíz (/) del servidor real,
    # lo muestre bajo el subfijo /page1/ en tu proxy.
    ProxyHTMLEnable On
    ProxyHTMLURLMap / /page1/

    # Redireccionamiento para el subfijo /page1/
    ProxyPass /page1/ http://172.164.10.134/
    ProxyPassReverse /page1/ http://172.164.10.134/

    # Mapeo de rutas para page2
    # Si quieres agregar otro subfijo, debes repetir la directiva ProxyHTMLURLMap
    # para ese subfijo en particular.
    ProxyHTMLURLMap / /page2/

    # Redireccionamiento para el subfijo /page2/
    ProxyPass /page2/ http://172.164.10.135/
    ProxyPassReverse /page2/ http://172.164.10.135/

    # Redireccionamiento para WebSockets (si tu aplicación los usa)
    # Debes hacerlo para cada subfijo que necesite WebSockets.
    ProxyPass /page1/ws/ ws://172.164.10.134/ws/
    ProxyPassReverse /page1/ws/ ws://172.164.10.134/ws/

    ProxyPass /page2/ws/ ws://172.164.10.135/ws/
    ProxyPassReverse /page2/ws/ ws://172.164.10.135/ws/
</VirtualHost>

Ejemplos Adicionales de ProxyPass

Puedes combinar las reglas como quieras, pero recuerda que las más específicas (con rutas más largas) deben ir antes que las más genéricas (con rutas más cortas).

# Acceso a http://proxy-ip:puerto/proyecto1/ y lo redirige a la raíz del servidor de destino
ProxyPass /proyecto1/ http://ip-del-servidor-1/
ProxyPassReverse /proyecto1/ http://ip-del-servidor-1/

# Acceso a http://proxy-ip:puerto/proyecto2/ y lo redirige a un subdirectorio en el servidor de destino
ProxyPass /proyecto2/ http://ip-del-servidor-2/aplicacion-web/
ProxyPassReverse /proyecto2/ http://ip-del-servidor-2/aplicacion-web/

# Si el proxy solo maneja un servidor, puedes redirigir la raíz del proxy a la raíz del servidor
ProxyPass / http://ip-del-servidor-3/
ProxyPassReverse / http://ip-del-servidor-3/

6. Archivos de Prueba

Crea estos archivos en tu servidor de origen para asegurarte de que la configuración funcione. Así puedes comprobar que los archivos CSS y JavaScript se cargan correctamente a través del proxy.

1. index.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Prueba de Proxy Inverso</title>
    <link rel="stylesheet" href="css/estilos.css">
</head>
<body>
    <div class="card">
        <h1>¡Configuración Exitosa!</h1>
        <p>Esta página se cargó a través del proxy inverso.</p>
        <p>Te redirigiré en 5 segundos. Puedes hacer clic en el botón ahora.</p>
        <button id="redirigirBtn" class="button">Ir ahora</button>
    </div>
    <script src="js/script.js"></script>
</body>
</html>

2. css/estilos.css

body {
            background: linear-gradient(-45deg, #001f3f, #007bff, #28a745, #17a2b8);
            background-size: 400% 400%;
            animation: gradientBG 15s ease infinite;
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        @keyframes gradientBG {
            0% { background-position: 0% 50%; }
            50% { background-position: 100% 50%; }
            100% { background-position: 0% 50%; }
        }
        .card {
            background-color: rgba(0, 0, 0, 0.8);
            padding: 30px;
            border-radius: 10px;
            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.4);
            text-align: center;
            transition: transform 0.3s ease;
            color: #d4edda;
        }
        .card:hover { transform: translateY(-5px); }
        .button {
            padding: 10px 20px;
            margin-top: 10px;
            border: none;
            border-radius: 5px;
            background-color: #28a745;
            color: white;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s ease;
        }
        .button:hover { background-color: #17a2b8; }

3. js/script.js

document.addEventListener('DOMContentLoaded', () => {
    setTimeout(() => {
        window.location.href = "pagina2.html";
    }, 5000);
    const btn = document.getElementById('redirigirBtn');
    if (btn) {
        btn.addEventListener('click', () => {
            window.location.href = "pagina2.html";
        });
    }
});

7. Solución de Problemas Comunes

Si algo no funciona, no te preocupes. Aquí tienes algunas soluciones para los errores más comunes.

¡Esperamos que esta guía te sea de gran ayuda!