Развёртывание 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 https://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

Исправляем UnicodeEncodeError при загрузке файлов

Если вы получили UnicodeEncodeError при загрузке файлов, названия которых содержат не ASCII символы, убедитесь, что uWSGI настроен для загрузки таких файлов. Для этого укажите в uwsgi.ini:

env = LANG='en_US.UTF-8'

Подробности смотрите в разделе Файлы.

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