Heroku,Grails:如果使用多个网络动态,则缺少资源

时间:2012-01-16 15:14:29

标签: grails heroku

我已经创建了grails应用程序并将其上传到heroku 如果我使用' heroku scale web = 1' 一切正常。但如果我运行' heroku scale web = 2' ,一些静态资源就会消失。
从日志我可以看出,来自web.2 dyno的所有静态资源都缺失了。但是这个dyno没有任何错误就开始了。

如何解决此问题?

3 个答案:

答案 0 :(得分:5)

https://github.com/grails-plugins/grails-resources/pull/11

根据资源插件的所有者Marc Palmer的说法,他们忽略了对旧的静态资源引用的检查。

因此,如果您没有使用粘性负载平衡(Heroku就是这种情况),这表明您可以在任何系统上使用负载平衡问题。以下是Heroku案件中发生的事情:

  1. 请求进入someapp.com
  2. index.gsp从app server 1,web.1提供 index.gsp包含
  3. 资源插件在web.1上生成从/static/js/resource.js到/js/resource.js的映射。
  4. 客户请求/static/js/resource.js
  5. 请求将路由到其他应用服务器web.2
  6. /static/js/resource.js尚未映射到web.2和404s
  7. 根据我的研究,最佳做法是在资源文件中声明您的资源。

    请参阅以下内容:

    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。

http://grails.org/plugin/amazon-s3