Nginx не маршрутизировать два контейнера на разные порты - PullRequest
0 голосов
/ 08 мая 2020

У меня два контейнера 1. Flask серверное приложение 2. Angular интерфейсное приложение. Приложение Flask перенаправляет порт 8001, а приложение angular - порт 80. Оба работают нормально при прямом доступе. Теперь я пытаюсь использовать контейнер NGINX в качестве обратного прокси-сервера для перенаправления URL-адресов localhost: 5001 для приложения Flask и localhost: 80 для приложения Angular. Я слежу за этим руководством. вот мой docker -compose.yaml

version: '3'
services:
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'my_db'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: '****'
      MYSQL_ROOT_PASSWORD: '****'
    ports:
      - '3306:3306'
    volumes:
      - my-db:/var/lib/mysql

  nginx:
      restart: always
      build: ../nginx/.
      depends_on:
        - api_server
        - web_ui
      ports:
        - '80:80'

  api_server:
    build: .
    depends_on:
      - db
    environment:
      SECRET_KEY: ****
      FLASK_ENV: local
      SQLALCHEMY_DATABASE_URI_DEV: mysql+mysqldb://root:****@db:3306/my_db
    ports:
      - "8001:8001"

  web_ui:
    depends_on:
      - api_server
    image: web_ui_local
    environment:
      API_URL: api_server:8001
    volumes:
      - '.:/app'
      - '/app/node_modules'
    ports:
      - '8002:80'

nginx Dockerfile

FROM nginx:latest
RUN rm /etc/nginx/conf.d/default.conf
COPY ./default.conf /etc/nginx/conf.d/default.conf

и default.conf

upstream web_ui {
  server web_ui:5001;
}

upstream api_server {
  server api_server:5002;
}

server {
  listen 80;
  server_name localhost;

  location /api_server {
    proxy_pass http://api_server;
  }

  location /web_ui {
    proxy_pass http://web_ui;
  }
}

Невозможно получить доступ к localhost: 5001 ни локальный: 5002. nginx журналы говорят об этом при доступе к localhost

2020/05/08 16:39:57 [error] 6#6: *1 "/etc/nginx/html/index.html" is not found (2: No such file or directory), client: 172.21.0.1, server: localhost, request: "GET / HTTP/1.1", host: "localhost"
172.21.0.1 - - [08/May/2020:16:39:57 +0000] "GET / HTTP/1.1" 404 556 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xx.xx.xx.xx Safari/537.36" "-"

ОБНОВЛЕНИЕ:

доступ к localhost/api_server дает мне следующую ошибку;

2020/05/08 19:03:01 [error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.21.0.1, server: 127.0.0.1, request: "GET /api_server HTTP/1.1", upstream: "http://172.21.0.3:5002/api_server", host: "localhost"

Где 172.21.0.3 - это ip контейнера api_server. так что этот ответ ожидается, потому что он не прослушивает порт 5002. Изменение этого на порт 8001 перенаправляет на api_server с ответом 404 bcuz нет такого маршрута GET /api_server в приложении flask.

ОБНОВЛЕНИЕ 2: Я сделал default.conf намного проще, исходя из моих требований;

server {
  listen 80;
  server_name 127.0.0.1;

  location / {
    proxy_pass http://web_ui;
  }
}

server {
  listen 5001;
  server_name 127.0.0.1;

  location / {
    proxy_pass http://api_server:8001;
  }
}

Я удалил ports:'8002:80' из web_ui, и вышеуказанное успешно перенаправляет в приложение Angular на localhost. Но localhost:5001 по-прежнему не работает (нет ответа) :(

Обновление 3: перенаправление порта 5001 с порта nginx отсутствует. Теперь можно получить доступ к документам OpenApi на локальном хосте: 5001 тоже.

1 Ответ

0 голосов
/ 09 мая 2020

Выяснили проблему, на самом деле мой вариант использования был намного проще, чем то, что я реализовывал. Я использую файл default.conf, как указано в вопросе Обновление 2 , и открываю порты 5001 и 80 из контейнера nginx и удаляю его из api_server и web_ui.

services nginx из docker -compose.yaml

  nginx:
      restart: always
      build: ../nginx/.
      depends_on:
        - api_server
        - web_ui
      ports:
        - '80:80'         # for Angular app
        - '5001:5001'     # for backend flask app
...