Rails 如何在服务器上实现 Rails 项目的的快速迭代,快速更新?

diguage · 2013年04月19日 · 最后由 hz_qiuyuanxin 回复于 2013年04月20日 · 3427 次阅读

先说明一下,本人刚刚学 Rails,所以问题可能有点白痴。勿怪!

在学习 Rails 时,在本地可以进行快速的迭代,即使修改数据库结构,也无须重启服务器都可以马上查看到效果。这点很爽,很赞!

最近,我看着 @happypeter 的视频,将我学习中的一个项目部署到了 VPS 上。因为在本地都已经调试过了,而且数据库修改的命令(migrate)都在本地都执行过了(进过我的观察,貌似会生出一些文件名中带时间戳的文件)。原以为再到服务器上部署时,因为修改已经在本地执行过,已经生成过迁移脚本了,再在服务器上执行修改操作时会很麻烦,没想到只需要两条指令: rake db:create rake db:migrate 数据库以及表结构都创建好了。

启动服务器(使用的是 unicorn + nginx),OK,一切运行正常。

我的问题来了: 在服务器部署完成后,如果本地修改了代码, 表结构也变了 ,在这些修改上传到服务器上之后, 能否做到不重启服务器,直接修改表结构就让应用的变化生效?如果能,如何做?如果不能,如何做,删除数据库,重建数据库结构,然后重启服务器吗?是使用如下指令吗? rake db:migrate

注:生成数据库时,有配置使用生产(product)模式的参数,不过这里我没有写明。

#1 楼 @zealinux 不能,改怎么办啊?

rake db:migrate 每次数据库改变,要执行一次,然后重启服务。

服务器不能停一下么?

#4 楼 @chenge 目前我的项目就是玩玩,可以停。如果是实际项目,比如 Ruby China,可以停吗?能否不停就更新呢?

你期望的是热部署,这个有点复杂,涉及到缓存这些。 php 似乎是可以的,每次都重新执行,效率差一些。ruby 不知道行不行。

rake db:migrate RAILS_ENV=production 数据库修改似乎是这样的命令吧。

#6 楼 @chenge PHP 确实可以,我自己的博客修改后台代码,前台一刷新就 OK 了。(后台缓存一个小时失效,然后会自动重建)

config.cache_classes = true 这个开关可能有用。config->env 目录下。代码的热部署吧。

例如你开了 2 个进程 nginx 反向代理 更新的时候先停掉一个 然后更新以后启动一个 再停掉另一个 启动另一个 这样看上去是没停

#2 楼 @diguage 建议楼主用 Capistrano 去部署,服务器端使用 nginx + passenger 这样的话每次更新代码之后重新部署,这时候是不需要重启 nginx 的,只需要重启 passenger 的。线上使用的效果是:用户只会在你重启 passenger 之后的第一次刷新页面感觉到网站慢了一下

代码热部署可以查看 unicorn 的相关文档。如果有 load balance,也可以一台一台的更新。

如果 schema 变了,需要部署后运行 rake db:migrate。如果 schema 向前兼容,或者变化不大,用了新的 schema,老的代码大部分情况上能够 work,那么可以用热部署。如果变化很大,schema 变了,老代码就会挂,那最好是停机维护。当然如果数据库做了 replication,也是有办法不停机更新的。

#6 楼 @chenge 命令确实是那样的,我在文章下面指出了,有这个参数,我这里没有显示出来。

#10 楼 @zzhattzzh Capistrano 这个东西以后会了解的。我现在是想看看如果自己动手搞,是如何搞的。

现在是 mina 的时代

unicorn 可以实现热部署

Recommend:capistrano + unicorn

需要 登录 后方可回复, 如果你还没有账号请 注册新账号