Comment configurer Nginx avec gunicorn et bokeh

Je veux servir une application de flask qui utilise un service bokeh intégré depuis un serveur de mon réseau local. Pour illustrer mon propos, j’ai utilisé l’ exemple de l’exemple du service bokeh et une image du docker pour répliquer le serveur. L’image de Docker utilise Nginx et Gunicorn. Je pense qu’il y a un problème avec ma configuration nginx qui achemine les requêtes vers / bkapp uri.

J’ai détaillé le problème et fourni tout le code source dans le repository git suivant

J’ai commencé une discussion sur bokeh google group

Conteneur Unique

Afin de réduire la complexité de l’exécution de nginx dans son propre conteneur, j’ai créé cette image qui s’exécute dans le même conteneur que l’application Web.

Installation

NOTE: J’utilise la version 17.09.0-ce de Docker

Téléchargez ou clonez repo et accédez à ce répertoire (single_container).

# as root docker build -f Dockerfile -t single_container . 

construire

démarrer une session de terminal dans un nouveau conteneur

 # as root docker run -ti single_container:latest 

Dans le nouveau conteneur, commencez nginx

 nginx 

maintenant commencer gunicorn

 gunicorn -w 1 -b :8000 flask_gunicorn_embed:app 

début

dans un terminal séparé (sur la machine hôte) recherchez l’adresse IP du conteneur single_container que vous utilisez

 #as root docker ps # then do copy CONTAINER ID and inspect it docker inspect [CONTIANER ID] | grep IPAddress 

trouver

PROBLÈME

En utilisant IP trouvé ci-dessus (avec conteneur en cours d’exécution) consultez firefox avec inspecteur. Comme vous pouvez le faire dans la capture d’écran ci-dessus (voir le dossier des captures d’écran “single_container_broken.png” pour la demande de requête brute se bloque

cassé_1

Je peux vérifier que nginx sert les fichiers statiques en naviguant jusqu’à / bkapp / static / (voir bokeh_recipe / single_container / nginx / bokeh_app.conf pour config)

statique

Un autre problème est que j’essaye de bash directement le serveur bokeh intégré (avec / bkapp /) mais je me retrouve avec un 400 (refusé?)

bkapp

Note sur l’application

  • réduire la complexité de l’atsortingbution dynamic des ports disponibles aux travailleurs de la tornade J’ai codé en 46518 pour que le port parle au service bokeh

nginx config

Je sais que vous pouvez simplement regarder bokeh_recipe / single_container / nginx / bokeh_app.conf mais je veux le montrer ici. Je pense que je dois config nginx pour rendre explicite que la “demande” à bkapp à la 127.0.0.1:46518 provient du serveur et non du client.

 ## Define the parameters for a specific virtual host/server server { # define what port to listen on listen 80; # Define the specified charset to the “Content-Type” response header field charset utf-8; # Configure NGINX to deliver static content from the specified folder # NOTE this should be a docker volume shared from the bokehrecipe_web container (css, js for bokeh serve) location /bkapp/static/ { alias /home/flask/app/web/static/; autoindex on; } # Configure NGINX to reverse proxy HTTP requests to the upstream server (Gunicorn (WSGI server)) location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:$server_port; proxy_buffering off; } # deal with the http://127.0.0.1/bkapp/autoload.js (note hard coded port for now) location /bkapp/ { proxy_pass http://127.0.0.1:46518; } }