0

我有许多 django 安装,它们只能在一个 URL 下运行。所以我有一个像

  1. Django 安装 1
  2. Django 安装 2

  3. Django 安装 N

在我的根目录下。

现在从 URL“www.mysite.com/installation1”我选择子部分“installation1”并将 os.environ['DJANGO_SETTINGS_MODULE'] 设置为“installation.settings”并让请求得到处理。现在对于请求“www.mysite.com/installation2”,我必须这样做。但是,由于 django 在内部缓存站点对象、AppCache 等,我必须在每次请求之前重新启动 wsgi 进程,以便清除 django 的内部缓存。(我知道性能不会很好,但我并不担心)。为了实现上述场景,我实现了以下解决方案:

  1. 在 httpd.conf 中作为 WSGIDaemonProcess django processes=5 threads=1
  2. 在 django.core.handlers.wsgi 中,我在 def " call "中做了以下更改

    if environ['mod_wsgi.process_group'] != '':
        import signal, os
        print 'Sending the signal to kill the wsgi process'
        os.kill(os.getpid(), signal.SIGINT)
    return response
    

我的假设是,在发送响应后,每个请求都会杀死守护进程。我想确认这个假设,即我的进程只会在我的响应发送后才会被杀死。

还有另一种方法可以解决这个问题

谢谢

编辑:在建议将 MaxRequestsPerChild 设置为 1 之后,我对 httpd.conf 进行了以下更改

KeepAlive Off
Listen 12021
MaxSpareThreads 1
MinSpareThreads 1
MaxRequestsPerChild 1
ServerLimit 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 1
WSGIDaemonProcess django processes=5 线程=1

但是我的进程并没有在每次请求时重新启动。一旦进程启动,它就会继续处理请求。我错过了什么吗?

4

2 回答 2

0

这应该可以使用http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxrequestsperchild中所述的 apache 指令MaxRequestsForChild1

然而,它对于每个进程守护进程都是全局的。

更新:

或者您可以maximum-requestshttp://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines中检查 WSGIDaemonProcess 中的选项

于 2012-09-19T08:39:52.997 回答
0

不要这样做。WSGI 进程的持续时间比单个请求长是有原因的——你说你不担心性能,但这仍然没有理由这样做。我不知道你为什么认为你需要 - 很多人在一台服务器上运行多个 Django 站点,但没有人觉得需要在每次请求后终止进程。

相反,您需要确保每个站点在其自己的 WSGI 进程中运行。请参阅 mod_wsgi 文档以了解如何执行此操作:应用程序组似乎是一个不错的起点。

于 2012-09-19T08:40:57.360 回答