Docker Compose下2个角应用程序上的Nginx路由

y4ekin9u  于 2022-11-22  发布在  Nginx
关注(0)|答案(1)|浏览(152)

我有2个Angular 的应用程序捆绑在2个单独的docker图像的基础上nginx图像:

FROM node:14-alpine as build
WORKDIR /app

RUN npm install -g @angular/cli

COPY FrontEnd1/package*.json ./
RUN npm install
COPY FrontEnd1/. ./
RUN npm run build -- --configuration=production

FROM nginx as runtime

COPY --from=build /app/dist/FrontEnd1 /usr/share/nginx/html
VOLUME /usr/share/nginx/html/assets/configuration/

第二个Angular 应用程序有完全相同的Dockerfile(除了它是FrontEnd 2)。

version: "3"
services:
  proxy:
    image: nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:      
      - $STORAGE_FOLDER/nginx/conf/:/etc/nginx/conf.d/:rw
    restart: always

  public:
    image: frontend1

  creator:
    image: frontend2

然后,我按下下面的nginx文件来定义路由:

upstream creator {
    server creator;
}

upstream public {
    server public;
}

server {
    listen 80;
    listen [::]:80;

    server_name localhost;

    location /creator {
        proxy_pass http://creator;
    }

    location / {
        proxy_pass http://public;
    }
}

它对/ route运行得很好,但对/creator route就不行了。这个请求在指向frontend 2 subnginx的url中带有/creator部分,返回404。
我试着添加一个尾随的/:

location /creator {
        proxy_pass http://creator/;
    }

但是我在sub nginx中得到了一个304,什么都没有返回。
我试图在位置上添加另一个尾随/:

location /creator/ {
        proxy_pass http://creator/;
    }

我得到了同样的304,但没有结果。
我的代码有什么问题?

yfjy0ee7

yfjy0ee71#

对于我的需求,解决方案是Angular 应用:我需要使用2个参数来实现我的目标:
APP_BASE_HREF可以在构建时(这将是我的情况)或运行时通过声明APP_BASE_REF提供者或在index.html中设置它来设置:

<head>
   <base href="/">

<head>
   <base href="/creator">

但这将只处理应用程序的路由:在我的每个url前面自动添加/creator(它在我的每个url前面添加/creator#/,我认为应该调整一些东西以避免额外的“#”字符,但我稍后会看到它)。
接下来,我们应该使用构建设置来更改index.html中脚本的路径。
从这里:

<script src="runtime.xxxxxxxxxxx.js" type="module"></script>

对此:

<script src="creator/runtime.xxxxxxxxxxx.js" type="module"></script>

nginx将正确地从index.html路由请求。警告:/creator文件夹不存在于produded文件中,它只是nginx的一个路径。
这是通过在构建中添加--deploy-url=/creator参数来完成的。* 所以是的,在最终的映像中有一个部署参数。映像不再是可以在任何地方部署的 *。
然后,我们必须为应用程序中加载的每个资产使用此路径。
app.module.ts中添加提供程序

{ 
  provide: DEPLOY_URL, 
  useValue: deployUrl, 
},

允许将deployUrl注入到我的组件中:

constructor(
   @Inject(DEPLOY_URL) public baseHref:string)

我可以在html文件中使用。
而且最后,它工作(在我的电脑上😅)。
下一步是使用certbot部署https证书,但这是另一回事!

相关问题