Nginx - Heroku Docker - Можно ли запустить Nginx в качестве обратного прокси на Heroku - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь понять, как создать обратный прокси-сервер в приложении Heroku с помощью Nginx.Проблема в том, что Heroku, кажется, принимает только один контейнер на приложение.Но моя прикладная система будет использовать как минимум три контейнера:

  • один для Nginx
  • один для внешнего интерфейса моего приложения
  • один для моего сервера бизнес-логики

Так возможно ли это сделать с Heroku?Я имею в виду, каким-либо образом развернуть мультиконтейнерное приложение в том же домене?Это было бы просто потрясающе.Если у кого-то есть подсказка, было бы здорово.Благодарю.

1 Ответ

0 голосов
/ 11 декабря 2018

У меня есть шаблон, который похож на другой, но разница в том, что для него требуется 3 приложения в heroku.
Поскольку каждый контейнер работает в отдельном приложении, все они открыты для внешнего мира.

Этот шаблон использует travis для создания и развертывания контейнеров для heroku.
Шаблон имеет 3 изображения
* Внешний интерфейс (Nginx - React)
* Внутренний интерфейс (Nodejs - экспресс)
* Сервер(Nginx)

Ниже приведены URL-адреса для моего шаблона.
https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b
Вариант среды PORT среды Heroku (Docker) в nginx

Ниже приведеноURL репозитория.
https://github.com/pramodramdas/heroku_multi_dockers

Шаги

  • Создайте 3 приложения в heroku.
  • Получить ключ API из heroku -> Настройки аккаунта -> Ключ API
  • Создать следующие переменные среды в travis

    HEROKU_USERNAME = _ // подчеркивание
    HEROKU_PASSWORD = // Ключ API от heroku
    HEROKU_API_KEY = // тот же APIключ как указано выше
    HEROKU_APP_BACKEND = // имя приложения конечного пользователя heroku без ".herokuapp.com"
    HEROKU_APP_CLIENT = // имя приложения внешнего интерфейса heroku без ".herokuapp.com"
    HEROKU_APP_NGINX = // heroku nginxимя приложения без ".herokuapp.com"
    DOCKER_USERNAME = // использование dockerhubrname
    DOCKER_PASSWORD = // пароль dockerhub

  • Создать следующие переменные окружения в приложении nginx heroku

    HEROKU_APP_BACKEND_URL = // URL-адрес вспомогательного приложения heroku, пример: xxxxxx.herokuapp.com
    HEROKU_APP_CLIENT_URL = // пример URL внешнего приложения heroku: xxxxxx.herokuapp.com

Моя конфигурация сервера nginx.

upstream client {
  server $HEROKU_APP_CLIENT_URL;
}

upstream backend {
  server $HEROKU_APP_BACKEND_URL;
}

server {
  listen $PORT;

  location / {
    proxy_pass http://client;
    proxy_set_header Host $HEROKU_APP_CLIENT_URL;
  }

  location /api {
    proxy_pass http://backend;
    proxy_set_header Host $HEROKU_APP_BACKEND_URL;
  }
}

пакет внешнего интерфейсаРазделяется через отдельный сервер nginx внутри контейнера Frontend.Ниже приведен файл config

server {
  listen $PORT;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }
}

Файл Docker должен содержать команды для копирования пакета в nginx и

CMD /bin/bash -c "envsubst '\$PORT \$HEROKU_APP_CLIENT_URL \$HEROKU_APP_BACKEND_URL' < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;'

в конце файла Docker для выбора переменных env.

Ниже приведена конфигурация travis

sudo: required
language: node_js 
node_js: 
  - "9"
services:
  - docker

before_install:
  - wget -qO- https://toolbelt.heroku.com/install.sh | sh
  - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
  - echo "$HEROKU_PASSWORD" | docker login -u "$HEROKU_USERNAME" --password-stdin registry.heroku.com

script:
  - docker build -t $DOCKER_USERNAME/docker_client ./frontend_heroku;
  - docker tag $DOCKER_USERNAME/docker_client registry.heroku.com/$HEROKU_APP_CLIENT/web;
  - docker build -t $DOCKER_USERNAME/docker_backend ./backend_heroku;
  - docker tag $DOCKER_USERNAME/docker_backend registry.heroku.com/$HEROKU_APP_BACKEND/web;
  - docker build -t $DOCKER_USERNAME/docker_nginx ./nginx_heroku;
  - docker tag $DOCKER_USERNAME/docker_nginx registry.heroku.com/$HEROKU_APP_NGINX/web;

deploy:
  provider: script
  script: 
    # push to dockerhub & heroku 
    docker push $DOCKER_USERNAME/docker_client;
    docker push registry.heroku.com/$HEROKU_APP_CLIENT/web;
    heroku container:release web --app $HEROKU_APP_CLIENT;
    docker push $DOCKER_USERNAME/docker_backend;
    docker push registry.heroku.com/$HEROKU_APP_BACKEND/web;
    heroku container:release web --app $HEROKU_APP_BACKEND;
    docker push $DOCKER_USERNAME/docker_nginx;
    docker push registry.heroku.com/$HEROKU_APP_NGINX/web;
    heroku container:release web --app $HEROKU_APP_NGINX;
  on: 
    branch: master 
...