【问题标题】:Dozer keeps triggering a 200 server error with django project and wsgiDozer 不断触发 django 项目和 wsgi 的 200 服务器错误
【发布时间】:2012-10-05 15:13:23
【问题描述】:

编辑:摆脱 WSGIDaemonProcess 中的“进程”后,它现在可以工作了

我一直遇到内存使用问题,想通过使用名为 dozer 的 wsgi 中间件监控内存泄漏的可能性:http://pypi.python.org/pypi/Dozer

这里是 apache 错误日志:

AssertionError: Dozer 中间件在多进程环境中不可用

这是来自 wsgi.py 的代码 sn-p:

from django.core.wsgi import get_wsgi_application
from dozer import Dozer
application = get_wsgi_application()
application = Dozer(application)

这段代码都是在manage.py的shell中运行的,没有任何错误。

这是显示的具体错误:

服务器遇到内部错误或配置错误,无法完成您的请求。 请联系服务器管理员,[未提供地址] 并告知他们错误发生的时间,以及您可能所做的任何可能导致错误的事情。 服务器错误日志中可能会提供有关此错误的更多信息。

安装的dozer egg是最新的(python 2.7),也许服务器需要专门配置这样的东西?

这是我的 wsgi 设置:

ServerRoot "/path/django/apache2"
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so

KeepAlive Off
Listen 28861
MaxSpareThreads 3
MinSpareThreads 1
ServerLimit 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
WSGIDaemonProcess django threads=12 python-path=/path/django:/path/django/DareHut:/path/django/lib/python2.7
WGIProcessGroup django
WSGIRestrictEmbedded On
WSGILazyInitialization On
WSGIScriptAlias / /path/django/DareHut/DareHut/wsgi.py

我该怎么办?谢谢

【问题讨论】:

  • 1.什么是推土机? 2. 什么是“这样的东西”? 3. 你是如何配置 Apache 的? 4. 为什么你用“内存泄漏”来标记这个?
  • 哦抱歉没有在帖子中解释,dozer 应该监控和跟踪内存泄漏。您可以在这里阅读更多内容:pypi.python.org/pypi/Dozer Apache 尚未配置。

标签: python django memory memory-leaks


【解决方案1】:

从 Apache 发布 mod_wsgi 配置并阅读:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

要让它工作,你不能使用多进程配置。

这意味着您不能在 UNIX 系统上使用 mod_wsgi 嵌入模式。

即使使用守护进程模式,也必须使用守护进程组中只有一个进程的配置。

不过,这样做有一个警告。不要使用 WSGIDaemonProcess 的 'processes=1' 选项来执行此操作。您应该完全省略“进程”选项,让它默认为单个进程。

任何使用 'processes' 选项都会导致 'wsgi.multiprocess' 被标记为 True,这将导致 Dozer 抱怨。任何使用该选项(即使值为“1”)都会触发该标志是设计使然,因此当跨多个 Apache 服务器进行负载平衡时,即使使用单个进程,也可以将服务器标记为多进程安排的一部分。

所以使用:

WSGIDaemonProcess mygroup
WSGIProcessGroup mygroup

您可能使用了“进程”选项,或者忘记了 WSGIProcessGroup 并且实际上并没有在守护程序模式下运行,而是错误地在嵌入式模式下运行。

顺便说一句,如果您在浏览器的选项卡标签中看到它为“200 错误”,这是 mod_wsgi 3.4 中的一个小错误(如果您正在使用该错误)。返回的 HTTP 状态代码仍然是 500,因为它应该是所有内容都被解释为它应该的,但是 mod_wsgi 没有正确清除状态行,因此 Apache 将用它自己的 500 状态行替换它,因此选项卡中使用的状态行标签错误。

【讨论】:

  • 我按照您的说明删除进程(设置为 2),但存在相同的错误,这里是 httpd.conf 文件:WSGIDaemonProcess django threads=12 python-path=/home/path /django:/home/django/site:/home/django/lib/python2.7 WGIProcessGroup django
  • 你有 WSGIProcessGroup 指令吗?编辑您的问题并按要求添加配置,以便查看。另请阅读code.google.com/p/modwsgi/wiki/…code.google.com/p/modwsgi/wiki/…
【解决方案2】:

使用manage.py runserver 在本地运行它。

在 Dozer(使用 pdb 或您的 IDE)中的某些战略位置放置断点,例如在 Dozer.__init__ 的开头和 Dozer.__call__ 的开头。 Dozerdozer/leak.py 中定义。

单步执行,直到看到抛出异常。

这不是一个简单的答案,但你会发现问题的。

【讨论】:

  • @LucasOu-Yang:好吧,那我猜你不会发现问题的!我会考虑更多。检查您的 apache 错误日志。你可能会在那里得到一些信息。同时,您也可以在 serverfault.com 上发布类似的问题。
  • @LucasOu-Yang:如果你设置DEBUG=True,你也有可能得到美妙的django错误页面,但这可能无法捕捉到像wsgi中间件这样低的东西。
  • 哇哦,完全忘记了错误日志,这里是:AssertionError: Dozer middleware is not used in a multi-process environment
  • 好的,在我的 httpd.conf 文件中有两个突出的变量,wsgidaemonprocess 和 wsgiprocessgroup。这两个暗示它是一个多进程环境,对吗?我应该对他们做什么?
  • 我们现在绝对超出了我的专业领域。我认为这值得在这一点上提出一个新问题,这绝对是 serverfault 的服务器配置问题。诸如“我可以让 apache 在单个进程中运行”之类的东西吗?不过,我对那个的直觉说不。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
相关资源
最近更新 更多