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

2024-05-14

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

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

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


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

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

我在下面引用了我的模板的网址。
https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b
Heroku (Docker) nginx 中的 PORT 环境变量 https://stackoverflow.com/questions/49147389/heroku-docker-port-environment-varibale-in-nginx

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

Steps

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

    HEROKU_USERNAME=_ //下划线
    HEROKU_PASSWORD= //来自heroku的Api密钥
    HEROKU_API_KEY= //与上面相同的 API 密钥
    HEROKU_APP_BACKEND= //不带“.herokuapp.com”的heroku后端应用程序名称
    HEROKU_APP_CLIENT= //不带“.herokuapp.com”的heroku前端应用程序名称
    HEROKU_APP_NGINX= //不带“.herokuapp.com”的heroku nginx应用程序名称
    DOCKER_USERNAME= //dockerhub用户名
    DOCKER PASSWORD= //docker hub密码

  • 在 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;
  }
}

前端捆绑通过前端容器内的单独 nginx 服务器进行分割。下面是配置

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 文件末尾以便选择环境变量。

以下是特拉维斯的配置

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 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx - Heroku Docker - 是否可以在 Heroku 上运行 Nginx 作为反向代理 的相关文章

随机推荐