2013-07-22 90 views
0

我正在研究一個帶有Mongo後端的Django系統,我第一次嘗試了這個設置。它有一個相當標準的nginx-hands-off-to-Apache-for-python服務器設置。這一切似乎都適用於同一臺服務器上更標準的Django-MySQL應用程序。django通過shell但通過瀏覽器獲得504

對於我的Django的蒙戈的應用程序,當我使用 '蟒蛇manage.py殼',我得到:

from django.test.client import Client 
client = Client() 
response = client.get('/') 
response.status_code 
200 
response.content 
'<html>\n <head>\n <link href="/static/blog.css" rel="stylesheet" type="text/css">\n <title>Worldmaker</title>\n </head>\n <body>\n  <ul>\n  <li><a href="sourcedoc/create/">New Sourcedoc</a></li>\n  <li><a href="sourcedoc/list/">All Sourcedocs</a></li>\n  <li><a href="noun/create/">New Noun</a></li>\n  <li><a href="noun/list/">All Nouns</a></li>\n  </ul>\n  <h1>Worldmaker</h1>\n \n\n </body>\n</html>\n\n' 

然而,當我瀏覽到http://www.mydomain.com/gogoworld/,我得到一個nginx的504頁:

504網關超時 的nginx/1.4.1

我的/ etc/nginx的/啓用的站點 - /虛擬主機包括這樣的:

location /gogoworld/ { 
    proxy_pass http://127.0.0.1:84; 
    include /etc/nginx/proxy.conf; 
    } 

我/etc/apache2/httpd.conf包括這樣的:

<Directory "/home/rosshartshorn/htdocs/gogoworld"> 
WSGIScriptAlias /gogoworld /home/rosshartshorn/htdocs/gogoworld/wsgi.py 

WSGIPythonPath /home/rosshartshorn/htdocs/ordinarymysqlapp:/home/rosshartshorn/htdocs/worldmaker:/home/rosshartshorn/htdocs/gogoworld 

我的urls.py

from django.conf.urls import patterns, include, url 

from sourcedocs import views 

urlpatterns = patterns('', 
    url(r'^$', views.index), 
) 

我的困惑是對區別是使用django.text.client之間是什麼,並用我的網頁瀏覽器ping站點。我原以爲這是同樣的事情,但是因爲一個人回覆而另一個沒有迴應,我顯然是不正確的。僅在apache和/或nginx級別有所不同,還是django機器的不同部分有所不同?有什麼想法看看爲什麼在django shell中工作,但不通過瀏覽器?

編輯:這裏是什麼在我的網站可用/ rosshartshorn:

Listen 84 

<IfModule mod_ssl.c> 
    Listen 443 
</IfModule> 

<IfModule mod_gnutls.c> 
    Listen 443 
</IfModule> 
<VirtualHost *:84> 
    ServerName  www.rosshartshorn.net 
    ServerAlias rosshartshorn.net 
    DocumentRoot /home/rosshartshorn/htdocs 
    <Directory /home/rosshartshorn/htdocs> 
    AllowOverride All 
    allow from all 
    </Directory> 
</VirtualHost> 
+1

使用'django.test.client'進行測試與使用Django內置webserver(通過'manage.py runserver')測試類似。 目前,您正在使用「真實世界」堆棧nginx-apache-django,所以我想問題在於nginx和apache之間的配置。你能否更詳細地描述你的堆棧?例如:browser => nginx => Apache => Django? –

+0

是的,nginx將這個應用程序所在的子文件夾交給了Apache(也適用於Django-mysql應用程序,它適用,所以我認爲這是正確的)。然後Apache應該交給Django,並且它也適用於舊版應用程序。 Nginx具有80端口併發送到Apache的端口84。我相信較老的應用程序是在Django 1.3下編寫的,而較新的應用程序是在Django 1.5下編寫的,所以它們的目錄結構由於Django的變化而有所不同,但似乎我們甚至沒有達到這一點。 – rossdavidh

+1

因爲504意味着你的請求永遠不會到達後端服務器,所以首先測試django和apache是​​很有意義的。你可以嘗試重新配置一下Apache(如果需要的話)來監聽端口84並首先嚐試'yourdomain.com:84'嗎? –

回答

0

非常感謝總管Hieu阮他的上述評論,這讓我覺得我的方式來調試這一點。很多使用/var/log/apache2/error.log來查看發生了什麼/沒有發生,以及「import sys print >> sys.stderr,[some debug statement]」

原來,問題是在我的/etc/apache2/httpd.conf,現在看起來更像是這樣的:

WSGIScriptAlias /secretoktobermoneymade /home/rosshartshorn/htdocs/ordinarymysqlapp/wsgi.py 
WSGIScriptAlias /gogoworld /home/rosshartshorn/htdocs/gogoworld/gogoworld/wsgi.py 

WSGIPythonPath /home/rosshartshorn/htdocs/gogoworld/:/home/rosshartshorn/htdocs/gogoworld/gogoworld:/home/rosshartshorn/htdocs/ordinarymysqlapp 

以前,我曾不具有gogoworld/wsgi.py是Python路徑上的位置的組合,然後也是gogoworld/wsgi.py首先尋找ordinarymysqlapp的settings.py並運行它的問題(這就是爲什麼我切換順序以便gogoworld首先在WSGIPythonPath中發生)的問題。我相信當你有多個django應用程序時,可能有更好的方法來設置它,但是這個設置似乎適用於新舊應用程序。長話短說:多個Django應用程序需要更多的Apache知識,如果你不是Apache專家,那麼你將不得不花費一些時間來擺弄它以獲得正確的wsgi.py執行,並且正確的設置!

+0

這個線程在設置兩個不同的django項目時也很有用:http://stackoverflow.com/questions/9581197/two-django-projects-running-simultaneously-and-mod-wsgi-acting-werid – rossdavidh