Django + Uwsgi + Nginx

Настройка Django + Uwsgi + Nginx

18 August 2013 г. 21:48:05

wsgi расшифровывается как webserver gateway interface и является способом взаимодействия между python  и веб сервером. uwsgi - проект представляющий удобный способ для разработки и развертывания на распределенных приложений сервере. uwsgi можно использовать для таких языков программирования как Python, Ruby, PHP, Perl, GO и многих других.  Официальная документация на английском языке находится по адресу uwsgi-docs.readthedocs.org.

Запуск uwsgi может вызывать трудности если попытаться настроить все с первого раза, однако, если начать изучать с самого начала и продвигаться постепенно, то оказывается что ничего сложного нет. Если возникли проблемы на каком-то шаге, то надо постараться глубже разобраться в предыдущем шаге и посмотреть что изменилось и попробовать понять в чем проблема анализируя лог.

Итак для установки uwsgi можно волспольщоваться apt-get:

apt-get install uwsgi

или установить при помощи pip

apt-get install build-essential python-dev
pip install uwsgi

на этом установка завершена, можно приступать к тестированию. создадим простейшее приложение, создадим файл demo.py. Для uwsgi минимальное рабочее приложение выглядит следующим образом:

 

def application(env, start_response):
   start_response('200 OK', [('Content-Type','text/html')])
   return "Hello World"

запустим uwsgi

uwsgi --http :9090 --wsgi-file demo.py

эта команда открыла порт 9090 и ожидает запросы и ответы http. обрабатывать файл будет demo.py. открываем в браузере http://127.0.0.1:9090 и видим наше приветствие.

Hello Uwsgi

по умолчанию uwsgi работает с одним процессом и одним потоком. для создания нескольких потоков и процессов воспользуемся соответствующими директивами

  • --master не требует дополнительных параметров. Включить мастер процесс
  • --processes  указывает количество процессов
  • --threads  указывает количество потоков  в каждом процессе
uwsgi --http :9090 --wsgi-file demo.py --master --processes 4 --threads 2

для выдачи оталтодочной инормации можно использовать параметр

  • --stats который выводит конфигурацию uswgi.
uwsgi --http :9090 --wsgi-file demo.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

теперь попробуем настроить uwsgi  в звязке с nginx таким образом, чтобы некоторые запросы nginx переадресовывал uwsgi. создадим файл demo в

 /etc/nginx/sites-available/demo

 добавим следующие строки:

server {
   listen      8081;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:3031;
    }
}

nginx будет слушать порт 8081 и предавать запрос uwsgi по 3031 порту. делаем симлинк в виректорий site-enabled

sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/

и перезапускаем nginx

sudo service nginx restart

теперь запустим uwsgi

uwsgi --socket :3031 --wsgi-file demo.py --master --processes 4 --threads 2

тепрь можно проверить порт 8081 чтобы увидеть приветственное сообщение. 

Теперь попробуем запустить django через uwsgi и nginx. Настрйки nginx остануться из предыдущего примера.

создадим проект django в home директроии и назовом его demo.

cd ~

django-admin.py startproject demo

запустим uwsgi коммандой

uwsgi --socket 127.0.0.1:3031 --chdir ~/demo/ --wsgi-file demo/wsgi.py
  • --chdir указывает на путь ко проекту

все должно зарабоатать, проверим порт 8081. Однако такой способ запуска не будет работать для django < 1.4. для таких версий необходимо использовать несколько дополнительных параметров:

 

uwsgi --socket :3031 --chdir ~/demo --env DJANGO_SETTINGS_MODULE=demo.settings --module "django.core.handlers.wsgi:WSGIHandler()"
  • --chdir указывает на путь ко проекту
  • --env настройки проекта
  • --module загружает wsgi приложения.

 

можно проверять. Если возникают какие-либо ошибки смотрим лог консоли.

Мы указали далеко не полный перечень параметров, однако уже понятно что запускать uwsgi вводя параметры прямо в командную строку далеко не самый удобный способ.

Однако параметры можно сохранять в ini файлах или xml файлах настройки. создадим ini файл ~/demo/demo.ini и добавим туда следующие строчки настроек

 

[uwsgi] 
socket :3031 
chdir /home/username/demo 
env DJANGO_SETTINGS_MODULE=demo.settings 
module "django.core.handlers.wsgi:WSGIHandler()"

 

Теперь еще немного усложним задачу и попробуем использовать uwsgi и виртуальное окружение.

о работе с виртуальным окружением рассмотрено в этой статье Работа с виртуальным окружением. Подробное описание работы с виртуальным огружением будет рассмотрено в другой статье.

 создадим виртуальное окружение:

mkvirtualenv djangouwsgitest
cd djangouwsgitest

узстановим джанго, если его нет

pip install django
django-admin start project djangovirtualenv

 

не будем выполнять никаких настроек просто убедимся что джанго работает в вирутальном окружении открыв страницу приветствия.

в файл ~/demo/demo.ini добавим

virtualenv=~/.virtualenvs/djangouwsgitest/

перезапускаем uwsgi

sudo service uwsgi restart

проверяем, все работает!

 


Примечание

Ниже рассмотрены некоторые часто возникающие ошибки при установке и настройке uWsgi

 

  • ImportError: No module named "django.core.handlers.wsgi

значение module заполняется без кавычек

 

  • ImportError: No module named WSGIHandler()

Такая ошибка может возникать, если вместо : указано .

вот правильное значение:

--module "django.core.handlers.wsgi:WSGIHandler()"

 

  • uwsgi: unrecognized option '--wsgi-file'

скорее всего не установлен python-dev

apt-get install build-essential python-dev

 

  • если при попытке открыть страницу в логе получаем сообщение об ошибке

--- no python application found, check your startup logs for errors ---

скорее всего ошибка произошла из-за того что не верно указаны настройки виртуального окружения. проверьте параметр virtualenv

 

Посмотреть видео по настройке можно тут https://www.youtube.com/watch?v=dXDyHgWHtkI

Missing flash plugin. Please download the latest Adobe Flash Player:
Get Adobe Flash Player

Оставьте свой комментарий

comments powered by Disqus
Меню

Cult of digits 2014 Яндекс.Метрика