一句话,不支持。 但可以变相实现零当机。
参考 http://www.slideshare.net/pedrobelo/zero-downtime-deploys-for-rails-apps http://www.engineyard.com/blog/2011/zero-downtime-deploys-with-migrations/ http://blog.tstmedia.com/news_article/show/85364?referrer_id=308069
在使用 passenger 时,touch tmp/restart.txt也是把rack重启一下,不应该算是热部署。
如果以上有不对的地方,请指教。
第一个 slide 不错: 实现 Rails 热部署需要解决 3 个问题:
其中下面两个链接讲的大概是减少 db migration 的技巧。 第一个 slide 里还提到了 preboot 方法,通过路由切换的方式减少 server reboot 时间:
正常部署过程是:
使用 preboot 方式之后,减少了 3-6 之间的等待时间:
但是不能处理带有 db migration 的部署。
@fsword 确切的说,就是当 git repo 更新后,推到生产环境。rack 不重起,就可以把 rails 环境 reload 一遍。类似在 Rails console 下输入 reload! 的效果。
@fsword 用的是 apache + passenger,没做优化,进程多少不清楚。 不中断服务,重启服务的方法已经了解,可以满足要求。
我这里讨论仅是开个话题。有好思路还请提醒。
成功的热部署应该是象 erlang 那样,用非共享的多实例切换来解决问题,但是对 ruby/java 这种对象化的语言来说,vm 实现通常是不支持内存隔离的,所以正确的方向应该是以进程或者主机为单位来切换