Contenedor de Nginx como proxy para el contenedor de la aplicación Flask: problema con el dominio y el método Flask.redirect().
Tengo una aplicación Flask en el primer contenedor y NGINX en el segundo, ambos alojados en el mismo servidor. En NGINX quiero tener un proxy al primer contenedor, el cual no tiene puertos expuestos porque quiero que NGINX sirva la aplicación con HTTPS. Mi nginx.conf se ve así:
http {
server {
server_name hostname.dominio;
listen 443 ssl;
ssl_certificate /hostname_dominio.cer;
ssl_certificate_key /hostname_dominio.key;
location / {
proxy_pass http://172.17.0.5:80; # IP del contenedor de la aplicación Flask
}
}
}
La aplicación funciona bien cuando ingreso a https://hostname.dominio, pero cuando activo el método de redireccionamiento de Flask, como este:
return redirect(url_for("view.whatever"))
me redirecciona a http://172.17.0.5/whatever en lugar de https://hostname.dominio/whatever. ¿Cómo puedo solucionarlo y qué está causando este comportamiento? ¡Gracias por cualquier respuesta!
davy.ai
El problema aquí es con la generación de URL de Flask. Flask genera URLs basadas en la URL de la solicitud, y en este caso, dado que la solicitud proviene del servidor NGINX, Flask genera una URL con la dirección IP del servidor NGINX (172.17.0.5) en lugar del nombre de host de dominio que queremos.
Para solucionar esto, debemos indicarle a Flask que genere URLs basadas en los encabezados X-Forwarded-Proto y X-Forwarded-Host que establece NGINX al reenviar las solicitudes al contenedor de la aplicación Flask. Para hacer esto, debemos agregar las siguientes líneas a nuestro archivo nginx.conf:
Esto configura NGINX para establecer los encabezados X-Forwarded-Proto y X-Forwarded-Host con los valores apropiados para la solicitud, y reenviar esos encabezados al contenedor de la aplicación Flask.
Luego, debemos indicarle a Flask que utilice estos encabezados al generar URLs. Podemos hacer esto configurando los valores de configuración
SERVER_NAME
yPREFERRED_URL_SCHEME
en nuestra aplicación Flask:Al configurar
SERVER_NAME
con nuestro valor de nombre de host de dominio yPREFERRED_URL_SCHEME
con ‘https’, Flask generará URLs con el nombre de host y el protocolo correctos cuando usemosurl_for
yredirect
.Con estos cambios, nuestra configuración de NGINX se vería así:
Ten en cuenta que hemos cambiado el valor de
proxy_pass
para utilizar el nombre de host del contenedor de la aplicación Flask en lugar de su dirección IP. También hemos agregado las directivasproxy_set_header
para reenviar los encabezados necesarios a la aplicación Flask.Con estos cambios, la redirección de Flask debería funcionar según lo esperado y redirigir a https://nombredehost.dominio/loquesea.