2012-06-02 11 views
8

私はWeb上のちょうどすべてのdjango + nginxチュートリアルを試しましたが、画面に表示する画像ファイルを取得できません。それは常に古い話です。404 PAGE NOT FOUNDウェブページはうまくロードされますが、私の/static/フォルダにdjango.pngはありません。 settings.pyやnginxに問題があるかどうかはわかりません。DjangoはGunicornだけで動作できますか(Apacheもnginxもありません)?

私はそれで私は別の "nginx/djangoチュートリアルを取得する方法"を見ることを拒否することにとても不満です。近い将来にWebサイトを展開すると、GunicornはApacheやnginxを使わずにDjangoサイトを実行し、静的ファイルを同時に提供するのに十分でしょうか?最初にリバースプロキシを持つことに大きな利点がありますか?

答えて

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へのシムリンクを行うのと同じくらい簡単です。

とにかくnginxを使用している場合は、それを使用してすべての要求をプロキシし、django要求をgunicornに渡すだけでよい。これに必要なのは、confというファイルを追加することで、それに応じてnginxに指示します。

すべてを開始しようとしている人(プロキシ要求、静的なサービス、構成nginx)を一度に混乱させることができます。 1つずつ試してみてください。ガンコンからメディアを入手する。その後、nginxからそれを提供し、最終的にnginxのプロキシを持っている。しかし、あなたがあなたのアプリを制作する前にこれをすべて実行してください。このアプローチでは、理解が深まり、不満が減りました。

+2

素晴らしいアドバイス。ありがとう。 –

+0

DEBUG = Falseに設定すると動作を停止します – alanjds

+0

サーバがREST APIを実行するだけで静的ファイルはなく、ロードバランシングもなく、_nginx_を前もって持つ理由がありますか? –

5

amazon Webサービスを既に使用している場合は、s3バケットを使用して静的コンテンツをホストし、gunicorn(または任意のもの)を使用してec2にアプリケーションをデプロイできます。こうすることで、独自の静的ファイルサーバーの設定について心配する必要はありません。

7

Gunicornのドキュメントは、低速のクライアントをバッファリングするプロキシせずに、デフォルトの労働者は、サービス拒否攻撃を受けやすいことに注意:http://gunicorn.org/deploy.html

利用できる多くのHTTPプロキシがありますが、私たちは強くあなたが使用 に助言しますNginx。別のプロキシサーバーを選択する場合は、デフォルトのGunicorn ワーカーを使用する場合、遅いクライアントをバッファリングするように、 を設定する必要があります。このバッファリングがなければ、Gunicornは簡単に サービス拒否攻撃の影響を受けやすくなります。あなたは プロキシが適切に動作しているかどうかを確認するためにスローローを使用することができます。

これは、geventや竜巻などの非同期作業者のいずれかを使用している場合には当てはまりません。

1

私はWerkzeugミドルウェアを使用して作成しました。美しく、またnginxのサーバーを使用するなど、パフォーマンスではありませんが、仕事をしていません:

設定STATIC_ROOTはsettings.py

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

上でこのフォルダから

# 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'), 
}) 

をファイルを提供するWERKZEUGを伝えたよりDEBUG = Trueの場合、Djangoはファイルを提供します。 DEBUG = Falseの場合、Werkzeugは静的に収集されたフォルダからファイルを提供します。これを行うには、DEBUG = Falseを使用するサーバー上でcollectstaticを実行する必要があります。

Obs:何らかの理由で、Werkzeugは、見つからないファイルではなく、見つからないファイルに対して500を与えます。理由を知っているなら、コメントしてください。

2

私はいくつかの理由のために前にnginxのの使用をお勧めします:

  • gunicornがダウンしているとき、メンテナンスや内部サーバーエラーページが容易に実現できます。つまり、アプリケーションサーバーが稼動していない場合には、何か応答する必要があります。
  • Gunicorn docが示唆しているように、DOSなどのhttp攻撃は検出されません。
  • 独自のロードバランシング戦略を後で実装することができます。これは、プロジェクトの規模に応じてリリースエンジニアリングにとってより重要になります。個人的に、私はAWS ELBが少し信頼できないと感じました。私はそれについて考えています。

更新

また、Gunicorn開発者がよく書かれて答えを参照してください。一度それを試してみてくださいする

Why do I need Nginx and something like Gunicorn?

+0

ガンコンが停止しているときにエラーページを表示するにはどうすればよいですか? – compie

+0

ファイルの存在チェックをnginxに追加することができます:http://serverfault.com/questions/310819/maintenance-page-on-nginx-best-practicesまた、そのファイルにタッチするためのbashのショートカットです。 – hurturk

関連する問題