ignaciolp-logo

Ignacio LP.



Proxy inverso con Nginx.



El proxy inverso

Un proxy es parecido a un middleware en el sentido de que se interpone entre medio de la comunicación de ambos, el inverso es porque es el contrario a un proxy normal, un proxy normal es un intermediario entre el cliente y el servidor, mientras que el inverso es un intermediario entre el servidor y el cliente.

Este proxy inverso son usados para redireccionar solicitudes según dominio, cache , etc. En este caso solo se usará para redireccionar una request a un container worker.



Servicio

El objetivo es redirigir cualquier entrada al servidor al puerto 5000 del localhost, en aquel puerto un servidor FLASK responde con un hello world, este proxy podría también redirigir a otro servidor.

            
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(port=5000)
            
            


Configuración nginx

Suponiendo que ya tienes un nginx configurado y corriendo, solo basta con agregar las siguientes lineas a tu servidor

                
location /{
    proxy_pass http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
}
               
            

En la primera linea proxy_pass redirige las solicitudes al servidor en cuestion, el resto de etiquetas son para pasar atributos a la request, y estas sean accesibles desde tu código Python.



Final

Usar un proxy inverso es altamente recomendado por su seguridad, no expones jamás al servidor, y puedes además configurarlo para atender según rutas o dominios, por ejemplo si tienes un dominio para tu api, y otro para tu frontend, puedes redirigir las solicitudes a cada uno de ellos.

Otro uso que me gustó mucho fue el uso de conexiones por medio de websockets, lo he probado con SignalR y no ha dado problemas, solo se debe configurar bien para que funcione correctamente.