El enrutamiento de Istio Ingress falla con 404 para la aplicación Nginx / Angular

Aug 18 2020

Estoy implementando Nginx con una aplicación angular detrás de la puerta de enlace de entrada istio.

Resultado Esperado: https://tremend.com/tremendui/ debería abrir la aplicación.

Problema: pero después de acceder a la URLhttps://tremend.com/tremendui/, llega hasta index.html, pero no puede abrir otros archivos .js o .css. Da net :: ERR_ABORTED 404.

Directiva de política de seguridad de contenido no reconocida 'https://10.22.33.100'.
OBTENERhttps://tremend.com/styles.63a1fbbeeb253678e456.cssnet :: ERR_ABORTED 404
OBTENERhttps://tremend.com/runtime-es2015.fd26fadf204671228ade.js net :: ERR_ABORTED 404

Si abro el enlace https://tremend.com/tremendui/runtime-es2015.fd26fadf204671228ade.js, el archivo se abre correctamente.

Configuración personalizada de Nginx:

server {
  listen 80;
  location / {
    root /usr/share/nginx/html;
    try_files $uri $uri/ /index.html;
  }
}

Nginx / Angular Dockerfile:

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;"]

Archivo yaml de servicio virtual:

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

¿Alguien puede ayudar? Solo necesito algunas instrucciones sobre cómo resolver esto. ¿Debo cambiar la base-href en angular o ingress virtualservice o configuración nginx?

Update1:
cambié mi servicio virtual de la siguiente manera:

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, consideré las aportaciones tuyas y de Rinor. Pero ahora va al index.html desde "/" y también se dirige a la interfaz. Sin embargo, otros prefijos también se enrutan a la interfaz en lugar de su destino correspondiente.

La ruta para / static, / callback y regex no funcionaban. Porque una vez que los agregué, recibí un error 404. Así que agregué solo la raíz "/" para la interfaz.

Respuestas

1 Jakub Aug 18 2020 at 16:01

¿Debo cambiar la base-href en angular o ingress virtualservice o configuración nginx?

Cuando usa la reescritura, debe agregar la ruta en el servicio virtual para sus dependencias como css y js.

Fue bien explicado por @Rinor aquí .


Este tutorial de Istio en la práctica lo explica bien.

Analicemos las solicitudes que deben enviarse a Frontend:

La ruta exacta / debe enrutarse a Frontend para obtener el Index.html

La ruta de prefijo / static / * debe enrutarse a Frontend para obtener los archivos estáticos que necesita la interfaz, como hojas de estilo en cascada y archivos JavaScript .

Las rutas que coinciden con la expresión regular ^. *. (Ico | png | jpg) $ deben enrutarse a Frontend, ya que es una imagen que la página debe mostrar.

http:
  - match:
    - uri:
        exact: /
    - uri:
        exact: /callback
    - uri:
        prefix: /static
    - uri:
        regex: '^.*\.(ico|png|jpg)$'
    route:
    - destination:
        host: frontend             
        port:
          number: 80

Además puedes echar un vistazo aquí .


Avísame si tienes más preguntas.