首页 > 解决方案 > Nginx - 带有 2 个 Nginx 反向代理服务器的云服务器

问题描述

我有一个云服务器 ubuntu 18.04,我有一个后端 API(.NET Core)和一个前端Angular应用程序(这两个应用程序都部署在 docker 容器内)。后端 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。然后我拆分了两个后端和前端,每个部署单独的云服务器。

标签: angulardockerasp.net-corenginx

解决方案


在我们在评论部分讨论之后,我想我会分享我的 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:

我将该撰写文件与此文件合并以进行生产:

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}"


推荐阅读