我们在heroku雪松中部署了一个grails应用程序,根据heroku,我们的应用程序启动时间超过60秒:
Web进程花费的时间超过60秒才能绑定到指定的进程 $ PORT。当发生这种情况时,dyno的进程被杀死并且dyno是 被认为是崩溃了
我们减少了依赖关系,但在某些情况下,启动时间超过60秒,因此我们的应用程序被heroku停止。
你知道一些避免这种情况的方法吗?
答案 0 :(得分:4)
我有一个很好的解决方案来解决这个问题:我分叉了Grails buildpack并添加了一些强制Jetty尽早绑定到$PORT
的代码,以便Grails可以随时启动它;在Grails启动时,请求只是因为404错误而失败,但至少应用程序可靠启动。
https://github.com/funfork/heroku-buildpack-grails-earlybind
使用它:
heroku config:set BUILDPACK_URL=https://github.com/funfork/heroku-buildpack-grails-earlybind
如果你需要强制重新编译一个slug(确保你没有先挂起提交):
git commit --allow-empty -m "empty commit"
git push heroku master
你走了!
答案 1 :(得分:1)
你可以做两件事。第一种方法是尝试显式设置依赖项,以便依赖项解析不需要那么长时间。请参阅Pete's answer on slow Grails start-up。
你可以尝试的特定于Heroku的东西是使用新的2X Dyno Size,它可以提供1024MB的RAM而不是512MB(但请注意它们每小时0.10美元而不是0.05美元,不再属于免费等级。)
最后,由于Heroku正在寻找与$PORT
的绑定,您可以监听$PORT
并排队任何请求,直到应用程序完全启动。
答案 2 :(得分:1)
我在Grail的应用程序中遇到了同样的情况。我的一个应用程序正确引导,但后来我部署了另一个并遇到了这个问题,尽管它们的依赖项配置非常相似。
我通过删除BuildConfig.groovy (jquery,jquery-ui,twitter-bootstrap和lesscss-resources)中的一些js插件并手动添加此资源来解决它。
在本地,这种启动时间从20秒减少到13秒或多或少(总是谈论第一次启动,在交互模式下连续启动非常快)。考虑到我还创建了drop table并引导了一些数据,尽管在我删除提到的插件之前避免这个并没有解决我的问题。
我的其他应用程序如何设法在heroku中及时启动所有插件,这也很有趣。