Nginx como proxy inverso y balanceador

Nginx ha demostrado ser una solución integral para muchos servicios utiles de servidores e infraestructura TIC. En esta ocasión nos centraremos en dos, proxy inverso y balanceador de carga:

Un proxy inverso es un servidor que actúa como intermediario entre los clientes y los servidores de backend, ocultando la infraestructura interna del servidor y gestionando las solicitudes de los clientes antes de enviarlas al servidor adecuado. Sus funciones principales incluyen:

  • Seguridad: Oculta la IP del servidor backend y puede manejar SSL/TLS.

  • Cacheo: Almacena contenido estático para mejorar el rendimiento.

  • Redirección: Reenvía solicitudes a diferentes servidores según la configuración.


Pasos para Configurar el Proxy Inverso

  1. Pre-requisitos:

    • Instalar y ejecutar un servidor backend simple.

      • Por ejemplo, si usas Python con Flask:

        pip install flask

        Si no tienes instalado pip o python puedes hacerlo con sudo apt install python3-pip

      • Luego crea un archivo llamado app.py con la IP de tu servidor y el puerto deseado:

        from flask import Flask
        app = Flask(__name__)
        
        @app.route("/")
        def hello():
            return "Respuesta del servidor backend"
        
        if __name__ == "__main__":
            app.run(host="10.0.0.5", port=5000)

        Ejecuta el servidor:

        python3 app.py
      • Para más comodidad, puedes lanzar la aplicación como un proceso en segundo plano añadiendo & al final, veamos el proceso:

  • Ahora el servidor estará escuchando en http://10.0.0.5:5000, puedes comprobarlo a través de un equipo cliente.

  1. Configura Nginx como Proxy Inverso:

  • Ahora toca configurar l proxy como si fuera un host normal, crea y edita el archivo de configuración del sitio web (por ejemplo, /etc/nginx/sites-available/proxy):

  • Explicación:

    • proxy_pass: Redirige las peticiones a la URL del backend.

    • proxy_set_header: Transfiere encabezados adicionales para que el backend tenga información del cliente original.

  • A partir de aquí, son los mismos pasos que con un virtualhost.

  1. Habilita la configuración:

  • Crea un enlace simbólico para habilitar el sitio:

  • Recarga o reinicia Nginx:

  1. Prueba la configuración:

  • Envía una petición al proxy inverso:

  • Deberías recibir la respuesta del backend: "Respuesta del servidor backend".


Pasos para Configurar el Balanceo de Carga

Round Robin

En este caso crearemos un balanceador que seguirá un esquema de Round Robin por defecto, este es un algoritmo de balanceo de carga utilizado en entornos de redes y servidores para distribuir las solicitudes o tareas entre un conjunto de recursos. La idea básica detrás del algoritmo es bastante simple: asigna cada solicitud o tarea al siguiente recurso disponible en una lista circular.

En este enfoque, las solicitudes se distribuyen secuencialmente a través de la lista y cada servidor recibe una solicitud en secuencia, independientemente de su carga actual. Este método es simple pero no tiene en cuenta la carga actual de cada servidor.

Para ponerlo en práctica realizaremos algo muy simple:

  1. Pre-requisitos:

    • Ejecutamos dos instancias del servidor backend en diferentes puertos tal y como hemos visto anteriormente cambiándoles el puerto:

      • Por ejemplo, utilizando Flask:

        • En el puerto 5000:

        • En el puerto 5001:

  2. Configura el Balanceador de Carga:

    • Abre o crea un archivo de configuración para el balanceador (por ejemplo, /etc/nginx/sites-available/balanceador):

    • Explicación:

      • El bloque upstream define un grupo de servidores backend.

      • Nginx distribuye las peticiones entre estos servidores utilizando el algoritmo round-robin por defecto.

  3. Habilita la Configuración:

    • Crea un enlace simbólico:

    • Recarga Nginx:

  4. Prueba el Balanceo de Carga:

    • Envía múltiples peticiones al servidor balanceador:

    • Observa que las respuestas alternan entre las instancias de backend.

  5. Verifica los Logs:

    • Inspecciona los logs de acceso para validar que las peticiones se distribuyen entre los servidores:

🚧 NGINX proxy manager

Referencia: https://claudiu.psychlab.eu/post/homelab-4-install-and-configure-nginx-proxy-manager-with-ssl-wildcard-certs/

https://www.linuxtrainingacademy.com/http-load-balancing-nginx-video-cheatsheet-vagrantfile/

Última actualización