Запуск Django с Gunicorn - Лучшая практика

есть 3 способа запустить приложение django с gunicorn:

  1. стандартный gunicorn + wsgi (ref django doc)

    gunicorn project.wsgi:application

  2. использование интеграции gunicorn django (ref gunicorn doc и Джанго док):

    python manage.py run_gunicorn

  3. используя gunicorn_django команда (ref gunicorn док!--15-->)

    gunicorn_django [OPTIONS] [SETTINGS_PATH]

документация Django предлагает использовать 1., который даже не указан в качестве опции в документации Gunicorn.

есть ли какая-либо лучшая практика по лучшему способу запуска приложения django с gunicorn, и каковы предсказуемые преимущества/недостатки этих различных решений?

взглянув на gunicorn код похоже, они почти все делают то же самое: 2. кажется создавая тут WSGI приложение, используя внутренние Джанго, и 3. использует 2.

если это так, я бы даже не понял, почему просто не использовать "1.- все время, особенно с тех пор, как ... --6--> файл автоматически создается для вас с django 1.4; если это правда, возможно, просто следует предложить улучшение документации...

кроме того, лучшая практика для настроек gunicorn с django была бы отличной. Используя 1. есть ли смысл установить некоторые значения по умолчанию в файле WSGI и избежать дополнительных настроек?

ссылки:

  1. должен ли я использовать интеграцию django-gunicorn или wsgi? касается только варианта 1. и 3., нет подсказки для настроек, и ответ не дает никакого обоснования
  2. развертывание Django с gunicorn и nginx дайте более широкую информацию, но не строго связаны ни ответить на этот вопрос
  3. Django Gunicorn wsgi о версии "4", который запускает gunicorn -c configfile и configfile будет указывать на django_settings в django
  4. Django WSGI и Gunicorn просто немного запутанно :) смешивание 1. и 3. Конечно!--6--> используется только с 1.

3 ответов


после проверки я бы сказал, что лучший способ-использовать gunicorn + wsgi

$ gunicorn project.wsgi:application

теперь это подтверждено в документах gunicorn:если вы запускаете Django 1.4 или новее, настоятельно рекомендуется просто запустить приложение с интерфейсом WSGI с помощью команды gunicorn и Django как указано выше.

он также избегает добавления gunicorn в качестве установленного приложения, что означает, что это не требование устанавливать gunicorn для тестирования вашего приложения, которое может быть полезно время от времени.

Настройки

файл настроек Django, который будет использоваться, может быть передан через переменную ENV или настроен в . Я иногда создаю несколько wsgi.py файлы, если у меня есть несколько параметров (например. несколько веб-сайтов), которые должны запускаться из одного проекта - См. Django Doc для получения дополнительной информации.

однострочное решение, которое не требует нового файла от Карла комментарий:

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

звучит как более приятный способ (хотя я, вероятно, в конечном итоге напишу его в некоторых командах оболочки, чтобы облегчить "запоминание").

настройки Gunicorn могут быть переданы как -c settings_file, но я изучаю другие способы и попытаюсь обновить этот ответ, если найду его. Использование переменных среды кажется workaroud, но только для ограниченных случаев

в частности, было бы неплохо получить / поделиться некоторыми настройками между django и gunicorn; документация gunicorn говорит:

в настоящее время только приложения Paster имеют доступ к framework специфические настройки. Если у вас есть идеи для предоставления настроек WSGI приложения или вытягивание информации из Django settings.py почувствуй ... свободно открыть вопрос, чтобы сообщить нам об этом.

(обновление: не нашли более умного способа,но в конце концов переменных env достаточно для моих наиболее распространенных случаев).


Я думаю, используя run_gunicorn - это путь, это также Самый простой способ, чтобы использовать его.

это в основном то же самое, что usign gunicorn project.wsgi:application но нужно добавить gunicorn в INSTALLED_APPS Так что django распознает run_gunicorn команда, поэтому это, вероятно, не способ по умолчанию...

используя gunicorn_django более или менее устарел, поскольку в документации также говорится здесь...


найдено решение, которое работает как для manage.py (на местной машине) и с gunicorn

создать файл, который имеет все evniroment вещи

# 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