Le routage Istio Ingress échoue avec l'application 404 pour Nginx / Angular
Je déploie Nginx avec une application angulaire derrière la passerelle d'entrée istio.
Résultat attendu: https://tremend.com/tremendui/ devrait ouvrir l'application.
Problème: mais après avoir accédé à l'URLhttps://tremend.com/tremendui/, il atteint jusqu'à index.html, mais ne parvient pas à ouvrir les autres fichiers .js ou .css. Il donne net :: ERR_ABORTED 404.
Directive de politique de sécurité du contenu non reconnue 'https://10.22.33.100'.
AVOIRhttps://tremend.com/styles.63a1fbbeeb253678e456.cssnet :: ERR_ABORTED 404
GEThttps://tremend.com/runtime-es2015.fd26fadf204671228ade.js net :: ERR_ABORTED 404
Si j'ouvre le lien https://tremend.com/tremendui/runtime-es2015.fd26fadf204671228ade.js, le fichier s'ouvre correctement.
Configuration personnalisée de Nginx:
server {
listen 80;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ /index.html;
}
}
Nginx / Dockerfile angulaire:
FROM node:ubuntu as build-step
ARG env=dev
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install && npm install -g @angular/[email protected]
COPY . .
RUN echo "Build environment is $env" RUN ng build --configuration=$env
FROM node:ubuntu as prod-stage
RUN DEBIAN_FRONTEND=noninteractive apt-get update && DEBIAN_FRONTEND=noninteractive apt-get -yq install nginx nginx-extras
## Remove default nginx website
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build-step /usr/src/app/dist/ /usr/share/nginx/html
COPY ./nginx-custom.conf /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Fichier yaml de Virtualservice:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tremendui-ingress
namespace: apx-system
spec:
hosts:
- "*"
gateways:
- apollox-istio-gateway
http:
- match:
- uri:
prefix: /tremendui/
rewrite:
uri: /
route:
- destination:
host: tremend-ui.default.svc.cluster.local
port:
number: 80
Quelqu'un peut-il aider? J'ai juste besoin de quelques instructions pour résoudre ce problème. Dois-je changer le base-href dans angular ou ingress virtualservice ou nginx config?
Update1:
J'ai changé mon service virtuel comme ci-dessous:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: tremedui-ingress
namespace: apx-system
spec:
hosts:
- "tremend.com"
gateways:
- apollox-istio-gateway
http:
- match:
- uri:
exact: /
route:
- destination:
host: tremend-ui.default.svc.cluster.local
port:
number: 80
- match:
- uri:
prefix: /jsonserver/
rewrite:
uri: /
route:
- destination:
host: json-server.default.svc.cluster.local
port:
number: 3000
- match:
- uri:
prefix: /tremendapi/
rewrite:
uri: /
route:
- destination:
host: tremend-api.default.svc.cluster.local
port:
number: 8000
- match:
- uri:
prefix: /dynamicapi/
rewrite:
uri: /
route:
- destination:
host: dynamic-api.default.svc.cluster.local
port:
number: 9000
@ jt97, j'ai considéré les vôtres et celles de Rinor. Mais maintenant, il va à l'index.html de "/" et aussi les routes vers le frontend. Cependant, d'autres préfixes acheminent également vers le frontend au lieu de leur destination correspondante.
Le chemin pour / static, / callback et regex ne fonctionnait pas. Parce qu'une fois que je les ai ajoutés, j'obtiens juste une erreur 404. J'ai donc ajouté juste root "/" pour le frontend.
Réponses
Dois-je changer le base-href dans angular ou ingress virtualservice ou nginx config?
Lorsque vous utilisez la réécriture, vous devez ajouter un chemin dans le service virtuel pour vos dépendances telles que css et js.
C'était bien expliqué par @Rinor ici .
Ce tutoriel Istio en pratique l' explique bien.
Décomposons les requêtes qui doivent être acheminées vers Frontend:
Chemin exact / doit être acheminé vers Frontend pour obtenir l'index.html
Le chemin du préfixe / static / * doit être acheminé vers Frontend pour obtenir tous les fichiers statiques nécessaires au frontend, comme les feuilles de style en cascade et les fichiers JavaScript .
Les chemins correspondant à l'expression régulière ^. *. (Ico | png | jpg) $ doivent être acheminés vers Frontend car il s'agit d'une image que la page doit afficher.
http:
- match:
- uri:
exact: /
- uri:
exact: /callback
- uri:
prefix: /static
- uri:
regex: '^.*\.(ico|png|jpg)$'
route:
- destination:
host: frontend
port:
number: 80
De plus, vous pouvez jeter un œil ici .
Faîtes moi savoir si vous avez d'autres questions.