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.