пятница, 22 апреля 2011 г.

Деплой django с uwsgi и nginx

В продолжение темы деплоя php-приложений делюсь опытом выкладки приложений django.

Нам понадобиться uwsgi, который без проблем устанавливается из портов
# make install clean -C /usr//ports/www/uwsgi
Следующий шаг - подготовка конфига nginx

        server_name  site.domain.tld;

        location / {                uwsgi_pass      unix:///tmp/uwsgi.sock;
                include         uwsgi_params;

                uwsgi_param     UWSGI_CHDIR             /usr/local/www/$host/deploy;
                uwsgi_param UWSGI_SCHEME $http_x_forwarded_proto;
                uwsgi_param     UWSGI_SCRIPT            uwsgi;
                uwsgi_intercept_errors on;
        }

Параметр UWSGI_SCRIPT - указывает на точку входа в django приложение. Нужно иметь ввиду, что этот файл должен быть импортирован, поэтому не может иметь точки в названии. Сам файл должен находится в директории UWSGI_CHDIR
Теперь можно выкладывать проект в директорию /usr/local/www/$host. После этого создается файл uwsgi.py с обычно стандартным содержимым:

import os
import sys
import django.core.handlers.wsgi

DIR_PROJECT = os.path.dirname( os.path.dirname( os.path.realpath(__file__) ) )
sys.path.append( DIR_PROJECT )

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
application = django.core.handlers.wsgi.WSGIHandler()


Запускаем uwsgi:

# echo 'uwsgi_enable="YES"'  >> /etc/rc.conf
# echo 'uwsgi_flags="-L -M --vhost"' >> /etc/rc.conf
# service uwsgi start

И если все было сделано правильно, то nginx передаст запрос uwscgi, а тот вызовет uwsgi обработчик, который в свою очередь отдаст запрос на обработку в django.
Важно иметь ввиду, что для корректной работы пользователю, из под которого запускается uwsgi необходимы права на запись в директорию со скриптами, иначе интерпретатор не сможет записать скомпилированный байт-код (файлы *.pyc)

7 комментариев:

  1. Ответы
    1. Принцип такой же. Только установка с помощью apt, ну и пути к конфигам другие

      Удалить
  2. все довольно оригинально и просто, спасибо

    ОтветитьУдалить
  3. Я вот не понимаю только, почему вы выбрали /usr/local/www и не создали нового пользователя с привилегиями

    ОтветитьУдалить
  4. Привет, подскажи, пожалуйста, почему не запускается связка, если отдельно nginx работает - отдаёт статику, если я запущу uwsgi из учётной записи пользователя команой uwsgi --socket unix:///tmp/uwsgi.sock --wsgi-file //wsgi.py, то проект так же начинает работать.

    В обычном случае nginx пишет такую, вот, ошибку:
    2013/10/18 12:02:38 [error] 38909#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 178.68.60.32, server: 62.109.9.199, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///tmp/uwsgi.sock:", host: "62.109.9.199"

    ОтветитьУдалить
    Ответы
    1. Здесь нужно разбираться в конкретной ситуации, а это не бесплатно. Но на вскидку пермишны

      Удалить
  5. Ок, за отклик, да и за пост в целом - спасибо, разобрался: я просто переписал один в один строку запуста uwsgi в rc.conf, не думая), а надо было бы примерно вот так: uwsgi_flags="-L -M -p 4 --python-path -w "
    ).

    ОтветитьУдалить