使django webapp重启的最佳实践

时间:2012-12-17 20:07:36

标签: python django caching

我们有一些sysadmin设置,我们向django webapp的超级用户公开。诸如域名(使用contrib.sites)和单点登录配置之类的东西。其中一些设置由系统缓存,有时是因为我们希望在每个请求中避免在中间件中额外的数据库命中,如果我们可以帮助它,有时因为它是contrib.sites,它有自己的缓存。因此,当设置更改时,更改将在重新加载应用程序后生效。

我们希望应用程序在进行这些更改时自行重启,这样我们的客户就不需要纠缠我们为它们重新启动。

我们的webapp通过mod_wsgi在apache上运行,所以我们应该只需通过触摸应用程序的wsgi文件就可以做到这一点,只要其中一个设置被更改,但这样做感觉有点奇怪,而且我'我担心我们应该遵循一些更优雅的惯例。

是否有正确的方法来应用缓存的更新并要求应用重新加载?使这些东西的缓存失效将是非常毛茸茸的,所以我想我会避免这种情况,除非重启应用程序有严重的缺点。

4 个答案:

答案 0 :(得分:2)

对于mod_wsgi,请阅读:

其他一些WSGI服务器也有类似的选项,但其他WSGI服务器中的选项通常更为有限。

答案 1 :(得分:1)

如果你使用WSGI并且你的进程正在被supervisord,gunicorn,uwsgi或类似的控制器监视,那么你可以简单地给自己发送一个SIGINT或SIGQUIT(取决于控制器)。它应该正常关闭当前进程,控制器将为您重新启动它。

import signal, os
os.kill(os.getpid(), signal.SIGQUIT)

答案 2 :(得分:0)

如果您使用mod_wsgi在apache上运行它,只需在每次更改模型时更新wsgi配置文件的时间戳。如果wsgi文件更新,Apache会自动重启应用程序。

答案 3 :(得分:0)

这取决于您的设置:

  • 如果您在单个服务器上使用wsgi,则可以触摸wsgi文件以让apache重新启动应用程序的每个实例
  • 如果您使用的是gunicorn,您可能会使用supervisord来控制它。然后supervisorctl重启APPNAME将是解决方案
  • 如果您在多台服务器上扩展应用程序,则必须确保每台服务器都重新启动其实例。有几种方法可以实现这一目标:
    • 如果您使用的是mod_wsgi,则使用相同的文件系统,然后触摸将计入每个服务器
    • 使用ssh登录其他服务器并重新启动应用

我确信有更多方法可以重新启动您的应用,但这在很大程度上取决于您的设置以及是否必须重新启动所有实例或仅重启一个实例。