1

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

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

我们的 webapp 是通过 mod_wsgi 在 apache 上运行的,所以只要更改这些设置中的一个,我们应该可以通过触摸应用程序的 wsgi 文件来做到这一点,但这样做感觉有点奇怪,我担心会有我们应该遵循一些更优雅的约定。

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

4

4 回答 4

2

对于 mod_wsgi 阅读:

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

于 2012-12-17T22:23:37.337 回答
1

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

import signal, os
os.kill(os.getpid(), signal.SIGQUIT)
于 2012-12-17T23:49:38.207 回答
0

这取决于您的设置:

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

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

于 2012-12-18T08:32:26.510 回答
0

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

于 2012-12-17T21:32:51.037 回答