从VCS更新实时服务器

时间:2009-01-11 17:06:23

标签: django bash

我将所有Django站点作为SCGI守护进程运行。我不会深入了解为什么我这样做,但这意味着当一个站点运行时,有一组进程从以下命令运行:

/websites/website-name/manage.py runfcgi method=threaded host=127.0.0.1 port=3036 protocol=scgi

一切都很好,直到我想从VCS推出新版本(在我的案例中为Bazaar)。我创建了一个名为up的别名脚本,它执行以下操作:

alias up='bzr up; killall manage.py'

这个泛型只是一个简单的原因:我很懒。我想要一个可以在任何站点下使用的命令来更新它。我大部分时间都登录到了服务器,因此,我只是跳到正确网站的根目录并致电up。 BZR的站点更新并重新启动。

这样做的第一个缺点是它会杀死计算机上的所有manage.py进程。目前有6个站点并且增长迅速。第二个(可能更糟 - 至少对于最终用户而言)是一次非常不优雅的重启。如果有人上传图片或者用很长的连接时间做其他事情,他们的请求就会死在藤蔓上。

所以我正在寻找的是单一方法的建议:

  1. 对于像我这样的懒人来说是通用的(例如,我可以从任何站点root运行它,而不必记住我需要调用哪个命令; 'up'在名称上是完美的。
  2. 仅杀死当前网站。我只是更新当前网站,所以只有这个网站应该死掉。
  3. 以优雅的方式重启。如果可能,它应该等到没有更多活动连接。我不知道这有多可行。

1 个答案:

答案 0 :(得分:2)

而不是使用名称中的manage.py来杀死所有内容,您是否可以为每个仅从该站点杀死manage.py进程的站点编写脚本? (编辑:只需编写脚本并将它们放在每个站点的根目录中(无论如何都是cd)并运行它们 - 仍然只记住一个命令)

我对SCGI或Bazaar的了解不够多......我的方法(我也很懒)使用Mercurial和Fabric进行部署:http://stevelosh.com/blog/entry/2009/1/15/deploying-site-fabric-and-mercurial/ - 也许它会给你一个你可以使用的想法吗?