【问题标题】:Nginx - Cloud Server with 2 Nginx reverse proxies serverNginx - 带有 2 个 Nginx 反向代理服务器的云服务器
【发布时间】:2020-09-22 23:13:55
【问题描述】:

我有一个云服务器 ubuntu 18.04,我有一个后端 API (.NET Core) 和一个前端 Angular 应用程序(这两个应用程序都已部署在码头集装箱内)。后端 API 首先上传,所以我在 云服务器 上配置了一个 nginx 代理。然后当我对 Angular 应用程序进行 docker 化时,但所有示例都使用 nginx 进行了 docker 化。它是否可以在没有 nginx 的情况下独立 dockerize Angular 应用程序?

因此,现在云服务器有两个 nginx 反向代理。一个在服务器上,一个在 Angular 容器内 @@

我的想法

  1. 如果我向外界公开 IP 地址,所有请求都将直接转发到 Angular 容器 IP。
  2. 如果我不公开 Angular 容器的 IP(设置防火墙)。一个请求必须通过 2 个 nginx 代理(因为 Angular 应用程序现在与 nginx 一起部署)。如何在没有 nginx 的情况下对 Angular 应用进行 dockerize?
  3. 我应该为后端和前端部署 nginx 以及容器吗?
  4. 一个云服务器应该是一个应用程序的一个nginx。然后我拆分了两个后端和前端,每个部署单独的云服务器。

【问题讨论】:

  • 如果你想对你的 Angular 应用进行 docker 化,你需要一个 web 服务器来托管编译后的文件(比如 nginx、nodejs、apache 或 webpack)。在开发过程中,您可能使用了内置的 webpack 服务器,并且该服务器不推荐用于生产,也不安全。首先,您需要决定使用哪个服务器来托管输出分发文件,然后您需要为它设置一个 docker 服务,并使用 Angular 构建的输出。
  • 因为必须托管 Angular 应用程序,所以我在 nginx 上对 Angular 进行了 dockerize。但是有一个问题我很困惑,我已经在云服务器上配置了 nginx。所以我应该直接将请求转发到角度容器和后端容器也使用 nginx 进行 dockerize (云服务器将不再有 nginx 代理)。我说的对吗?
  • 您可以将 Angular nginx 配置为反向代理到您的后端,然后您就不需要为后端使用第二个 nginx。或者,您可以将构建输出放在 docker 卷中,并将其连接到后端 nginx 容器以进行托管。
  • 感谢@MrDick47,我将尝试构建 Angular 应用到 docker 卷,并使用 Cloud Server 上的 nginx 连接为前端提供编译文件。

标签: angular docker asp.net-core nginx


【解决方案1】:

在我们在评论部分讨论之后,我想我会分享我的 angular-app Dockerfile 和 Docker compose 配置文件以供参考:

FROM node:12-alpine
ARG mode=prod
ENV mode=$mode

RUN apk --no-cache add \
tzdata \
git \
python \
g++ \
make

ENV TZ=${TZ:-America/Chicago}
RUN echo "$TZ" > /etc/timezone && date

EXPOSE 4200
USER node
WORKDIR /home/node

#To take advantage of docker's caching, first only copy the package.json and
# package-lock.json, then run npm install
COPY package*.json ./
RUN npm install

#This way the node_modules will be stored in an image build stage cache,
# which means it won't need to reinstall node_modules every build, but will
# reinstall them if either the package.json or package-lock.json file changes.

COPY *.js* ./
COPY src ./src

RUN [[ -z $mode ]] && npm run build || npm run build:$mode

码头工人撰写:

version: '3.4'

services:
  express-api:
    container_name: express-api
    build: ./express-api
    user: ${DOCKER_USER:-0:0}
    expose:
      - "3000"
    restart: "unless-stopped"
    environment:
      - TZ=America/Chicago
    volumes:
      - ./express-api/ssl-certs/:/home/node/ssl-certs:ro

  angular-app:
    container_name: angular-app
    build:  ./angular-app
    user: ${DOCKER_USER:-0:0}
    expose:
      - "4200"
    restart: "on-failure"
    environment:
      - TZ=America/Chicago
    volumes:
      - app_dist:/home/node/dist
      - ./angular-app/ssl-certs/:/home/node/ssl-certs:ro

  angular-docs:
    container_name: angular-docs
    build:
      context: ./angular-app
      dockerfile: Dockerfile-docs
    user: ${DOCKER_USER:-0:0}
    expose:
      - "8080"
    restart: "on-failure"
    environment:
      - TZ=America/Chicago

  nginx-server:
    container_name: nginx-server
    build: ./nginx-server
    expose:
      - "80"
      - "443"
    restart: "unless-stopped"
    environment:
      - TZ=America/Chicago
    volumes:
      - ./nginx-server/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx-server/ssl-certs/:/etc/nginx/ssl-certs:ro
      - app_dist:/var/www:ro

volumes:
  app_dist:

然后我将该 compose 文件与此文件合并以进行生产:

version: '3.4'

services:
  express-api:
    env_file: prod.env

  angular-app:
    build:
      args:
        mode: "prod"
    env_file: prod.env

  nginx-server:
    ports:
      - "80:80"
      - "443:443"
    env_file: prod.env

在我的角度包 json 中,我有这些脚本:

"build": "node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build",
"build:prod": "node --max_old_space_size=4096 node_modules/@angular/cli/bin/ng build --prod",

我在发布之前删除了其中的一些行,但它们应该可以帮助您入门。此设置使用一个容器来构建 angular-app 分发文件并将其存储在与 nginx 容器共享的卷中,该容器为文件提供服务并具有 express-api 后端的反向代理。

DOCKER_USER 环境变量是由 bash 脚本预先设置的:

export DOCKER_USER="${USERID:-1000}:${USERGID:-1000}"

【讨论】:

  • 非常感谢您的所有帮助。我爱你的热情。我刚刚开始学习 Docker 进行部署。那么,在 RUN 命令 RUN [[ -z $mode ]] 是什么意思?。
  • 抱歉回复晚了,这是一个bash命令,基本上可以这样读:if(!$mode) npm run build;else npm run build:$mode;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2017-08-16
  • 2020-08-19
  • 2020-06-29
  • 2021-10-11
  • 2015-10-29
  • 2016-09-07
相关资源
最近更新 更多