Как использовать один веб-сервер nginx для обеспечения углового внешнего интерфейса и внутреннего интерфейса django с помощью docker / docker-compose - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть серверная часть Django с остальными API, frond-конец Angular6cli, и я использую Docker.Интерфейс Angular доступен через веб-сервер nginx, а Django предоставляется локально с помощью uWSGI.Для того, чтобы сделать django-apis доступным для клиента, nginx также должен их маршрутизировать.

Вот мои:

структура проекта

project
|-- django-backend
    |-- folders
    |-- settings.py
    |-- back.Dockerfile
    |-- manage.py
    |-- requirements.txt
    |-- uwsgi.ini
|-- angular-frontend
    |-- src/
    |-- front.Dockerfile
    |-- nginx.conf
|-- docker-compose.yml

назад. Dockerfile

FROM python:3.6.5
RUN apt-get update && \
    apt-get install -y && \
    pip install uwsgi
RUN mkdir /src
WORKDIR /src
COPY . /src/
RUN pip install -r requirements.txt 

uwsgi.ini

[uwsgi]
project = backend
base = %d

http-socket = :8000
chdir = %(base)
module = %(backend).wsgi

master = true
processes = 2
threads = 2

front.Dockerfile

# Stage 0, based on Node.js, to build and compile Angular
FROM node:8.11.1 as node
RUN mkdir /src
WORKDIR /src
COPY package.json /src/
RUN npm install
COPY . /src/
RUN npm run build -- --configuration $CONFIG

# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=node src/dist/web /var/www/miap
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

nginx.conf

upstream django {  
    server 127.0.0.1:8000;
}

server {
    listen 8080;

    location / {
        root   /var/www/miap;
        index index.html index.htm;
        try_files $uri $uri/ /index.html =404;
    }

    location ~ ^/(api|auth)/ {
        allow all;
        proxy_http_version  1.1;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    Host            $http_host;
        proxy_set_header    X-Cluster-Client-Ip     $remote_addr;
        proxy_pass      http://django;
    }
}

docker-compose.yml

version: '3'

# docker-compose run Code in produntion mode
services:

  # configure postgres database image
  db:
    image: postgres:10.1
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: 'admin'
      POSTGRES_PASSWORD: '12345'
      POSTGRES_DB: 'db'
    volumes:
      - data:/var/lib/postgresql/data/

  # build and serve django within uwsgi server
  server:
    ports: 
      - "8000:8000"
    build:
        context: ./django-backend
        dockerfile: back.Dockerfile
    command: uwsgi --ini /src/uwsgi.ini
    depends_on:
      - db

  # build and serve angular front-end and proxy to uwsgi 
  web:
    ports:
      - "8080:8080"
    build:
        context: ./angular-frontend
        dockerfile: front.Dockerfile

volumes:
  data:

Я получаю следующую ошибку

name: "HttpErrorResponse"
ok: false
status: 502
statusText: "Bad
Gateway" url: "http://:8080/auth/login/"

при доступе к django-api напрямую через порт 8000 все работает нормально, поэтому я полагаю, что в соединении между nginx и uWSGI должна быть какая-то ошибка. Простое отображение uWSGI без веб-сервера перед ним не может быть решением.

Любые идеи, или я делаю это совершенно неправильно для моего варианта использования?

...