【问题标题】:Restart deamon process for django under apache for each request为每个请求在 apache 下重新启动 django 的守护进程
【发布时间】:2012-09-19 08:31:20
【问题描述】:

我有许多 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 关闭
听12021
MaxSpareThreads 1
MinSpareThreads 1
MaxRequestsPerChild 1
服务器限制 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 1
WSGIDaemonProcess django 进程=5 线程=1

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

【问题讨论】:

    标签: django wsgi


    【解决方案1】:

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

    中所述

    但是它对于每个进程守护进程都是全局的。

    更新:

    或者你应该检查maximum-requests选项到WSGIDaemonProcess,就像http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines一样

    【讨论】:

    • 我也读到过这个。但是这个链接code.google.com/p/modwsgi/issues/detail?id=218 说请求必须在 5 秒内完成。有没有办法以某种方式增加这个限制?
    • 但是在这个mail-archive.com/django-users@googlegroups.com/msg84691.html用户已经谈到将它设置为1。我将尝试实现它并查看结果。
    • 很抱歉,经过几次测试后发现守护进程并未针对每个请求启动。抱歉回复仓促
    • 从表面上看,maximum-requests 似乎有效,但这次我想进行一些严格的测试。很快就会更新你。非常感谢。
    【解决方案2】:

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

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

    【讨论】:

    • 我有 1000 个这样的 django 网站,目前我无法让每个 django 网站都有自己的 WSGI 进程。另外我只想补充一点,这些网站一天被访问 40 到 50 次。这是我认为如何做到这一点的一种方式。如果有任何其他方法可以处理此问题,请给我指点。仍然存在一个问题,即 wsgi 进程只有在请求发送后才会杀死自己?
    • 现在我更加困惑了。为什么在同一台服务器上有“数千”个网站需要单独的全球数据?听起来你在代码中做了一些奇怪的事情,将全局状态保持在不应该的地方。
    • 假设我有这个奇怪的要求,我无法改变它。我需要在一台服务器上运行所有这些网站,并且需要找到一种方法。这是我唯一能弄清楚的方法。如果有任何其他方式我想知道。
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多