18 August 2013 г. 21:48:05
wsgi расшифровывается как webserver gateway interface и является способом взаимодействия между python и веб сервером. uwsgi - проект представляющий удобный способ для разработки и развертывания на распределенных приложений сервере. uwsgi можно использовать для таких языков программирования как Python, Ruby, PHP, Perl, GO и многих других. Официальная документация на английском языке находится по адресу uwsgi-docs.readthedocs.org.
Запуск uwsgi может вызывать трудности если попытаться настроить все с первого раза, однако, если начать изучать с самого начала и продвигаться постепенно, то оказывается что ничего сложного нет. Если возникли проблемы на каком-то шаге, то надо постараться глубже разобраться в предыдущем шаге и посмотреть что изменилось и попробовать понять в чем проблема анализируя лог.
~cut~
Итак для установки 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 и видим наше приветствие.
по умолчанию uwsgi работает с одним процессом и одним потоком. для создания нескольких потоков и процессов воспользуемся соответствующими директивами
uwsgi --http :9090 --wsgi-file demo.py --master --processes 4 --threads 2
для выдачи оталтодочной инормации можно использовать параметр
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
все должно зарабоатать, проверим порт 8081. Однако такой способ запуска не будет работать для django < 1.4. для таких версий необходимо использовать несколько дополнительных параметров:
uwsgi --socket :3031 --chdir ~/demo --env DJANGO_SETTINGS_MODULE=demo.settings --module "django.core.handlers.wsgi:WSGIHandler()"
можно проверять. Если возникают какие-либо ошибки смотрим лог консоли.
Мы указали далеко не полный перечень параметров, однако уже понятно что запускать 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
значение module заполняется без кавычек
Такая ошибка может возникать, если вместо : указано .
вот правильное значение:
--module "django.core.handlers.wsgi:WSGIHandler()"
скорее всего не установлен 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