在 Google Kubernetes Engine 上托管 sails.js 应用程序时,我收到所有资产的 404 错误

sce*_*eee 1 sails.js gitlab-ci kubernetes google-kubernetes-engine kubernetes-ingress

我想在 Google Kubernetes Engine 上运行 sails.js 应用程序。在本地运行应用程序 docker 容器效果很好。到 GKE 的部署是通过 gitlab Auto-Devops 管道完成的。到目前为止,将应用程序部署到 GKE 正在运行,我可以使用 gitlab-CI 生成的域访问 sails.js 应用程序的页面 - 例如xyz-review-autodevops-123.my.host.com

但是,当访问页面时,只能加载所请求的页面 - 所有资源(例如图像、javascript 和 css 文件)都不会加载,而是返回 404。

当查看 GKE 中的 nginx-ingress-controller 日志时,我发现请求了这些 url,但结果是 404:

[05/Aug/2018:12:27:25 +0000] "GET /js/cloud.setup.js HTTP/1.1" 404 9 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36" 573 0.004 [my-app-review-autodevops-1232u0-my-app-443] xx.xx.xx.xx:80 9 0.004 404
Run Code Online (Sandbox Code Playgroud)

还经常记录如下错误。我不确定这是否与此问题有关,但仍然想提一下,以防万一:

error obtaining PEM from secret my-app-1239989/review-autodevops-1232u0-my-app-tls: error retrieving secret my-app-1239989/review-autodevops-1232u0-my-app-tls: secret my-app-1239989/review-autodevops-1232u0-my-app-tls was not found"  
Run Code Online (Sandbox Code Playgroud)

我的猜测是,入口不知道资产所请求的主机,因为它们被请求为绝对路径(/js/cloud.setup.js)而不是相对路径(js/cloud.setup.js),因此不知道将该请求路由到哪里,因为请求中丢失了域信息。

但我现在知道如何解决这个 404 问题。将 sails.js 中的所有路径更改为相对路径是否可以解决此问题?我什至不知道这是否可以轻松完成,因为相当多的任务是由 sails.js 中的 grunt 任务生成的,并且是以绝对形式生成的。

sce*_*eee 5

好吧,自己发现了错误。这是一个愚蠢的错误,因为 sails 以某种方式配置为包含gruntsails-hook-grunt仅作为package.json.

由于在生产容器上NODE_ENV设置为环境变量,npm install因此仅安装生产依赖项。

由于 grunt 用于操作和提供 sails.js 中的资源,因此这些资源尚未生成。

解决方案是移动gruntsails-hook-gruntdependenciesin package.json