我想在Google Kubernetes引擎上运行一个sails.js应用程序。在本地运行应用程序docker容器非常有效。GKE的部署是通过gitlab Auto Devops管道完成的。到目前为止,将应用程序部署到GKE是可行的,我可以使用gitlab CI生成的域访问sails.js应用程序的页面,例如xyz-review-autodevops-123.my.host.com
但在访问页面时,只能加载请求的页面——图像、javascript和css文件等每个资产都不会加载,而是返回404。
当查看GKE中的nginx入口控制器日志时,我发现这些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
还定期记录以下错误。我不确定这是否与这个问题有关,但仍然想提及它,以防它是:
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"
我的猜测是,ingress不知道资产的请求主机,因为它们被请求为绝对路径(/js/cloud.setup.js
(而不是相对路径(js/cloud.setup.js
(,因此不知道将此请求路由到哪里,因为域信息在请求中丢失。
但我现在知道如何解决这个404问题了。将sails.js中的所有路径更改为相对路径会解决问题吗?我甚至不知道这是否可以容易地完成,因为相当多的任务是由sails.js中的grunt任务生成的,并且是以绝对形式生成的
好的,我自己发现了错误。这是一个愚蠢的错误,因为sails在某种程度上被配置为只将grunt
和sails-hook-grunt
作为开发依赖项包含在package.json
中。
由于在生产容器上,NODE_ENV
被设置为环境变量,因此npm install
只安装生产依赖项。
由于grunt用于操纵和提供sails.js中的资产,所以这些资产还没有生成。
解决方案是将grunt
和sails-hook-grunt
移动到package.json
中的dependencies
。