IstioIngressルーティングがNginx / Angularアプリの404で失敗する

Aug 18 2020

istio入力ゲートウェイの背後にAngularアプリを備えたNginxをデプロイしています。

期待される結果: https://tremend.com/tremendui/ アプリを開く必要があります。

問題:しかし、URLにアクセスした後https://tremend.com/tremendui/、index.htmlまで到達しますが、他の.jsまたは.cssファイルを開くことができません。それはnet :: ERR_ABORTED404を与えます。

認識されない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;"]

Virtualservice 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

誰かが助けることができますか?これを解決する方法についていくつかの指示が必要です。角度または入力仮想サービスまたはnginx構成のbase-hrefを変更する必要がありますか?

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、私はあなたとRinorの入力を考慮しました。しかし、今では「/」からindex.htmlに移動し、フロントエンドにルーティングします。ただし、他のプレフィックスも、対応する宛先ではなくフロントエンドにルーティングされます。

/ static、/ callback、およびregexのパスが機能していませんでした。それらを追加すると、404エラーが発生するためです。そこで、フロントエンドにルート「/」だけを追加しました。

回答

1 Jakub Aug 18 2020 at 16:01

角度または入力仮想サービスまたはnginx構成のbase-hrefを変更する必要がありますか?

書き換えを使用する場合は、cssやjsなどの依存関係の仮想サービスにパスを追加する必要があります。

ここで@Rinorによってよく説明されました。


このIstioの実践チュートリアルでは、それをうまく説明しています。

フロントエンドにルーティングする必要があるリクエストを分類してみましょう。

正確なパス/Index.htmlを取得するには、フロントエンドにルーティングする必要があります

プレフィックスパス/ static / *をフロントエンドにルーティングして、カスケードスタイルシートJavaScriptファイルなどのフロントエンドに必要な静的ファイルを取得する必要があります

正規表現^。*。(ico | png | jpg)$に一致するパスは、ページに表示する必要のある画像であるため、フロントエンドにルーティングする必要があります。

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

さらに、ここを見ることができます。


他にご不明な点がありましたらお知らせください。