Nginx - Heroku Docker - 是否可以在 Heroku 上将 Nginx 作为反向代理运行

HoC*_*Co_ 4 reverse-proxy nginx heroku docker docker-container

我想弄清楚如何使用 Nginx 在 Heroku 应用程序上构建反向代理。问题是 Heroku 似乎每个应用程序只接受一个容器。但我的应用系统至少会使用三个容器:

  • 一个用于 Nginx
  • 一个用于我的应用程序前端
  • 一个用于我的业务逻辑服务器

那么可以用 Heroku 做到这一点吗?我的意思是,在同一域上以某种方式或另一种方式部署多容器应用程序?这将是非常棒的。如果有人有任何提示,那就太好了。谢谢。

Pra*_*ram 7

我有一个类似的模板,但不同的是它在 heroku 中需要 3 个应用程序。
由于每个容器都在单独的应用程序中运行,因此它们都暴露于外部世界。

此模板使用 travis 构建容器并将其部署到 heroku。
模板有 3 张图片
* 前端(Nginx - React)
* 后端(Nodejs - express)
* 服务器(Nginx)

我已经为我的模板引用了以下网址。
https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b
Heroku (Docker) PORT 环境变量在 nginx

以下是存储库网址。
https://github.com/pramodramdas/heroku_multi_dockers

脚步

  • 在 heroku 中创建 3 个应用程序。
  • 从 heroku 获取 api 密钥 -> 账户设置 -> api 密钥
  • 在 travis 中创建以下环境变量

    HEROKU_USERNAME=_ //下划线
    HEROKU_PASSWORD= //来自heroku的Api key
    HEROKU_API_KEY= //与上面相同的api key
    HEROKU_APP_BACKEND= //heroku后端应用名称不带“.herokuapp.com”
    HEROKU_APP_CLIENT= //heroku前端应用名称不带“ .herokuapp.com"
    HEROKU_APP_NGINX= //没有“.herokuapp.com”的heroku nginx应用名称
    DOCKER_USERNAME= //dockerhub 用户名
    DOCKER_PASSWORD= //dockerhub 密码

  • 在 nginx heroku 应用程序中创建以下环境变量

    HEROKU_APP_BACKEND_URL= //heroku 后端应用url 示例:xxxxxx.herokuapp.com
    HEROKU_APP_CLIENT_URL= //heroku 前端应用url 示例: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;
  }
}
Run Code Online (Sandbox Code Playgroud)

前端包通过前端容器内的单独 nginx 服务器切断。下面是配置

server {
  listen $PORT;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }
}
Run Code Online (Sandbox Code Playgroud)

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;'
Run Code Online (Sandbox Code Playgroud)

在 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 
Run Code Online (Sandbox Code Playgroud)