我有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,但没有结果。
我的代码有什么问题?
1条答案
按热度按时间yfjy0ee71#
对于我的需求,解决方案是Angular 应用:我需要使用2个参数来实现我的目标:
APP_BASE_HREF可以在构建时(这将是我的情况)或运行时通过声明APP_BASE_REF提供者或在index.html中设置它来设置:
至
但这将只处理应用程序的路由:在我的每个url前面自动添加/creator(它在我的每个url前面添加/creator#/,我认为应该调整一些东西以避免额外的“#”字符,但我稍后会看到它)。
接下来,我们应该使用构建设置来更改index.html中脚本的路径。
从这里:
对此:
nginx将正确地从index.html路由请求。警告:/creator文件夹不存在于produded文件中,它只是nginx的一个路径。
这是通过在构建中添加--deploy-url=/creator参数来完成的。* 所以是的,在最终的映像中有一个部署参数。映像不再是可以在任何地方部署的 *。
然后,我们必须为应用程序中加载的每个资产使用此路径。
在
app.module.ts
中添加提供程序允许将deployUrl注入到我的组件中:
我可以在html文件中使用。
而且最后,它工作(在我的电脑上😅)。
下一步是使用certbot部署https证书,但这是另一回事!