Развёртывание Django с uWSGI

uWSGI это быстрый, самовосстанавливающийся и дружелюбный к разработчикам/сисадминам контейнер серверов, написанный на чистом C.

См.также

В документации uWSGI есть tutorial, в котором описана настройка Django, nginx и uWSGI (один из возможных способов установки). В этом разделе мы сфокусируемся на том, как организовать взаимодействие Django и uWSGI.

Предпосылка: uWSGI

Wiki uWSGI описывает несколько installation procedures. Используя pip, менеджер пакетов Python, вы можете установить uWSGI с помощью одной команды:

# Install current stable version.
$ pip install uwsgi

# Or install LTS (long term support).
$ pip install http://projects.unbit.it/downloads/uwsgi-lts.tar.gz

Предупреждение

Некоторые поставщики, включая Debian и Ubuntu, поставляют устаревшие версии uWSGI, которые не удовлетворяют спецификации WSGI. Версии, меньшие 1.2.6 не вызывают close ответа после обработки запроса. В этом случае сигнал request_finished не будет отправлен. Это может привести к простою соединений к БД и memcache.

Модель uWSGI

uWSGI основывается на клиент-серверной модели. Ваш веб-сервер (nginx, Apache...) обращается к рабочему процессу django-uwsgi для получения динамического контента. Подробнее описано в background documentation.

Конфигурация и запуск сервера uWSGI для Django

uWSGI поддерживает различные пути настройки, смотрите документацию о настройках и примеры

Пример команды для запуска сервера uWSGI:

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

Здесь предполагается, что есть проект верхнего уровня, называющийся mysite, и внутри него модуль mysite/wsgi.py, который содержит WSGI-объект application. Такая структура создаётся при запуске django-admin startproject mysite (где mysite - имя вашего приложения) последней версии Django. Если же такого файла нет, то надо его создать. Описание содержимого описано в Развёртывание с WSGI.

Django-специфичные опции:

  • chdir: путь к каталогу, который нужен для импорта Python – например, содержащему пакет mysite.

  • module: модуль WSGI – mysite.wsgi, если вы создавали проект командой startproject.

  • env: должен содержать как минимум DJANGO_SETTINGS_MODULE.

  • home: опциональный путь к виртуальному окружению (virtualenv).

Пример конфигурационного ini-файла:

[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log

Пример использования конфигурационного ini-файла:

uwsgi --ini uwsgi.ini

Смотрите документацию managing the uWSGI process для информации о способах запуска, остановки и обновления процессов uWSGI.