web-dev-qa-db-ja.com

DjangoをGunicornで実行する-ベストプラクティス

Djangoアプリケーションをgunicornで実行するには3つの方法があります。

  1. 標準gunicorn + wsgiref Django doc

    gunicorn project.wsgi:application

  2. Gunicorn Django統合を使用(ref gunicorn doc および Django doc )を使用):

    python manage.py run_gunicorn

  3. gunicorn_Djangoコマンドの使用(ref gunicorn doc

    gunicorn_Django [OPTIONS] [SETTINGS_PATH]

Djangoのドキュメントでは、Gunicornのドキュメントにオプションとしてリストされていない1.の使用を推奨しています。

Djangoアプリをgunicornで実行するための最良の方法に関するベストプラクティスはありますか?これらのさまざまなソリューションの予測可能な長所/短所は何ですか?

gunicornのコード を垣間見ると、ほとんど同じように見えます。2。Djangoの内部を使用してwsgiアプリを作成しているようで、3。を使用しています。

そうだとすれば、「1」を使わない理由が何なのかわからない。常に、特にwsgi.pyファイルがDjango 1.4以降で自動作成されるため、これが当てはまる場合は、単にドキュメントの改善を提案する必要があります...

また、Djangoを使用したgunicorn設定のベストプラクティスは素晴らしいでしょう。1を使用して、wsgiファイルにいくつかのデフォルトを設定し、追加の設定を避けることは理にかなっていますか?

参照:

  1. Django-gunicorn統合またはwsgiを使用する必要がありますか? 選択肢1と3のみに関係します。設定のヒントはなく、答えには根拠がありません。
  2. Deploying Django gunicornおよびnginxを使用 いくつかのより広範な情報を提供しますが、厳密には関連しておらず、この質問に回答しません
  3. Django Gunicorn wsgigunicorn -c configfileを起動しているバージョン「4」について、configfileはDjango_settingsをDjangoにポイントします
  4. Django WSGIとGunicorn は、1と3を混同するだけで少し混乱します:)もちろん、wsgi.pyは1でのみ使用されます。
35
Stefano

チェックアウト後、gunicorn + wsgiを使用するのが最善の方法だと思います

$ gunicorn project.wsgi:application

Django 1.4以降を実行する場合は、gunicornコマンド とDjango 上記のようにリンクされています

また、インストールされたアプリとしてgunicornを追加することも避けます。つまり、アプリをテストするためにgunicornをインストールする必要がなく、時々役立つ場合があります。

設定について

使用するDjango設定ファイルは、ENV変数を介して渡すか、wsgi.pyファイルでカスタマイズできます。同じプロジェクトから実行する必要がある複数の設定(たとえば、複数のWebサイト)がある場合、複数のwsgi.pyファイルを作成することがあります- 詳細については、Django Doc を参照してください情報。

Carlのコメント からの新しいファイルを必要としないワンライナーソリューション:

Django_SETTINGS_MODULE=project.settings.prod gunicorn project.wsgi:application

より良い方法のように聞こえます(おそらく、覚えやすくするために、いくつかのシェルコマンドでそれを書くことになるでしょう)。

Gunicornの設定は-c settings_fileとして渡すことができますが、他の方法を模索しており、見つかった場合はこの回答を更新しようとします。環境変数の使用は問題ないようですが、限られた場合のみ

特に、Djangoとgunicornの間でいくつかの設定を取得/共有するといいでしょう。 gunicornドキュメンテーションは言う:

現在、Pasterアプリケーションのみがフレームワーク固有の設定にアクセスできます。 WSGIアプリケーションに設定を提供したり、Djangoのsettings.pyから情報を取得したりするアイデアがある場合は、問題を開いてお知らせください。

Update:賢い方法は見つかりませんでしたが、結局のところ、最も一般的なケースでは環境変数で十分です)。

35
Stefano

run_gunicorn を使用する方法が適していると思います。これは、最も簡単な使用方法でもあります。

これは基本的にgunicorn project.wsgi:applicationと同じですが、INSTALLED_APPSにgunicornを追加して、Djangoがrun_gunicornコマンドを認識するようにする必要があるため、おそらくデフォルトではありません。仕方...

ドキュメントにも here ...と記載されているため、gunicorn_Djangoの使用はお勧めできません。

3

Manage.py(ローカルマシン上)とgunicornの両方で機能するソリューションを見つけた

すべての環境情報を含むファイルを作成します

# mysite/settings/set_env.py

import os

_environment = os.getenv('environment', None)
if _environment == "production":
    os.environ.setdefault("Django_SETTINGS_MODULE", "mysite.settings.production")
Elif _environment == "development":
    os.environ.setdefault("Django_SETTINGS_MODULE", "mysite.settings.development")
else:
    os.environ.setdefault("Django_SETTINGS_MODULE", "mysite.settings.local")

このファイルをmanage.pyファイルとwsgi.pyファイルにインポートします。gunicornの実行で他に何も変更する必要はありません。

0
Yarh