0

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

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

以下是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

我该怎么办?谢谢

4

2 回答 2

3

从 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 状态行替换它,因此选项卡中使用的状态行标签是错误的。

于 2012-10-05T21:40:02.847 回答
1

在本地运行它manage.py runserver

在 Dozer 中(使用 pdb 或您的 IDE)中的某些战略位置放置断点,例如在. 中定义。 Dozer.__init__Dozer.__call__Dozerdozer/leak.py

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

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

于 2012-10-05T17:07:32.550 回答