Cómo configurar Nginx con gunicorn y bokeh serve

Quiero servir una aplicación de matraz que utiliza un servicio de bokeh incorporado desde un servidor en mi red local. Para ilustrar hice un ejemplo usando elbokeh servir ejemplo y una imagen acoplable para replicar el servidor. La imagen de la ventana acoplable ejecuta Nginx y Gunicorn. Creo que hay un problema con mi configuración nginx enrutando las solicitudes a / bkapp uri.

He detallado el problema y proporcioné todo el código fuente en el siguienterepositorio de git

He comenzado una discusión sobrebokeh google group

Contenedor único

Para reducir la complejidad de ejecutar nginx en su propio contenedor, creé esta imagen que ejecuta nginx en el mismo contenedor que la aplicación web

Instalación

NOTA: Estoy usando Docker versión 17.09.0-ce

Descargue o clone el repositorio y navegue a este directorio (single_container).

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

construir

iniciar una sesión de terminal en un nuevo contenedor

# as root
docker run -ti single_container:latest

En el nuevo contenedor, inicie nginx

nginx

ahora comienza gunicorn

gunicorn -w 1 -b :8000 flask_gunicorn_embed:app

comienzo

en una terminal separada (en la máquina host) encuentre la dirección IP del contenedor single_container que está ejecutando

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

encontrar

PROBLEMA

Usando la IP que se encuentra arriba (con el contenedor ejecutándose) revise en firefox con el inspector. Como puede en la captura de pantalla anterior (consulte la carpeta de capturas de pantalla "single_container_broken.png" para ver en bruto la solicitud de obtención simplemente se bloquea

rompió_1

Sin embargo, puedo verificar que nginx está sirviendo los archivos estáticos navegando a / bkapp / static / (vea bokeh_recipe / single_container / nginx / bokeh_app.conf para la configuración)

estático

Otra peculiaridad es que trato de golpear el servidor bokeh incorporado directamente (con / bkapp /) pero termino con un 400 (¿denegado?)

bkapp

Nota sobre la aplicaciónpara reducir la complejidad de asignar dinámicamente los puertos disponibles a los trabajadores de tornados, codifiqué 46518 para que el puerto hablara con el servicio de bokehnginx config

Sé que puedes mirar bokeh_recipe / single_container / nginx / bokeh_app.conf pero quiero mostrarlo aquí. Creo que necesito configurar nginx para hacer explícito que la "solicitud" de bkapp al 127.0.0.1:46518 se origina desde el servidor, no desde el cliente.

## 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:8,000;
        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;
    }

}

Respuestas a la pregunta(0)

Su respuesta a la pregunta