【问题标题】:mod_wsgi and Django app periodically hangmod_wsgi 和 Django 应用程序定期挂起
【发布时间】:2011-02-06 14:24:09
【问题描述】:

我有一个大型 Django 应用程序。它有两个指向不同设置文件的 Apache 虚拟主机,因此应用程序的一部分可通过一个 URL 访问,部分应用程序可通过另一个 URL 访问。 Django 应用使用 virtualenv。

mod_wsgi 被配置为在 Apache 的 VirtualHost 块中以守护程序模式运行:

# domain 1:
WSGIDaemonProcess fc processes=5 threads=5 display-name=%{GROUP} \
    user=nobody group=nobody
WSGIScriptAlias / /var/www/python/mine/apache/my.wsgi \
    process-group=fc application-group=%{GROUP}


# different apache.conf file for domain 2:
WSGIDaemonProcess fm processes=5 threads=5 display-name=%{GROUP} \
    user=nobody group=nobody

WSGIScriptAlias / /var/www/python/mine/apache/other.wsgi \
    process-group=fm application-group=%{GROUP}

在使用网站时,请求会时不时地挂起。它永远不会完成。我必须使用浏览器的“刷新”按钮重新加载页面,然后请求才能正常工作。

Apache 本身在 prefork 模式下运行,MaxRequestsPerChild 设置为 0,因为我读过这可能是一个问题。这种情况经常发生,足以成为一个潜在问题 - 可能每 100 个请求,类似这样。

有人知道为什么会这样吗?

谢谢

【问题讨论】:

  • 您在错误和访问日志中看到了什么?
  • @payne:错误日志中没有错误,访问日志中也没有任何异常。我不知道挂起的请求是否在访问日志中有条目。

标签: mod-wsgi


【解决方案1】:

对于 WSGIDaemonProcess 选项,应该是 'application-group=%{GLOBAL}',而不是 '%{GROUP}'。 '%{GLOBAL}' 是特殊的,表示主要的 Python 解释器。使用主解释器通常会解决 Python 的第三方 C 扩展模块在子解释器中不起作用的问题,包括遇到死锁。 '%{GROUP}' 值仅与 'display-name' 选项相关。

【讨论】:

  • 感谢您的回复。为了安全起见,我已经进行了更改,停止并启动了 apache,删除了所有 *.pyc 文件,但问题仍然存在。我正在查看 django 管理区域并且正在发生这种情况,所以虽然它可能是 C 扩展,但我不知道这是否可能(我不知道 Python 解释器如何在内部重新加载模块)。当发生这种情况时,页面会在 2-3 分钟后加载(但我不知道这是否只是 Chromium 重新发出请求)。
  • 您是否尝试过其他浏览器以确保它不是浏览器?您可以为 Apache 使用 worker MPM 而不是 prefork,还是因为在同一个 Apache 中使用 PHP 而被困住了?最后,尝试“code.google.com/p/modwsgi/wiki/…”中描述的 gdb 技术,尝试从守护进程中的所有线程中获取堆栈跟踪,以便找出它挂在哪里。顺便说一句,StackOverflow 不是调试的好地方,请改用 mod_wsgi 邮件列表。
  • 其实我觉得这个问题现在可能已经解决了,Chromium 还有一个问题。如果我查看页面源,它​​就在那里,所以似乎由于某种原因 Chromium 没有呈现页面。该网站在 Firefox 中似乎很好,所以我会密切关注它。非常感谢。
猜你喜欢
  • 2013-06-19
  • 2012-11-04
  • 2013-08-07
  • 2016-06-06
  • 2016-02-09
  • 2014-02-27
  • 2021-03-14
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多