Python — Nginx-uWSGI-Django
Начнем с самого начала:
uWSGI - это еще один WSGI сервер, позволяющий запускать приложения, написанные на Python (на самом деле, не только на нем).
Официальный сайт расположен по адресу - http://projects.unbit.it/uwsgi.
Впечатляющие (особенно для любителей сферически-вакуумных коней) тесты производительности можно найти здесь - http://nichol.as/benchmark-of-python-web-servers.
Впрочем, в результатах нет ничего удивительного - uWSGI написан на чистом С и, очевидно, написан хорошо.
Полагаю, с предисловием на этом можно закончить.
В качестве практической части предлагаю описание установки и запуска связки uWSGI+nginx+Django.
Для начала установим uWSGI:
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
либо:
pip install http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
либо ищем в репах своего дистрибутива.
В случае с Arch-ем, это будет, естественно:
yaourt -Ss uwsgi
Разницы нет, но я предпочитаю первый способ.
С установкой штатными средствами могут возникнуть сложности - т.к. с версией nginx < 0.8.40 нам еще будут нужны файлы модуля для nginx из архива uwsgi. Установка через pip проще, но, опять же, сейчас я ее рассматривать не собираюсь.
Далее - все просто(даже слишком). Распаковываем полученный архив(если ставим из исходников,), переходим в каталог и выполняем самый заурядный:
make
либо:
make -f Makefile.Py26 - если мы собираем uWSGI под конкретную версию Python'а
либо:
python uwsgiconfig.py --build - если по каким-то причинам нет возможности добраться до make.
Зависимостей у uWSGI немного - только заголовочные файлы Python'а и libxml2.
Через пару минут все это добро скомпилируется. Можно двигаться дальше и установить nginx.
Для упрощения задачи возьмем одну из свежих текущих версий. К примеру эту - http://nginx.org/download/nginx-0.8.41.tar.gz. Последние версии(начиная 0.8.40) идут уже в комплекте с uWSGI-модулем, в случае с более ранними версиями, при компиляции необходимо будет указать обычное для установки модулей:
--add-module=$/путь/до/uwsgi/nginx
В случае с последними версиями nginx можно еще указать и:
--http-uwsgi-temp-path= /бла/бла/бла - дабы он находился за пределами каталога, в который ставится nginx
Прочии опции типичны для любой сборки nginx. Впрочем, я посоветовал бы указать еще и prefix - т.к. мы работаем помимо всех средств установки и забота о поддержании актуальности версии ляжет на наши плечи.
Сборка nginx'а так же не должна занять много времени.
Полагаю, Django у вас уже установлен и на этом моменте останавливаться не буду. Перейдем к самому интересному - настройке всего этого дела.
В первую очередь подчищаем nginx.conf - его содержание, конечно, поучительно, но нам требуется его немного изменить. Примерно до такого вида (не бесспорно, но работает):
Далее создаем папку vhosts, а в ней наш vhost-uwsgi.conf с примерно следующим содержанием:
Естественно, что тут все очень приблизительно. Отдельно стоит отметить location ^~ /media/, позволяющий отдавать статику админки Django. Тут могут возникнуть нек-рые сложности.
Далее - копируем в в ту же папку, где лежит nginx.conf uwsgi_params из каталога uwsgi/nginx.
Уфф... теперь можно переходить к завершающей стадии.
Переходим в папку с нашим Django-проектом (путь к нему мы уже указали в нашем vhost-uwsgi.conf).
Там создаем файлик django_wsgi.py примерно следующего содержания:
Со строчкой
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings', возможно, придется пошаманить - добавить или убрать название вашего проекта. Так же, как, впрочем и с ROOT_URLCONF в settings.py, приведя его к:
ROOT_URLCONF = 'urls'
И, наконец, последний рывок - запуск. Как запустить nginx, думаю, объяснять никому не надо. Запуск связки uWSGI-Django чуть более затейлив. В принципе, это можно сделать одной коммандной строкой, но как верно замечают создатели uWSGI, она получится чертовски длинной.
Поэтому мы создадим в папке нашего проекта файл django.xml с примерно следующим содержанием:
Теперь у нас все готово к запуску. Набираем в коммандной строке:
путь/до/бинарника/uwsgi -x путь/до/django.xml
и, наконец, наслаждаемся результатами наших трудов.
Если что пошло не так, то проверяем конфиги/ругаем автора за допущенные в описании ошибки. Впрочем, в моем случае все работает.
uWSGI - это еще один WSGI сервер, позволяющий запускать приложения, написанные на Python (на самом деле, не только на нем).
Официальный сайт расположен по адресу - http://projects.unbit.it/uwsgi.
Впечатляющие (особенно для любителей сферически-вакуумных коней) тесты производительности можно найти здесь - http://nichol.as/benchmark-of-python-web-servers.
Впрочем, в результатах нет ничего удивительного - uWSGI написан на чистом С и, очевидно, написан хорошо.
Полагаю, с предисловием на этом можно закончить.
В качестве практической части предлагаю описание установки и запуска связки uWSGI+nginx+Django.
Для начала установим uWSGI:
wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
либо:
pip install http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
либо ищем в репах своего дистрибутива.
В случае с Arch-ем, это будет, естественно:
yaourt -Ss uwsgi
Разницы нет, но я предпочитаю первый способ.
С установкой штатными средствами могут возникнуть сложности - т.к. с версией nginx < 0.8.40 нам еще будут нужны файлы модуля для nginx из архива uwsgi. Установка через pip проще, но, опять же, сейчас я ее рассматривать не собираюсь.
Далее - все просто(даже слишком). Распаковываем полученный архив(если ставим из исходников,), переходим в каталог и выполняем самый заурядный:
make
либо:
make -f Makefile.Py26 - если мы собираем uWSGI под конкретную версию Python'а
либо:
python uwsgiconfig.py --build - если по каким-то причинам нет возможности добраться до make.
Зависимостей у uWSGI немного - только заголовочные файлы Python'а и libxml2.
Через пару минут все это добро скомпилируется. Можно двигаться дальше и установить nginx.
Для упрощения задачи возьмем одну из свежих текущих версий. К примеру эту - http://nginx.org/download/nginx-0.8.41.tar.gz. Последние версии(начиная 0.8.40) идут уже в комплекте с uWSGI-модулем, в случае с более ранними версиями, при компиляции необходимо будет указать обычное для установки модулей:
--add-module=$/путь/до/uwsgi/nginx
В случае с последними версиями nginx можно еще указать и:
--http-uwsgi-temp-path= /бла/бла/бла - дабы он находился за пределами каталога, в который ставится nginx
Прочии опции типичны для любой сборки nginx. Впрочем, я посоветовал бы указать еще и prefix - т.к. мы работаем помимо всех средств установки и забота о поддержании актуальности версии ляжет на наши плечи.
Сборка nginx'а так же не должна занять много времени.
Полагаю, Django у вас уже установлен и на этом моменте останавливаться не буду. Перейдем к самому интересному - настройке всего этого дела.
В первую очередь подчищаем nginx.conf - его содержание, конечно, поучительно, но нам требуется его немного изменить. Примерно до такого вида (не бесспорно, но работает):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
#user nobody; |
Далее создаем папку vhosts, а в ней наш vhost-uwsgi.conf с примерно следующим содержанием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
upstream djangoserv { |
Естественно, что тут все очень приблизительно. Отдельно стоит отметить location ^~ /media/, позволяющий отдавать статику админки Django. Тут могут возникнуть нек-рые сложности.
Далее - копируем в в ту же папку, где лежит nginx.conf uwsgi_params из каталога uwsgi/nginx.
Уфф... теперь можно переходить к завершающей стадии.
Переходим в папку с нашим Django-проектом (путь к нему мы уже указали в нашем vhost-uwsgi.conf).
Там создаем файлик django_wsgi.py примерно следующего содержания:
1 2 3 4 5 6 |
import os |
Со строчкой
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings', возможно, придется пошаманить - добавить или убрать название вашего проекта. Так же, как, впрочем и с ROOT_URLCONF в settings.py, приведя его к:
ROOT_URLCONF = 'urls'
И, наконец, последний рывок - запуск. Как запустить nginx, думаю, объяснять никому не надо. Запуск связки uWSGI-Django чуть более затейлив. В принципе, это можно сделать одной коммандной строкой, но как верно замечают создатели uWSGI, она получится чертовски длинной.
Поэтому мы создадим в папке нашего проекта файл django.xml с примерно следующим содержанием:
1 2 3 4 5 6 |
|
Теперь у нас все готово к запуску. Набираем в коммандной строке:
путь/до/бинарника/uwsgi -x путь/до/django.xml
и, наконец, наслаждаемся результатами наших трудов.
Если что пошло не так, то проверяем конфиги/ругаем автора за допущенные в описании ошибки. Впрочем, в моем случае все работает.