Dozer使用django项目和wsgi继续触发200服务器错误

时间:2012-10-05 15:13:23

标签: python django memory memory-leaks

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

我一直有内存使用问题,并希望通过使用名为dozer:http://pypi.python.org/pypi/Dozer的wsgi中间件来监控内存泄漏的可能性。

以下是apache错误日志:

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

以下是wsgi.py的代码段:

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

此代码全部在manage.py的shell中运行,没有错误。

以下是显示的具体错误:

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

安装的推土机蛋是最新的(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

我该怎么办?感谢

2 个答案:

答案 0 :(得分:3)

从Apache发布mod_wsgi配置并阅读:

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

要使其工作,您无法使用多进程配置。

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

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

虽然这样做有一个警告。不要使用WSGIDaemonProcess的'processes = 1'选项来做到这一点。您应该完全省略'processes'选项,并将其默认为单个进程。

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

所以使用:

WSGIDaemonProcess mygroup
WSGIProcessGroup mygroup

可能你已经使用了'processes'选项,或者忘记了WSGIProcessGroup,并且实际上并没有在守护进程模式下运行,而是在嵌入模式下运行错误。

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

答案 1 :(得分:1)

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

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

一步一步,直到看到抛出异常。

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