【问题标题】:Routing issues on Angular + Kubernetes + NginxAngular + Kubernetes + Nginx 上的路由问题
【发布时间】:2020-05-04 19:13:16
【问题描述】:

在我目前工作的一个项目中,我面临很多与路由相关的问题。我认为这是一个配置问题,任何有类似经验的人都可以分享他的经验..

项目概述:

  • Angular SPA 项目
  • Docker 容器
  • 部署到 Kubernetes 集群(在 Google 云上)
  • nginx 服务器上运行。
  • 代码存储库和生成过程位于 Azure Git Repo

    项目在本地机器上完美构建和运行。

    项目详情:

    1。 Angular SPA 项目详情:

  • 带有普通 Angular Bootstrap 的简单 Angular 项目
  • 使用 RoutingModule 在不同的表单之间导航。
  • 有 2 种形式(一种是安全的,另一种是打开的,稍后详述)
  • 结构
             Devops/
                 src/
                      index.html
                      app/
                          app-routing.module.ts
                          app.component.ts
                          app.component.html
                          home/
                            home.component.html
                            home.component.ts
                          dashboard/
                            dashboard.component.html
                            dashboard.component.ts
    


    在 app-routing.module.ts 中设置了所有路由,其中​​所有路径都映射到相应的组件。此外,默认设置为 Home 组件。
    根据标准设置,index.html 默认定义了以下标记和值
    <base href="/">
    在构建过程中,命名空间和应用名称存储在环境变量 (ENVVALUES) 中。



    2。 Kubernetes 详情

    在 kubernetes 中,假设域是 www.xcompany.com,我的命名空间是 MaxxD,部署的应用程序是 Devops,那么托管站点的 uri 将是 www.xcompany.com/maxxd/devops。它是这样配置的。此外,根据 Kubernetes 标准,还应该有一个健康检查网页来确定 pod 的可用性和健康状况。健康页面的路径是:www.xcompany.com/maxxd/devops/api/health



    3。 NGinx 详情

    nginx 相关设置存储在名为 default.conf 的配置文件中 内容如下:

    server {
        listen       80;
        server_name  localhost;
    
        location ${ENVVALUES}/ {
            alias   /usr/share/nginx/html/;
            index  index.html index.htm;
    
            #try_files $uri $uri/ index.html
        }
    
        location  /api/health/ {
            alias   /usr/share/nginx/html/health/;
            index  health.html;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    
    }
    

    我们可以看到默认域名附加了ENVVALUES,其中包含命名空间和App Name(“MaxxD/Devops”)的信息



    3。码头工人详情

  • Docker 构建是一个多阶段的构建,包括 2 个步骤。
  • 第一步,将文件从代码仓库复制到构建服务器,然后运行 ​​ng build
  • 第二步,然后将Dist文件移动到一个nginx镜像中,修改nginx的conf文件,然后启动。


    以下是 DockerFile 的内容:

    ### STAGE 1: Build ###
    # We label our stage as ‘builder’
    FROM node as builder
    
    # Create the working folder
    RUN mkdir -p /usr/src/app
    
    # We define our current path inside of the container
    WORKDIR /usr/src/app
    
    # We copy both the package.json and the package.lock.json into the image
    COPY package*.json /usr/src/app/
    
    # run npm install to install Angular CLI
    RUN npm install @angular/cli -g
    
    # run npm install to install all dependencies of the project
    RUN npm ci
    
    # copy all file from repo to build machine
    COPY . /usr/src/app/
    
    ## Build the angular app in production mode and store the artifacts in dist folder
    RUN ng build --prod
    
    ### STAGE 2: Setup ###
    FROM nginx
    # Expose the port 80 of the running container 
    EXPOSE 80
    
    ## Copy our default nginx config
    COPY conf/default.conf /etc/nginx/conf.d/
    
    ## Remove default nginx website
    RUN rm -rf /usr/share/nginx/html/*
    
    ## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder
    COPY --from=builder /usr/src/app/dist/devops /usr/share/nginx/html
    
    ## From ‘builder’ stage copy over the artifacts in dist folder to default nginx public folder
    COPY --from=builder /usr/src/app/health /usr/share/nginx/html/health
    
    
    CMD /bin/bash -c "envsubst < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    

    在最后一步中,nginx conf 文件被修改,ENVVALUES 被转置为 "{namespace/AppName}" 值。


    问题

    部署到 kubernetes 集群后,我们看到 index.html 正在加载,但屏幕为空白。在 chrome 调试窗口中,我们看到 .css、.js 和图像等支持文件都在抛出 404,即使 home pae 显示了正确的 uri。
    在排除故障花费大量时间后,我们认为这是一个路由问题,需要将基本 href 设置为“./”而不是默认值“/”。
    该网站在此之后变得可用,并且所有组件都可以导航。

    我们必须保护网站免遭未经授权的访问,为此我们使用了 Okta 授权组件
    Okta 所需的所有依赖项均已安装并完成配置。

    在本地运行时,我们发现认证成功后,重定向无法正常工作。映射到“OktaCallbackComponent”的隐式/回调未正确加载。

    它显示错误,并且再次与基本 href 标记中设置的值有关。
    我们将其改回“/”,并且完整的身份验证流程和重定向到安全部分的工作绝对正常。
    但现在在进行新部署后,该站点再次抛出相同的路由相关问题。



    所以就目前而言,如果我们将 Base href 值设置为“/”,那么该站点在本地可以正常工作,但在 Kubernetes 中就不行。
    但是,如果设置为“./”,它会在本地加载不安全的文件,不会加载安全的文件(由于上面讨论的 Okta 隐式/回调组件),就像在 Kubernetes 中一样, 它会加载不安全的文件,但与本地实例一样,在成功验证后,Okta implcit/callback 的重定向不会成功。




  • 我知道这与 nginx 路由以及服务器如何处理 url 和加载适当的部分有关。
  • 但不知道要改变什么才能获得所需的结果。
  • 我尝试了许多在互联网上分享的想法组合,但到目前为止都没有奏效。不应该太复杂,因为大多数都使用标准实施指南。
  • 我的主要解决方案是找到一种方法来运行将基本 href 设置为默认值(“/”)的网站

  • 另一个观察: 即使路由似乎正在工作,它也只能通过根导航。即“www.xcompany.com/MaxxD/DevOps/”,它会根据定义的路由规则自动重定向到“www.xcompany.com/MaxxD/DevOps/home”。但是,如果我将“www.xcompany.com/MaxxD/DevOps/home”直接放在地址栏上,那么我会得到 404..



    非常感谢任何帮助

  • 【问题讨论】:

    • 您能否提供YAML 部署的定义?过程中的哪些步骤促使您取得这一结果?
    • 过程中的步骤: 1. 代码签入-触发器构建。 2. 作为构建的一部分,有以下步骤(每个步骤都在 yaml 文件中定义)。 3. 根据 yaml 文件准备 Kubernetes Pod(所有 UI 项目的模板。我正在尝试从 yaml 文件中清除公司特定的内容,以便将它们发布在这里)。 4. 构建容器镜像(基于 Docker File 上的说明,已经在帖子中)。 5、将容器镜像推送到Pod
    • * 还要补充一点:* 我们使用 istio 而不是默认入口控制器作为负载均衡器 - Istio 在将调用转发到 pod 之前也会形成 url(例如,www.xcompany.com/ Maxd/DevOps)

    标签: angular docker nginx kubernetes okta


    【解决方案1】:

    服务器必须将域名后的信息发送到浏览器进行解析。问题是 nginx 服务器正在进行大量处理。需要发生的事情不是让 nginx 在无法解析其本地文件中的 url 时对 url 进行任何处理,而是将剩余的 url 发送到浏览器中的客户端。角度路由逻辑将指导 SPA 的路由器将正确的组件放置在应用程序的标签中。它需要像这样工作:

    • 域名.com/resolve-at-browser

      1. 域名解析到运行它的服务器(在本例中为 nginx),其中 index.html 以及大量的 javascript 被发送回浏览器,这些 javascript 是充满应用程序逻辑的 webpack 包和角度库。
      2. 浏览器中的运行时会解析加载了 index.html 的浏览器 DOM 并找到标签。
      3. 要解决这个问题,Angular 运行时或 Ivy Renderer 将查看仍未被 nginx 处理的 url。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 2023-03-27
      • 2019-11-21
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2021-04-17
      • 2018-05-09
      相关资源
      最近更新 更多