1 votes

Proxying d'une application Flask avec gunicorn et nginx

J'ai une application Flask qui est actuellement servie sur une machine (appelée first_vm ) en utilisant la commande suivante dans supervisord :

gunicorn run:app -b 0.0.0.0:8002 -k socketio.sgunicorn.GeventSocketIOWorker --workers 1

Cette application fait également l'objet d'un proxy inverse localement sur le port 80 par nginx de telle sorte que http://first_vm/ servira l'application comme prévu.

Ce que je voudrais faire, c'est un reverse proxy de l'application sur un autre serveur (disons second_vm ), de sorte que http://second_vm/my_app sert l'application en frappant gunicorn sur first_vm:8002 .

Voici la configuration de nginx que je possède actuellement second_vm :

location /my_app {
    proxy_pass http://first_vm:8002/;

    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-Host $server_name;
}

Cette configuration fonctionne bien dans la mesure où elle sert mon application sur http://second_vm/my_app mais les fichiers statiques (par exemple, JS/CSS) ne sont pas servis correctement parce que le navigateur essaie de les récupérer à partir de http://second_vm/ au lieu de http://second_vm/my_app .

Par exemple, Chrome me dira qu'il Failed to load resource: the server responded with a status 404 dans le scénario suivant :

http://second_vm/blueprint/static/css/bootstrap.min.css   <-- what Chrome fails to fetch
http://second_vm/my_app/blueprint/static/css/bootstrap.min.css   <-- what it should fetch

Quelqu'un peut-il m'aider à faire fonctionner ce système ?

3voto

WigglesMcMuffin Points 31

Après de nombreux essais et tribulations, j'ai découvert un article de blog qui a résolu le problème pour moi aussi. http://albertoconnor.ca/blog/2011/Sep/15/hosting-django-under-different-locations Il mentionne Django, mais sinon il s'agit des mêmes logiciels (à savoir gunicorn et nginx) et la solution est la même car la cause première est la même.

Edita:

En fait, il manque à l'application Flask l'en-tête SCRIPT_NAME qui lui indique où se trouve l'application. proxy_set_header SCRIPT_NAME /my_app; est le premier point de départ, mais il faut ensuite corriger la redirection, car il y a aussi une correction des urls sous le capot, donc proxy_redirect http://first_vm:8002/my_app http://$host/my_app; devrait l'empêcher de faire des choses comme renvoyer des adresses relatives entre le premier_vm et le second_vm.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X