2012-10-05 14 views
0

編輯200服務器錯誤:它現在在WSGIDaemonProcess推土機不斷引發與Django項目和WSGI

我一直有內存使用問題擺脫「進程」後,並要監視內存的可能性通過使用名爲dozer的wsgi中間件泄漏:http://pypi.python.org/pypi/Dozer

下面是Apache的錯誤日誌:

的AssertionError:推土機中間件不處於多進程環境

在這裏可使用的是從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 

我該怎麼辦?謝謝

+0

1.什麼是推土機? 2.什麼是「這樣的事情」? 3.你如何配置Apache? 4.爲什麼你用「內存泄漏」標記這個? –

+0

對不起,在帖子中沒有解釋,推土機應該監控和跟蹤內存泄漏。您可以在這裏閱讀更多信息:http://pypi.python.org/pypi/Dozer Apache尚未配置。 –

回答

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 Error'是mod_wsgi 3.4中的一個小錯誤(如果這是你正在使用的)。返回的HTTP狀態代碼仍然是500,因爲它應該是全部被解釋爲應該的,但是mod_wsgi沒有正確地清除狀態行,所以Apache會用它自己的500狀態行代替它,所以標籤中使用的狀態行標籤是錯誤的。

+0

我按照你的指示刪除進程(它被設置爲2),但同樣的錯誤存在,這裏是httpd.conf文件:WSGIDaemonProcess django threads = 12 python-path =/home/path/django:/ home/django /site:/home/django/lib/python2.7 WGIProcessGroup django –

+0

你有WSGIProcessGroup指令嗎?編輯你的問題,並按照問題添加配置,以便看到它。另請閱讀http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode和http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Single_Or_Multi_Threaded –

+0

好吧,非常感謝它現在的作用! –

1

manage.py runserver本地運行它。

在一些戰略位置(例如Dozer.__init__開始和Dozer.__call__開始處)在推土機(與pdb或您的IDE)中放置斷點。 Dozerdozer/leak.py中定義。

逐步瀏覽,直到看到拋出的異常。

這不是一個簡單的答案,但你會發現問題。

+0

Bizzare! runserver命令工作得很好。 –

+0

@ LucasOu-Yang:那麼我想你不會找到問題的!我會更多地考慮這一點。檢查你的Apache錯誤日誌。你可能會在那裏得到一些信息。同時您也可以在serverfault.com上發佈類似的問題。 – dokkaebi

+0

@ LucasOu-Yang:如果你設置了'DEBUG = True',你也可能會得到美妙的django錯誤頁面,但這可能不會像wsgi中間件那樣低。 – dokkaebi