Как использовать Django с uWSGI
uWSGI — это быстрый, самовосстанавливающийся и удобный для разработчиков/системных администраторов контейнерный сервер приложений, написанный на чистом C.
См. также
Документация uWSGI содержит учебник, посвященный Django, nginx и uWSGI (одно из возможных вариантов развертывания). Нижеследующая документация фокусируется на интеграции Django с uWSGI.
Предварительное условие: uWSGI
В вики uWSGI описаны различные процедуры установки. Используя менеджер пакетов Python pip, можно установить любую версию 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 для предоставления динамического контента. Более подробную информацию см. в документации uWSGI.
Настройка и запуск сервера uWSGI для Django
uWSGI поддерживает несколько способов настройки процесса. См. документацию по конфигурации и примеры 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: Необязательный путь к вашему виртуальному окружению проекта.
Пример файла конфигурации 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 для загрузки файлов
Если при загрузке файлов с именами, содержащими не-ASCII символы, возникает UnicodeEncodeError, убедитесь, что uWSGI настроен на принятие имён файлов с не-ASCII символами, добавив это в ваш uwsgi.ini:
env = LANG=en_US.UTF-8
Для получения дополнительной информации см. раздел Файлы руководства по Юникоду.
См. документацию uWSGI по управлению процессом uWSGI для получения информации о запуске, остановке и перезагрузке рабочих процессов uWSGI.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/uwsgi/