Маршрутизация Istio Ingress не работает с 404 для приложения Nginx / Angular

Aug 18 2020

Я развертываю Nginx с приложением angular за входным шлюзом istio.

Ожидаемый результат: https://tremend.com/tremendui/ должен открыть приложение.

Проблема: но после доступа к URL-адресуhttps://tremend.com/tremendui/, он достигает index.html, но не может открыть другие файлы .js или .css. Это дает net :: ERR_ABORTED 404.

Нераспознанная директива Content-Security-Policy https://10.22.33.100.
ПОЛУЧИТЬhttps://tremend.com/styles.63a1fbbeeb253678e456.cssnet :: ERR_ABORTED 404
GEThttps://tremend.com/runtime-es2015.fd26fadf204671228ade.js net :: ERR_ABORTED 404

Если я открою ссылку https://tremend.com/tremendui/runtime-es2015.fd26fadf204671228ade.js, файл открывается правильно.

Пользовательская конфигурация 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;"]

YAML-файл виртуального сервиса:

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

Кто-нибудь может помочь? Просто нужны указания, как решить эту проблему. Должен ли я изменить base-href в конфигурации angular или ingress virtualservice или nginx?

Update1:
я изменил свой виртуальный сервис, как показано ниже:

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, я учел ваши и Ринора материалы. Но теперь он переходит в index.html из "/", а также направляет его во внешний интерфейс. Однако другие префиксы также направляются во внешний интерфейс, а не в соответствующее место назначения.

Путь для / static, / callback и регулярного выражения не работал. Потому что, как только я их добавил, я получаю ошибку 404. Так что я добавил только root "/" для интерфейса.

Ответы

1 Jakub Aug 18 2020 at 16:01

Должен ли я изменить base-href в конфигурации angular или ingress virtualservice или nginx?

Когда вы используете rewrite, вам необходимо добавить путь в виртуальную службу для ваших зависимостей, таких как css и js.

Это хорошо объяснил @Rinor здесь .


Это практическое руководство Istio хорошо объясняет.

Давайте разберем запросы, которые следует направлять во Frontend:

Точный путь / должен быть направлен во внешний интерфейс для получения Index.html

Путь с префиксом / static / * должен быть направлен во внешний интерфейс для получения любых статических файлов, необходимых для внешнего интерфейса, таких как каскадные таблицы стилей и файлы JavaScript .

Пути, соответствующие регулярному выражению ^. *. (Ico | png | jpg) $, должны направляться во Frontend, поскольку это изображение, которое страница должна отображать.

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

Дополнительно вы можете посмотреть здесь .


Позвольте мне знать, если у вас есть какие-либо другие вопросы.