我已经创建了grails应用程序并将其上传到heroku
如果我使用' heroku scale web = 1' 一切正常。但如果我运行' heroku scale web = 2' ,一些静态资源就会消失。
从日志我可以看出,来自web.2 dyno的所有静态资源都缺失了。但是这个dyno没有任何错误就开始了。
如何解决此问题?
答案 0 :(得分:5)
https://github.com/grails-plugins/grails-resources/pull/11
根据资源插件的所有者Marc Palmer的说法,他们忽略了对旧的静态资源引用的检查。
因此,如果您没有使用粘性负载平衡(Heroku就是这种情况),这表明您可以在任何系统上使用负载平衡问题。以下是Heroku案件中发生的事情:
根据我的研究,最佳做法是在资源文件中声明您的资源。
请参阅以下内容:
http://grails-plugins.github.com/grails-resources/guide/3.%20Declaring%20resources.html
这将告诉应用服务器在启动时预先存在资源,从而避免了adhoc加载过程。
例如,与我之前的电子邮件一样,MyResources.groovy看起来像:
modules = {
application {
resource url:'js/application.js'
resource url:'js/ui.geo_autocomplete.js'
}
}
因此,您可以使用以下两种方法之一 - 显式指定资源,或使用adhoc加载(将以下内容添加到Config.groovy中)。
grails.resources.adhoc.includes = []
grails.resources.adhoc.excludes = ["*"]
它实质上禁用了adhoc资源处理。
答案 1 :(得分:1)
我在ApplicationResources.groovy中无法直接定义的图像文件存在类似问题。不过我找到了一个解决方法:
将一个CSS文件添加到ApplicationResources.groovy,该文件对于您需要加载的所有资产都有多个类定义,如下所示:
.asset1 {
background: url('path/to/image1.png');
}
.asset2 {
background: url('path/to/image2.png');
}
.asset3 {
background: url('path/to/image3.png');
}
...
在ApplicationResources.groovy中定义以下内容:
modules = {
...
myModule {
resource url: 'path/to/assets.css'
}
...
}
现在,当从GSP视图加载包含CSS文件的模块时,或者如果图像是从JavaScript等动态引用的,那么Resources插件已经为这些图像准备好了这些路径。
相当hacky但它的确有效。在Heroku中用2个dynos进行了测试。
答案 2 :(得分:0)
所有dynos中都应包含你的slug(你的git push)中的所有资产。这些资产是否已上传?如果是这样,Heroku有一个有效的只读文件系统(http://devcenter.heroku.com/articles/dyno-isolation#ephemeral_filesystem),所以你需要确保这些资产转向外部的东西,如Amazons S3。