【问题标题】:Django: Gracefully restart nginx + fastcgi sites to reflect code changes?Django:优雅地重启 nginx + fastcgi 站点以反映代码更改?
【发布时间】:2011-02-05 17:40:46
【问题描述】:

常见情况:我的服务器上有一个客户端,他可能会更新他的 python 项目中的一些代码。他可以 ssh 进入他的 shell 并从他的存储库中提取,一切都很好——但是代码存储在内存中(据我所知),所以我需要真正终止 fastcgi 进程并重新启动它以更改代码。

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

谢谢

【问题讨论】:

    标签: django nginx fastcgi


    【解决方案1】:

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

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

    代码可能类似于:

    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."
    

    【讨论】:

    • 每个客户端当前共享自己的进程(我使用 svc 和 bash 脚本基本上从自己的目录启动 manage.py runfcgi).. 我没有很多,所以这不是一个真正的问题.我将如何允许他们使用部署代码脚本重新启动自己? daemontool 文件位于/etc/service/&lt;appname&gt;/ 中,因此它们无权触摸这些文件,也无权使用svc -d/-u 重新启动服务。不过,感谢您迄今为止的帮助!
    • 我不完全确定重启 fcgi 进程需要什么。如果它类似于 mod_wsgi,你可以触摸 wsgi 文件(apache 监控 mtime)。或者,您可以授予对 bash 脚本的访问权限,并使其更智能(因此它可以正确处理用户权限)。或者您可以重新考虑您的部署以允许每个应用程序有 1 个进程,然后他们可以根据需要随时重新启动自己的进程。不确定哪个适合您,但上面的脚本回答了您提出的问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 2011-06-14
    • 2012-07-24
    • 2021-09-18
    • 1970-01-01
    • 2018-07-14
    • 2013-12-13
    • 2013-10-17
    相关资源
    最近更新 更多