Многодокерный контейнер NGINX + FLASK: отсутствует апстрим приложения, определенный через localhost - PullRequest
0 голосов
/ 13 февраля 2019

РЕДАКТИРОВАТЬ: я проверил, и кажется, что Azure предоставляет сетевой мост по умолчанию, для которого тогда решение localhost работает нормально.

Я запускаю составную Docker-компоновку из двух контейнеров NGINX + Gunicorn & Flask, и я хочу установитьNGINX в качестве обратного прокси для приложения.Я пытаюсь заставить его работать в облаке AZURE в качестве CLI, но мой Nginx не может найти восходящий поток, поступающий из приложения.На моей локальной машине я получаю это, указав в конфигурации nginx имя контейнера и соответствующий незащищенный порт, который в облаке, похоже, не работает.

Я попытался изменить proxy_pass на localhost (тот же порт),но в этом случае он не работает даже на моей локальной машине, возвращая ошибку 502 Bad Gateway.В любом случае я могу отправлять запросы в приложение через браузер или любым другим способом.Nginx работает с супервизором.Gunicorn работает с 1 рабочим (gthread) с 4 различными потоками.

здесь мой nginx.conf (тот, который входит в комплект):

server {    
    listen 80;

    location / {        
        try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        proxy_pass http://mycontainer:5000;
        # proxy_pass http://localhost:5000;
    }
}

и здесь основной:

user  nginx;
worker_processes  1;

error_log  /app/logs/nginx_error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format main '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"' ;

    access_log /app/logs/nginx_access.log main;

    sendfile        on;

    keepalive_timeout  65;

    include /etc/nginx/conf.d/*.conf;
}
daemon off;

1 Ответ

0 голосов
/ 13 февраля 2019

Если и nginx, и приложение запускаются в контейнерах, то ..

Чтобы ваши контейнеры (или службы) могли находить друг друга, они должны принадлежать к одной сети.Поэтому вам нужно позвонить

docker network create -d DRIVER_NAME YOUR_NETWORK_NAME

. В зависимости от того, что вы делаете (автономные контейнеры или службы роя), вам нужно выбрать между bridge или overlay сетевой драйвер при создании сети.

Затем вы запускаете Docker Run или Docker Service создаете с использованием - сеть флаг и передача имени вашей сети.

Также в конфигурации nginx должно быть что-то вроде следующего

    server {
  listen 80;                      # host port - used by proxy
  server_name localhost;
  resolver 127.0.0.11 valid=10s ipv6=off;     # 127.0.0.11 the static IP address of the internal DNS server of the swarm
  set $upstream YOUR_SERVICE_NAME;            # mandatory when not using the upstream section              
  client_max_body_size 0;                     # disable any limits to avoid HTTP 413 for large image uploads

  location / {
    proxy_pass         http://$upstream:YOUR_SERVICE_PORT;
    proxy_read_timeout 900;
    #proxy_redirect     off;          # do not re-write the Location and Refresh header fields of an upstream server
    proxy_set_header   Host $host;          # required for docker
    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;               
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Referer $http_referer;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection 'upgrade';
    proxy_cache_bypass $http_upgrade;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...