O roteamento do Istio Ingress falha com 404 para o aplicativo Nginx / Angular

Aug 18 2020

Estou implantando o Nginx com o aplicativo angular por trás do gateway de entrada istio.

Resultado esperado: https://tremend.com/tremendui/ deve abrir o aplicativo.

Problema: Mas depois de acessar o urlhttps://tremend.com/tremendui/, atinge até index.html, mas falha ao abrir outros arquivos .js ou .css. Ele dá net :: ERR_ABORTED 404.

Diretiva de política de segurança de conteúdo não reconhecida 'https://10.22.33.100'.
PEGUEhttps://tremend.com/styles.63a1fbbeeb253678e456.cssnet :: ERR_ABORTED 404
GEThttps://tremend.com/runtime-es2015.fd26fadf204671228ade.js net :: ERR_ABORTED 404

Se eu abrir o link https://tremend.com/tremendui/runtime-es2015.fd26fadf204671228ade.js, o arquivo abre corretamente.

Configuração personalizada Nginx:

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

Dockerfile Nginx / Angular:

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

Arquivo yaml do 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

Alguém pode ajudar? Só preciso de algumas instruções sobre como resolver isso. Devo alterar o base-href no angular ou ingresso virtualservice ou na configuração do nginx?

Update1:
Eu mudei meu serviço virtual conforme abaixo:

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, considerei as suas opiniões e as de Rinor. Mas agora ele vai para o index.html de "/" e também roteia para o frontend. No entanto, outros prefixos também direcionam para o frontend em vez de seu destino correspondente.

O caminho para / static, / callback e regex não estavam funcionando. Porque depois de adicioná-los, recebo um erro 404. Então eu adicionei apenas root "/" para frontend.

Respostas

1 Jakub Aug 18 2020 at 16:01

Devo alterar o base-href no angular ou ingresso virtualservice ou na configuração do nginx?

Quando você usa reescrever, precisa adicionar o caminho no serviço virtual para suas dependências, como css e js.

Foi bem explicado por @Rinor aqui .


Este tutorial do Istio na prática explica isso bem.

Vamos detalhar as solicitações que devem ser roteadas para o front-end:

O caminho exato / deve ser roteado para o Frontend para obter o Index.html

O caminho do prefixo / static / * deve ser roteado para o frontend para obter quaisquer arquivos estáticos necessários ao frontend, como folhas de estilo em cascata e arquivos JavaScript .

Os caminhos que correspondem ao regex ^. *. (Ico | png | jpg) $ devem ser roteados para o Frontend, pois é uma imagem que a página precisa mostrar.

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

Além disso, você pode dar uma olhada aqui .


Deixe-me saber se você tiver mais perguntas.