2012-06-02 67 views
8

我已經嘗試過幾乎每個在網絡上的django + nginx教程,我無法得到一個圖像文件顯示在屏幕上。它始終是舊的故事 - 404 PAGE NOT FOUND。網頁加載正常,但我的/static/文件夾中的django.png沒有。不知道在settings.py或nginx中是否有問題。Can Django能單獨運行在Gunicorn上(沒有Apache或nginx)嗎?

我很沮喪,我拒絕看另一個「如何獲得nginx/django教程」。如果我在不久的將來部署一個網站,Gunicorn就足以運行一個Django站點並同時提供靜態文件,而無需使用Apache或nginx?首先有一個逆向代理有很大好處嗎?

回答

6

是的。 Gunicorn也可以爲你的靜態服務。

如果一切都失敗了,讓Django的爲你做它要做到這一點,你只需要添加一個URL模式,如下(雖然這樣做,因爲無奈纔不得已而爲之。):

urlpatterns = patterns('', 
    # ... the rest of your URLconf goes here ... 
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

雖然django提供靜態服務比不提供服務更好,但值得委託給像nginx一樣優化的服務器。

我建議在不同的端口上運行nginx,並將django STATIC_URL設置更改爲包含端口(在確認端口服務於靜態後)。 - 這樣做和從nginx文件夾到MEDIA_ROOT的simlink一樣簡單。

如果你使用nginx,也可以使用它來代理所有請求,並且只將django請求傳遞給gunicorn。所有這些都需要添加一個conf文件來相應地告訴nginx。

我可以看到它對於那些正在開始並嘗試一次執行所有操作(代理請求,靜態服務,配置nginx)的人來說可能會感到困惑。一個接一個地嘗試。從gunicorn獲取媒體;然後從nginx提供它,然後最終擁有nginx代理。但是,在你的應用程序投入使用之前,一定要做這件事這種方法,我看到增加了解和減少挫折感。

+2

大的意見,嘗試一次一個。謝謝。 –

+0

當我設置DEBUG = False時,它停止工作 – alanjds

+0

如果我的服務器只是做REST API,沒有靜態文件,沒有負載平衡,是否有任何理由在前面還有_nginx_? –

5

如果您已經在使用亞馬遜網絡服務,您可以使用S3桶來託管您的靜態內容,並使用gunicorn(或任何您想要的)將您的應用程序部署到ec2。這樣,你根本不用擔心設置你自己的靜態文件服務器。

7

的Gunicorn文檔指出,沒有代理緩衝慢客戶端,默認工人容易受到服務拒絕攻擊:http://gunicorn.org/deploy.html

雖然有許多可用的HTTP代理,我們強烈建議 您使用Nginx的。如果您選擇另一臺代理服務器,則需要 確保它在使用默認Gunicorn 工作人員時緩存較慢的客戶端。如果沒有這種緩衝,Gunicorn將很容易受到拒絕服務攻擊。您可以使用slowloris來檢查您的代理是否正常運行。

當使用諸如gevent或龍捲風之類的異步工作者時,情況可能並非如此。

1

我使用Werkzeug中間件製作而成。是不是漂亮,也不作爲高性能使用nginx的服務器,但這項工作:在settings.py

集STATIC_ROOT

# project/settings.py 
import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__))) 
STATIC_ROOT = BASE_DIR+'/static-collected' 

不是告訴WERKZEUG從該文件夾

# project/wsgi.py 
import os 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 

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

import os 
from werkzeug.wsgi import SharedDataMiddleware 
print 'Installing WSGI static files server middleware' 
application = SharedDataMiddleware(application, { 
    '/static': os.path.join(BASE_DIR, 'static-collected'), 
}) 

提供文件服務當DEBUG = True時,Django提供這些文件。當DEBUG = False時,Werkzeug從靜態收集文件夾提供文件。您需要在使用DEBUG = False的服務器上運行collectstatic才能正常工作。

Obs:由於某些原因,Werkzeug給出了500個未找到的文件,而不是404個。它很奇怪,但仍然有效。如果你知道爲什麼,請評論。

2

我建議在使用前Nginx的有以下幾個原因:

  • 維護或內部服務器錯誤頁面可以在gunicorn下跌可以輕鬆實現。這意味着如果您的應用程序服務器未運行,您將始終有迴應。
  • 由於Gunicorn doc暗示,沒有檢測到諸如DOS的http攻擊。
  • 稍後您可能希望實現自己的負載平衡策略。隨着項目規模的擴大,這對發佈工程將變得更加重要。就我個人而言,我發現AWS ELB有點不可靠,我在想它。

更新

另外,請參閱寫得很好的答案被Gunicorn開發商:

Why do I need Nginx and something like Gunicorn?

+0

如何在gunicorn停機時顯示錯誤頁面? – compie

+0

你可以添加一個文件存在檢查到nginx:http://serverfault.com/questions/310819/maintenance-page-on-nginx-best-practices另外一個bash快捷方式來觸摸/ rm該文件。 – hurturk

相關問題