Django:优雅地重启nginx + fastcgi网站以反映代码更改?

时间:2010-04-08 14:19:41

标签: django nginx fastcgi

常见情况:我的服务器上有一个客户端可能会更新他的python项目中的一些代码。他可以ssh进入他的shell并从他的存储库中取出并且一切都很好 - 但代码存储在内存中(据我所知)所以我需要实际杀死fastcgi进程并重新启动它以使代码更改。 / p>

我知道我可以gracefully restart fcgi,但我不想手动执行此操作。我希望我的客户端更新代码,并在5分钟内或其他任何时间,让新代码在fcgi进程下运行。

由于

1 个答案:

答案 0 :(得分:1)

首先,如果正常运行时间对您很重要,我建议客户这样做。它可以像给他一个名为deploy-code的命令一样简单。使用您的方法,如果他们的代码中存在错误,您的方法需要10分钟的周转时间(读取:停机时间)来修复它,假设他正确无误。

也就是说,如果你真的想要这样做,你应该创建一个守护进程,它将寻找在最后5分钟内修改过的文件。如果检测到一个,它将执行reboot命令。

代码可能类似于:

import os, time
CODE_DIR = '/tmp/foo'

while True:
    if restarted = True:
        restarted = False
        time.sleep(5*60)

    for root, dirs, files in os.walk(CODE_DIR):
        if restarted=True:
            break
        for filename in files:
            if restared=True:
                break
            updated_on = os.path.getmtime(os.path.join(root, filename))
            current_time = time.time()
            if current_time - updated_on <= 6 * 60: # 6 min
                # 6 min could offer false negatives, but that's better
                # than false positives
                restarted = True
                print "We should execute the restart command here."