2010-01-21 68 views
13

我正在與我的主機提供商合作,讓Django應用程序啓動並運行,但我們都不是很有經驗,而且我們基本上已經完成了死路一條。無法解決Django設置中的mod_wsgi異常

我沒有conf文件直接訪問,但這裏是如何它的內容已經向我描述:

<IfModule mod_wsgi.c> 
WSGIScriptAlias /fredapp/ /home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi 
WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/ 
WSGIProcessGroup fred 
WSGIApplicationGroup %{GLOBAL} 
</IfModule> 

Alias /robots.txt /home/fred/public_html/fred-site/robots.txt 
Alias /favicon.ico /home/fred/public_html/fred-site/favicon.ico 

Alias /settings/media/ /home/fred/public_html/fred-site/media/ 

我「django.wsgi」的劇本是沒有任何幻想:

import os, sys 
sys.path.append('/home/fred/public_html/cgi-bin/') 
sys.path.append('/home/fred/public_html/cgi-bin/fredapp/') 
os.environ['DJANGO_SETTINGS_MODULE'] = 'fredapp.settings' 

import django.core.handlers.wsgi 

application = django.core.handlers.wsgi.WSGIHandler() 

所以我的理解是,所有這一切意味着,如果一個請求進入domain.com/fredapp/,它應該通過django.wsgi移交給應用程序。但是,我得到的唯一回應是:

[Fri Jan 22 18:46:08 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain.com/500.shtml 
[Fri Jan 22 18:46:08 2010] [error] [client xx.xxx.xx.xx] mod_wsgi (pid=26760): Exception occurred processing WSGI script '/home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi'. 
[Fri Jan 22 18:46:03 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain.com/404.shtml 
[Fri Jan 22 18:46:03 2010] [error] [client xx.xxx.xx.xx] File does not exist: /home/fred/public_html/domain 

這是在Linux上運行的Apache。我試着在服務器上的Python解釋器中運行.wsgi腳本的每一行,並且它們都沒有返回任何錯誤。我也嘗試了sys.stdout = sys.stderr的訣竅,沒有得到比上述更多的輸出。該文件不存在錯誤必須與該網站的其他設置,並在任何請求發生。我還沒有完成正確的設置(錯誤頁面和索引頁面等),因爲我只是想讓應用程序本身運行。

我已經在自己的機器上運行了Apache下的這個應用程序,雖然不是在守護進程模式下,但它是我的第一個Django應用程序,我不認爲我的託管提供程序曾經配置過,所以我們有點瞎了。如果有人有任何建議,我會非常感激。謝謝!

+1

在Apache錯誤日誌文件中'異常發生處理WSGI腳本'之後應該有回溯或其他消息。他們是什麼? – 2010-01-22 08:38:56

回答

1

有沒有可能您的起始目錄不是一個項目所在?

今天我還設置Apache + mod_wsgi的+ Django應用程序,並增加django.wsgi後:

os.chdir('/home/user/my_django_project') 

一切都開始像一個魅力的工作。

+0

感謝您的建議 - 我嘗試過,但沒有奏效。仍然得到相同的例外。 – barsoomcore 2010-01-22 00:16:41

+2

依賴當前Web應用程序的工作目錄是不好的做法,因爲您不能保證它可能在不同的託管解決方案下可能會有什麼。像你一樣改變工作目錄不一定會工作,因爲在技術上你可能有其他應用程序在相同的進程中運行,做同樣的事情,你可以把它們搞砸,否則他們會把你搞砸。因此,請始終使用絕對路徑名,並確保正確設置Python模塊搜索路徑,而不是依賴於相對於當前工作目錄的導入。 – 2010-01-22 09:59:53

+0

@Graham Dumpleton:我意識到這是不好的做法,但我有一些代碼可以在當前目錄中創建一些日誌文件。這是要重構,但一段時間,我必須忍受這種黑客。 – 2010-01-22 13:36:25

0

當運行Apache的用戶沒有權限讀取文件時,我們發生同樣的錯誤。

+1

又是什麼?發生了什麼?決議是什麼?如果你喜歡這個問題,請立即投票。這不是一個答案。 – 2010-01-22 12:21:42

+0

@ S.Lott:好吧,它是一種答案,因爲用戶如何通過設置正確的文件權限來驗證他們是否可以解決問題,可以在谷歌上搜索操作系統特定命令......我知道答案可以給出很多更多的信息,但我不會說這不是一個答案... – 2014-06-02 10:38:21

16

如果引用的配置是關於您正在使用的,實際上錯誤是相當明顯的。您有:

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/ 
WSGIProcessGroup scratchf 

它應該是:

WSGIDaemonProcess fred threads=15 display-name=%{GROUP} python-path=/home/fred/public_html/cgi-bin/fredapp/apache/ 
WSGIProcessGroup fred 

也就是說,進程組的名稱必須匹配。

你應該儘管已經看到了一條錯誤消息:

No WSGI daemon process called 'scratchf' has been configured 

這很可能是記錄錯誤之前:

Exception occurred processing WSGI script 

這就是爲什麼它是重要的,你提供所有的錯誤日誌消息並且不要認爲它們不相關。

或者,您的引用配置與您正在使用的配置不同,或者不是全部配置。


更新1

看起來你可以在Apache的啓用錯誤重定向到一個特定的URL ErrorDocument指令。因爲你已經在Web服務器的根目錄中安裝了Django,並且沒有排除那些錯誤URL被傳遞給Django,那麼當生成錯誤時,Django會獲取錯誤文檔的重定向,但它無法解析URL並隨後生成404。由於Apache看到404錯誤頁面重定向,它會返回一個500默認錯誤頁面。最終的結果是真正的原始錯誤和任何信息丟失。

因此,進入Apache配置並註釋掉ErrorDocument指令。


更新2

更改配置:

WSGIScriptAlias /fredapp /home/fred/public_html/cgi-bin/fredapp/apache/django.wsgi 

你不應該有上線的第二個值斜線。錯過了你實際上試圖掛載在子URL而不是Web服務器的根目錄。

+0

我的錯誤在抄錄,對不起。進程和進程組名稱匹配 - 我更新了配置引用以反映這一點。但是,這種配置報價當然是不完整的 - 正如我所提到的,我無法訪問實際文件,因此我無法驗證此信息。我將添加錯誤日誌的所有輸出。 – barsoomcore 2010-01-23 00:47:01

+0

謝謝。你能澄清一下你的意思嗎「在網頁服務器上安裝了Django」?我的Web服務器根目錄是domain.com/,而Django應用程序則安裝在domain.com/fredapp/。 然而,這很可能是我誤解,所以如果你能在這裏更清楚,我會很感激。 我會檢查我的提供者和ErrorDocument指令。感謝您的意見。 – barsoomcore 2010-01-23 14:28:08

+0

那麼,我的提供者堅持沒有ErrorDocument指令。在這一點上,我想我會尋求這個應用程序的新供應商。 – barsoomcore 2010-01-23 21:23:37

相關問題