Запуск Django + nginx на VDS
Django – это веб-фреймворк, предназначенный для удобного и быстрого создания качественных веб-приложений. По своей идеологии Django очень близок к фреймворку Ruby On Rails и использует для работы паттерн «Model-View-Controller». В отличие от Ruby On Rails, Django предназначен для создания приложений на языке Python. На первый взгляд может показаться, что размещение Django на VDS — это довольно сложное занятие. Данной статьей мы постараемся развеять этот миф.
Итак, для начала нам необходим VDS на базе образа Debian 5.0 (Lenny), хотя практически все, что здесь написано, один к одному, будет работать и в Ubuntu.
Постановка задачи
Хорошим тоном перед выполнением любой работы является составление плана того, что собственно мы хотим сделать и зачем. Итак, у нас есть VDS. Допустим, это минимальный VDS с 128 мб памяти. Очевидно что памяти у нас немного и поэтому нам нужно выжать из нее максимум. Понимая этот факт, мы принимаем что:
- Мы не будем использовать Apache. Нам просто не хватит памяти для его нормального запуска вместе с Django. Вместо Apache мы будем использовать nginx в связке с Django через FastCGI. Тем более что nginx, кроме значительно меньшего потребления ресурсов, еще и работает значительно быстрее Apache в конфигурации по умолчанию.
- Мы не будем использовать MySQL. Т.к. в Django есть очень продвинутый ORM, по сути БД нам нужна просто как хранилище данных. СУБД с именем SQLite с этим справляется не хуже MySQL, а порой даже и лучше (быстрее). MySQL имеет смысл использовать при наличии 256 и более мегабайт памяти.
- Нам не нужна панель управления. Вообще. Это позволит немного добиться небольшой экономии в стоимости хостинга для нашего проекта на Django.
Базовая настройка сервера
Итак, мы получили реквизиты доступа к свежеустановленному серверу VDS на базе Debian Lenny.
Для начала посмотрим что мы имеем. Выводим список процессов:
uXXXXX:~# ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 1976 688 ? SNs 15:41 0:00 init [2]
root 341 0.0 0.4 1688 628 ? SNs 15:41 0:00 /sbin/syslogd
root 357 0.0 0.7 5308 1048 ? SNs 15:41 0:00 /usr/sbin/sshd
root 571 0.0 0.6 2348 872 ? SNs 15:42 0:00 /usr/sbin/xinetd -pidfile ...
root 593 0.0 1.2 8168 1620 ? SNs 15:42 0:00 sendmail: MTA: accepting connections
root 619 0.0 0.6 2032 876 ? SNs 15:42 0:00 /usr/sbin/cron
root 628 0.0 1.9 12948 2584 ? SNs 15:42 0:00 /usr/sbin/apache2 -k start
www-data 629 0.0 1.5 13080 2004 ? SN 15:42 0:00 /usr/sbin/apache2 -k start
root 643 0.0 0.3 2164 472 ? Ss 15:44 0:00 vzctl: pts/0
root 644 0.0 1.1 2752 1476 pts/0 Ss+ 15:44 0:00 -bash
root 649 0.2 2.0 8052 2708 ? Ss 15:44 0:00 sshd: root@pts/1
root 651 0.0 1.1 2756 1492 pts/1 Ss 15:45 0:00 -bash
root 657 0.0 0.6 2292 908 pts/1 R+ 15:45 0:00 ps axu
Мы видим что на нашем VDS установлен Apache, который, как мы уже выяснили, нам не нужен. И еще здесь же установлен xinetd. Xinetd был бы нам полезен, если бы мы хотели использовать протокол FTP для доступа к нашему серверу, но т.к. памяти у нас крайне мало, а FTP в принципе устарел и к тому же небезопасен, вместо FTP мы будем использовать SSH. Подробнее о том, как можно использовать SSH для управления файлами, можно узнать из нашей статьи «SSH-доступ, авторизация по ключу, использование SFTP».
Теперь нам необходимо объяснить системе на каком языке мы будем с ней общаться, то есть настроить локаль. Делаем:
uXXXXX:~# dpkg-reconfigure locales
Выбираем в списке ru_RU.UTF-8 и, если нужно, ru_RU.CP1251. Затем устанавливаем локалью по-умолчанию ru_RU.UTF-8.
Перед работой с менеджером установки приложений необходимо обновить информацию о доступных в дистрибутиве пакетах. Обновляем кеш менеджера пакетов apt:
uXXXXX:~# apt-get update
Раз apache и xinetd нам не нужны, удаляем их:
uXXXXX:~# apt-get --purge remove apache2-mpm-prefork xinetd
Установим Midnight Commander – файловый менеджер, облегчающий работу в консоли как начинающему, так и опытному пользователю (попробуйте набрать mc в консоли
после установки):
uXXXXX:~# apt-get install mc
Создание пользователя
Вы наверняка слышали о том, что работать в системе от имени администратора в корне неверно по соображениям безопасности, поэтому создадим себе пользователя:
uXXXXX:~# adduser username
где username -- это логин, с которым мы дальше будем работать. Нас попросят ввести ряд информации и указать пароль для нового пользователя. При вводе пароля на экране ничего (даже звездочек)
отображаться не будет.
Далее наделим нашего пользователя правами для выполнения административных задач.
uXXXXX:~# EDITOR=mcedit visudo
Перед нами откроется конфигурационный файл sudoers в редакторе mcedit. Нам необходимо добавить в конец файла следующие строки:
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
первая из строк – комментарий, который играет важную роль скорее для администратора, чем для приложения sudo (все строки, начинающиеся с символа "#" традиционно игнорируются приложениями и
привлекают внимание администраторов). Вторая строка обозначает, что любой пользователь группы admin получает возможность выполнять любые действия от имени суперпользователя root.
Выход из редактор осуществляется двукратным нажатием на ESC.
Все, файл исправлен. Осталось создать группу admin, участники которой будут иметь возможность выполнять команды с привилегиями суперпользователя:
uXXXXX:~# addgroup --system admin
uXXXXX:~# usermod -a -G admin username
Теперь можно разлогиниться из консоли и залогиниться в нее уже нашим пользователем username. Далее все команды пишутся из расчета что мы залогинены как «username». Если вы не хотите этого делать и продолжаете быть залогиненным как root, префикс sudo у команд писать не надо.
Установка веб-сервера
Приступим к установке nginx. Ставим nginx
username@uXXXXX:~$ sudo apt-get install nginx
Теперь поправим конфигурационные файлы nginx. В Debian конфиг nginx'а хранится в т.н. debian-style, поэтому правильно следовать тому же стилю. Конфиг лежит в директории /etc/nginx. Основной файл
nginx.conf не включает в себя описание сайтов, вместо этого сайты вынесены в директорию /etc/nginx/sites-enabled. На самом деле, в sites-enabled лежат символьные ссылки на файлы из
/etc/nginx/sites-available. Если нам нужно разместить всего один сайт, можно особо не вникать в эти нюансы. Достаточно проделать следующее:
username@uXXXXX:~$ sudo mcedit /etc/nginx/sites-available/default
В этот файл вместо имеющегося там содержимого мы напишем:
upstream djangoserv
{
server 127.0.0.1:8801;
}
server
{
listen 80;
server_name site.ru;
access_log /var/log/nginx/site.ru-access.log;
error_log /var/log/nginx/site.ru-error.log;
location /media/
{
root /home/username/site.ru;
}
location /admin/media/
{
root /usr/lib/python2.5/site-packages/django/contrib;
}
# location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mov)
# {
# expires 30d;
# }
location /
{
# host and port to fastcgi server
fastcgi_pass 127.0.0.1:8801;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;
}
}
Здесь подразумевается, что в домашнем каталоге пользователя username мы создаем папку site.ru, а в ней создаем папку media, в которой, собственно, будет содержимое нашей директории media,
описываемой в settings.py. Обратите внимание на закомментированные строчки с location .. { expires ... }. Данные строчки отвечают за то, чтобы любой контент типа картинок, javascript'а и т.п.
кешировался у посетителей вашего сайта на срок до 30 дней. Настройка довольно полезная, но чтобы она заработала ее необходимо раскомментировать.
Перезагрузим веб-сервер чтобы он перечитал свой конфиг:
username@uXXXXX:~$ sudo /etc/init.d/nginx reload
Установка и запуск Django
Ставим необходимые для Django компоненты:
username@uXXXXX:~$ sudo apt-get install python-support python-imaging sqlite3 python-flup python-pysqlite2
Установим саму Django. В дистрибутиве Debian Lenny идет Django версии 1.0. Если Вас устраивает предлагаемый вариант, достаточно выполнить:
username@uXXXXX:~$ sudo apt-get install python-django
Если же вам нужна более свежая версия Django, установим ее вручную:
username@uXXXXX:~$ wget http://www.djangoproject.com/download/1.1.1/tarball/
username@uXXXXX:~$ tar zxf Django-1.1.1.tar.gz
username@uXXXXX:~$ cd Django-1.1.1
username@uXXXXX:~/Django-1.1.1$ sudo python setup.py install
Запускаем сервер Django. Перейдя в ранее скопированный через sftp каталог проекта, необходимо выполнить.
username@uXXXXX:/project/dir$ python manage.py runfcgi method=threaded host=127.0.0.1 port=8801
Проверка работоспособности конфигурации
Если все прошло успешно, на 80 порту сервера должен заработать Ваш проект на Django.
Ключевую роль в работе сервиса играет постоянно работающий FastCGI-сервер, который был запущен через python manage.py .... Убедиться в том, что процесс жив, можно простой командой:
username@uXXXXX:~$ ps axu | grep python
Остановить FastCGI-сервер можно командой kill, killall или pkill. Запустить заново можно командой, указанной несколькими строками выше.
Заключительные положения
Вот и всё. Если, тем не менее, данное руководство показалось вам чересчур сложным, вы всегда можете обратиться в тех.поддержку и мы проделаем описанные здесь действия за вас (в соответствии с регламентом, услуга платная и стоит 150 рублей).