在apache下为每个请求重新启动django的守护程序进程

时间:2012-09-19 08:31:20

标签: django wsgi

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

这样的结构
  1. Django安装1
  2. Django安装2

  3. Django Installation N

  4. 在我的根目录下。

    现在从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“调用”中进行了以下更改

      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
      
    3. 我的假设是,在发送响应后,每个请求都会杀死deamon进程。我想证实这一假设,即我的过程只会被杀死,并且只有在我的回复被发送后才会被杀死。

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

      由于

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

      KeepAlive Off
      听12021
      MaxSpareThreads 1
      MinSpareThreads 1
      MaxRequestsPerChild 1
      ServerLimit 1
      HTTPS上的SetEnvIf X-Forwarded-SSL = 1 ThreadsPerChild 1
      WSGIDaemonProcess django processes = 5 threads = 1

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

2 个答案:

答案 0 :(得分:0)

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

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

<强>更新

或者你可以在http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines

中检查maximum-requests选项进入WSGIDaemonProcess

答案 1 :(得分:0)

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

相反,您需要确保每个站点都在自己的WSGI进程中运行。请参阅mod_wsgi文档以了解如何执行此操作:Application Groups似乎是一个很好的起点。