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

Max*_*xim 2 grails heroku

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

我该如何解决这个问题?

Max*_*xim 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

根据我的研究,最佳做法是在资源文件中声明您的资源.

请参阅以下内容:

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' 
  } 
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用以下两种方法之一 - 显式指定资源,或使用adhoc加载(将以下内容添加到Config.groovy中:)

grails.resources.adhoc.includes = [] 
grails.resources.adhoc.excludes = ["*"]
Run Code Online (Sandbox Code Playgroud)

它实质上禁用了adhoc资源处理.