Le routage Istio Ingress échoue avec l'application 404 pour Nginx / Angular

Aug 18 2020

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

1 Jakub Aug 18 2020 at 16:01

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.