eth0.pro

Linux is working. The future is open.



Если Вы собрались писать проект на Django (а может быть и уже написали), когда-нибудь встанет вопрос о том, где его хостить. Есть компании, которые предлагают готовый python-хостинг, но я считаю, что лучшим выбором будет свой VPS-сервер. Процесс его приобретения здесь описывать не вижу смысла, поэтому сразу предположим, что у Вас такой имеется, на нем стоит Debian и вы уже подключились к нему по SSH'у.

Сразу начну вот с чего. В репозиториях Debian всё давно устарело (они же за стабильный, а не свежий софт). Если у Вас не Ubuntu, то в source.list нужно добавить следующее:

deb http://backports.debian.org/debian-backports squeeze-backports main contrib non-free
deb http://ftp.ru.debian.org/debian testing main non-free contrib
deb http://ftp.ru.debian.org/debian unstable main non-free contrib

Ну и после этого

# apt-get update

Итак, во-первых, нам нужно само окружение – Python с установленной Django. Для большей гибкости устанавливать мы это будем по хитрому, через virtualenv. Зачем это нужно? К примеру, Вашему проекту нужен отличный от установленного Python или какие-либо библиотеки отличных версий, можно создать общее окружение для нескольких проектов или по одному собственному для каждого. Тем самым сможете устанавливать, изменять и удалять пакеты, и это не повлияет на другие ваши проекты или системное окружение.

# apt-get install python-virtualenv

Далее создадим каталог

# mkdir -p /var/django/env
# cd /var/django/env

(можете указать другой), перейдем в него и там выполним

# virtualenv my_project

Ждем пока соберется окружение. Там будут папочки bin, include и lib. Чтобы активироть виртуальное окружение зайдем в папку bin (/var/django/env/my_project/bin) и выполним

# source activate
(my_project)root@server:/var/django/env/my_project/bin#

В начале приглашения у нас появилось название нашего вирт. окр., по которому мы можем ориентироваться, узначать, что мы в него вошли. Для того, чтобы убедиться в том, что все сработало, можно глянуть:

(my_project)root@server:/var/django/env/my_project/bin# which python
/var/django/env/my_project/bin/python
(my_project)root@server:/var/django/envmy_project /bin# which pip
/var/django/env/my_project/bin/pip
(my_project root@server:/var/django/env/my_project/bin#

Как видим, все приложения выполняются оттуда.

Теперь устанавливаем Django и все необходимые для Вашего проекта пакетики, настраиваем settings.py для правильной работы со static и media, делаем ./manage.py collectstatic из папки с проектом, чтобы собрать всю статику для nginx'а.

Далее устанавливаем:

# apt-get install nginx
# apt-get install uwsgi
# apt-get install uwsgi-plugin-python

Ждем, ждем....

После этого для Nginx'а создаем новый профиль в sites-available:

server {
    listen 80;

    server_name example.ru;
    client_max_body_size 5m;

    access_log  /var/log/nginx/example.ru.access.log;
    error_log   /var/log/nginx/example.ru.error.log;

        location /static/ {
                gzip_static on;
                alias   /var/django/static/my_project/; # не забываем поменять на свое
        }

        location /media/ {
                gzip_static on;
                alias   /var/django/media/my_project/; # не забываем поменять на свое
        }

        location / {
                gzip_static on;
                include uwsgi_params;
                uwsgi_pass unix:///var/run/uwsgi/app/my_project/socket; # не забываем поменять на свое
        }
}

Делаем симлинк в sites-enabled (симлинк на default удалите).

Теперь uWSGI. Также создаем профайл в его app-available. Обязательно с расширением ini, например /etc/uwsgi/apps-available/my_project.ini:

[uwsgi]
        plugins = python26
#       plugins = python
        virtualenv = /var/django/env/my_project
        chdir = /var/django/project/my_project
        pythonpath = ..
        env = DJANGO_SETTINGS_MODULE=my_project.settings
        module = django.core.handlers.wsgi:WSGIHandler()
        touch-reload = /var/django/project/my_project/uwsgi_reload
        LANG = ru_RU.UTF-8

Не забываем создать "тач-файл" (через который можно как-бы "релоадить" интерпретатор):

touch /var/django/project/my_project/uwsgi_reload

Активируем профиль, сделав симлинк в apps-enabled.

Перезапускаем uWSGI, перезапускаем Nginx. Заходим через браузер, порверяем.

Ву-а-ля!

29 янв 2013 г. | Теги: Nginx uWSGI Debian Django