Конфигурация Nginix для приложения django nuxt с docker на ec2 - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть докеризованное приложение, которое отлично работает в режиме разработки на моем хост-компьютере. Я пытаюсь выяснить, как я могу разместить свое приложение на ec2, используя IP-адрес по умолчанию, созданный при запуске моего экземпляра.

Моя структура папок выглядит следующим образом.

backend
|---projectname
|---Dockerfile
|---requirements.txt 
|---wait-for-it.sh

config/nginx
|---app.conf

frontend
|---nuxt folders 
|---Dockerfile

Это мой текущий docker составной файл, который я использую

docker -compose.yml

version: '3.4'

services:
db:
    restart: always
    image: postgres
    volumes:
    - pgdata:/var/lib/postgresql/data  
    env_file: .env

    ports:
    - "5432:5432"
    expose:
    - 5432  

redis:
    restart: always
    image: redis
    volumes:
    - redisdata:/data


django:
    build:
    context: ./backend
    env_file: .env

    command: >
    sh -c  "./wait-for-it.sh db:5432 && 
            cd autobets && python manage.py collectstatic --noinput &&
            gunicorn --workers=2 --bind=0.0.0.0:8000 autobets.wsgi:application" 
    ports:
    - "8000:8000"
    volumes:
    - ./backend:/app
    depends_on:
    - db
    restart: on-failure


nuxt:
    build:
    context: ./frontend
    environment:
    - API_URI=http://django:8000/api

    command: bash -c "npm install && npm run dev"
    volumes:
    - ./frontend:/app
    ports:
    - "3000:3000"
    depends_on:
    - django
    - redis

volumes:
  pgdata:
  redisdata:

config / nginx / app.config

upstream django {
ip_hash;
server django:8000;
}

upstream nuxt {
ip_hash;
server nuxt:3000;
}

server {
location ~ /(api|admin|static)/ {
    proxy_pass http://django;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $host;
}
location / {
    proxy_pass http://nuxt;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $host;
}
listen 8000;
server_name localhost;
}

Скажите, если мой указатель доменного имени ec2 будет ec2-52-204-122-132.compute-1.amazon aws .com Как мне установить nginx в моем приложении, чтобы принимать http-соединения с внешним интерфейсом моего приложения?

На внутреннем хосте localhost: 8000 / admin - это моя страница администратора, к которой я бы хотел также обратиться, используя доменное имя ec2 .

Каков наилучший способ изменить мою конфигурацию, поэтому, когда я пу sh мое приложение после добавления указателя имени домена, я могу получить доступ к моему приложению, размещенному на ec2?

Я читал документации, но не могу найти полезную информацию для приложения типа dockerized django vue, работающего на ec2.

1 Ответ

0 голосов
/ 25 февраля 2020

Во-первых, вы должны убедиться, что группа безопасности, прикрепленная к вашему ящику, открыта для входящего соединения через порт, который NGinx listen

Для каждого контейнера, который вы хотите включить в конфигурацию NGinx, вам потребуется найдите их, чтобы сделать так:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

NGinx не находится внутри контейнера, docker - составьте так, nginx .conf

upstream django {
    ip_hash;
    server <container IP>:8000;     # <-- Change this, with container IP
}

upstream nuxt {
    ip_hash;
    server <container IP>:3000;     # <-- Change this, with container IP
}

server {
    location ~ /(api|admin|static)/ {
        proxy_pass @django               # <-- Change this, with container IP
        proxy_pass <container IP>:8000;  # <-- OR Change this, with container IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $host;
    }

    location / {
        proxy_pass @nuxt                # <-- Change this, add port
        proxy_pass <container IP>:3000  # <-- OR Change this, add port
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $host;
    }

    listen 8000;    # <-- Change port number, django already use this host port
    server_name localhost ec2-52-204-122-132.compute-1.amazonaws.com;   # <-- change this line, add EC2 public domain
}

docker -compose.yml

version: '3.4'

services:
    db:
        restart: always
        image: postgres
        volumes:
            - pgdata:/var/lib/postgresql/data
        env_file: .env

        ports:
            - "5432:5432"
        expose:
            - 5432
        networks:           # <-- Add this
            - random_name   # <-- Add this

    redis:
        restart: always
        image: redis
        volumes:
            - redisdata:/data
        networks:           # <-- Add this
            - random_name   # <-- Add this

    django:
        build:
        context: ./backend
        env_file: .env

        command: >
            sh -c  "./wait-for-it.sh db:5432 &&
                    cd autobets && python manage.py collectstatic --noinput &&
                    gunicorn --workers=2 --bind=0.0.0.0:8000 autobets.wsgi:application"
        ports:
            - "8000:8000"
        volumes:
            - ./backend:/app
        depends_on:
            - db
        restart: on-failure
        networks:           # <-- Add this
            - random_name   # <-- Add this


    nuxt:
        build:
        context: ./frontend
        environment:
            - API_URI=http://django:8000/api # <-- Wrong
            # From you Javascript on the client point of view,
            # you will request the public server, not the internal name of
            # you backend inside a container, that the public will never see
            - API_URI=http://ec2-52-204-122-132.compute-1.amazonaws.com/api # <-- Right
        command: bash -c "npm install && npm run dev"
        volumes:
            - ./frontend:/app
        ports:
            - "3000:3000"
        depends_on:
            - django    # <-- will become useless if change API_URI=
            - redis     # <-- bad design
        networks:           # <-- Add this
            - random_name   # <-- Add this

volumes:
  pgdata:
  redisdata:
networks:           # <-- Add this
  - random_name:    # <-- Add this wanto make sure container can communicate

Группа безопасности на AWS должна быть открыта для порта, который вы будете использовать для прослушивания на NGinx, хост 8000 уже используется django так что используйте другой на

Из POV архитектуры приложения, ваш бэкэнд должен делать кеш с Redis, а не с Frontend. Кэширование сложностей или ответов бэкэнда должно быть кешем бэкэнда где-то на контроллерах. Ваш клиент должен кэшировать только статистические активы. но вы здесь, чтобы заставить вас работать на сервере, а не говорить на языке архи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...