Невозможно отменить прокси с помощью докера Nginx с несколькими экземплярами контейнера - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь использовать контейнер nginx в качестве обратного прокси-сервера, который будет распределять нагрузку по нескольким экземплярам приложения фляги, для этого я использую docker-composer.

version: '3'
services:
  app:
    build:
      context:  ./app
      dockerfile: Dockerfile
    expose:
      - "8001"

  proxy:
    build:
      context:  ./nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
    links:
      - app

и мой файл докера nginx

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

, а мой файл докерства приложения

FROM python:3-alpine

RUN apk update && apk upgrade && pip install -U pip
RUN apk add --update alpine-sdk make gcc python3-dev python-dev libxslt-dev libxml2-dev libc-dev openssl-dev libffi-dev zlib-dev py-pip \
    && rm -rf /var/cache/apk/*

RUN set -x \
    && VER="17.03.0-ce" \
    && curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz \
    && tar -xz -C /tmp -f /tmp/docker-$VER.tgz \
    && mv /tmp/docker/* /usr/bin

WORKDIR /app
ADD . /app

RUN pip install --trusted-host pypi.python.org -r requirements.txt

EXPOSE 8001

CMD ["python3.6", "main.py"]

Я использую следующую команду для сборки

docker-compose build

и следующая команда для запуска контейнеров

docker-compose up -d --scale app=5

, которая показывает

Starting testapp_app_1 ... done
Creating testapp_app_2 ... done
Creating testapp_app_3 ... done
Creating testapp_app_4 ... done
Creating testapp_app_5 ... done

, но которую я проверяю в журналах докера, кажется, что все запросы являются серверами при тестированииappapp_app_1

мой файл конфигурации nginx

#worker_processes 4;

events { worker_connections 1024; }

http {
#    sendfile on;

#    upstream app_servers {
#        server app:8001;
#    }

    server {
        listen 80;
        server_name localhost;

        resolver 127.0.0.11;
        set $backends app;
        location / {
            proxy_pass         http://$backends:8001;
            proxy_redirect     off;
            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;
        }
    }
}

Пожалуйста, объясните, как динамически округлять запросы ко всем контейнерам приложения

1 Ответ

0 голосов
/ 12 июля 2018

Метод, который вы упомянули, не работает, сервер не может обнаружить новый экземпляр с сервером nginx по умолчанию, вам понадобится образ jwilder / docker-gen для интеграции динамически созданных экземпляров приложения в балансировщик нагрузки nginx.

ваш файл docker в корне должен выглядеть примерно так:

version: '3'
services:
  nginx:
    image: nginx
    #restart: unless-stopped
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./vhost.d:/etc/nginx/vhost.d

  nginx-gen:
    image: jwilder/docker-gen
    command: -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
    container_name: nginx-gen
    #restart: unless-stopped
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./vhost.d:/etc/nginx/vhost.d
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
networks:
  default:
    external:
      name: nginx-proxy

, а файл docker в каталоге приложения будет выглядеть так:

version: '3'
services:
  app:
    build:
      context:  ./app
      dockerfile: Dockerfile
    expose:
      - "8001"
    environment:
      VIRTUAL_HOST: localhost

networks:
  default:
    external:
      name: nginx-proxy

Важно иметь тот жеимя виртуального хоста для всего экземпляра, и экземпляр jwilder / docker-gen перезапустится и установит его в циклическом режиме.

...