Установка Django 1.5 + PostgreSQL + Nginx в Debian

Устанавливалось на Debian 6.0.6, в репозиториях был только Python 2.6.6. Не стал заморачиваться на Python 2.7. Хотя рекомендуется обновить до 2.7.3 или выше. Также Django 1.5 поддерживает Python 3, особенно 3.2 и выше. Предполагается, что работы ведем под учетной записью суперпользователя.

Предварительно требуется установить систему контроля версий git:

aptitude install git

Установка и настройка PostgreSQL:

aptitude install postgresql

Сразу после установки запускается. В данном случае установилась версия 8.4.

Проверка:

netstat -tanp | grep postgre

tcp        0      0 127.0.0.1:5432    0.0.0.0:*       LISTEN      16394/postgres

Создаем пользователя:

su postgres
createuser username

Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n

Задаем пароль пользователю:

psql template1

psql (8.4.13)
Type "help" for help.

template1=#

alter user username password 'user';

ALTER ROLE

Задаем пароль суперпользователю баз данных:

ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'megapass';

ALTER ROLE

\q

Создаем базу данных для пользователя username:

createdb basename --owner=username -hlocalhost

Ловим ошибку:

createdb: could not connect to database postgres: FATAL:  no pg_hba.conf entry for host "10.78.89.142", user "postgres", database "postgres", SSL on
FATAL:  no pg_hba.conf entry for host "10.78.89.142", user "postgres", database "postgres", SSL off

Выходим на уровень пользователя root, правим конфиг и рестартим сервис:

exit

echo "host    all     all     10.78.89.142/32 trust" >> /etc/postgresql/8.4/main/pg_hba.conf

service postgresql restart

Здесь добавляем возможность доступа с айпишника системы. На другой системе нужно будет выставить другой айпишник.

Далее снова заходим под пользователя postgres и повторяем создание базы данных:

su postgres
createdb basename --owner=username -hlocalhost

Если спросит пароль, то используется пароль для суперпользователя postgres.

Если вы установили более новую версию PostgreSQL, к примеру, 9.1, то описанной выше проблемы быть не должно.

Пробуем подключиться к базе:

psql -Uusername -W -hlocalhost basename

Password for user podvesnoy:

psql (8.4.13)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

podvesdb=>

Все, с базой данных разобрались.

Установка Django 1.5:

Создаем директорию под сайт, устанавливаем права:

mkdir /var/www/django
chown www-data:www-data /var/www/django
cd /var/www/

Скачиваем движок и устанавливаем его:

su www-data
git clone https://github.com/django/django.git
exit
cd ./django
python setup.py build
python setup.py install

Для запуска Django как FastCGI-сервера понадобится flup:

aptitude install python-flup

Создаем новый проект:

django-admin.py startproject djangoproject
chown -R www-data:www-data djangoproject/

Запускаем FastCGI сервер:

./djangoproject/manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Проверяем:

netstat -tanp | grep python

tcp       0     0 127.0.0.1:3033      0.0.0.0:*       LISTEN      15748/python

Установка и настройка nginx:

aptitude install nginx

Из стандартных репов установился  0.7.67-3 что не густо, конечно.

Создаем конфиг виртуального хоста:

nano /etc/nginx/sites-available/django

Содержимое следующее:

upstream djangoserv {
    server 127.0.0.1:3033;
}
server {
       listen   80;
       server_name domain.com;
       root /var/www/django/djangoproject;

       access_log  /var/www/django/logs/access.log;
       error_log   /var/www/django/logs/error.log;

       location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js|mov)

{
           access_log   off;
           expires      30d;
       }

       location / {
           fastcgi_pass djangoserv;
           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;
       }
}

После чего делаем symlink и включаем конфиг для нового виртуального хоста, создаем папку с логами и выставляем ей нужного владельца (www-data), после чего перезагружаем nginx:

ln -s /etc/nginx/sites-available/django /etc/nginx/sites-enabled/django
mkdir /var/www/django/logs
touch /var/www/django/logs/access.log
touch /var/www/django/logs/error.log
chown -R www-data:www-data /var/www/django/logs
/etc/init.d/nginx reload

Проверяем чтобы nginx запустился, после чего открываем сайт в браузере по айпишнику или по доменному имени.

Видим:

“It worked! Congratulations on your first Django-powered page.”

Настраиваем подключение к базе данных:

nano /var/www/django/djangoproject/djangoproject/settings.py

Правим:

DATABASES = {
    'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': 'basename',
       'USER': 'username',
       'PASSWORD': 'user',
       'HOST': '127.0.0.1',
       'PORT': '5432',
    }
}

Затем создаем таблицы в базе:

cd /var/www/django/djangoproject
python manage.py syncdb

По ходу предложит создать суперпользователя. Имя пользователя - admin, пароль - adminpass или любой другой.

Перезапускаем FastCGI-сервер:

ps ax | grep 3033 | grep -v grep | awk '{print $1}' | xargs kill -9
/var/www/django/djangoproject/manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Пытаемся открыть админку в браузере по адресу http://ip.ad.re.ss/admin/ и видим, что статика не отображается. Кайфуем. Взыв мозга с этой статикой обеспечен.

Лечится так.

Необходимо в файле /var/www/django/djangoproject/djangoproject/settings.py прописать путь до диектории со статикой:

STATIC_ROOT = '/var/www/django/djangoproject/static/'

Собираем статику в эту директорию с помощью команды:

/var/www/podvesnoy/podvesproject/manage.py collectstatic

Однако проблема не совсем решена, так как в разработке удобнее использовать встроенный сервер в связи с тем, что для того чтобы увидеть изменения через nginx, требуется перезапустить FastCGI-сервер, а при использовании встроенного сервера, статика в админке так и не отображается. В общем, нужен опытный джангист для консультации.

Для облегчения разработки добавляем в cron команду на регулярное убивание FastCGI сервера и его запуск. На стадии продакшена нужно будет убрать.

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

Итак, с помощью вашего любимого текстового редактора создаем файл в директории /usr/local/bin с удобным вам названием, к примеру, pdev, примерно следующего содержания:

#!/bin/bash
ps ax | grep 3033 | grep -v grep | awk '{print $1}' | xargs kill -1
python /var/www/django/djangoproject/djangoproject/manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Здесь указываем путь до файла manage.py вашего проекта на джанго, а также нужный порт. Если у вас на одно машине запущена продакшн-версия сайта и версия для разработки, то можно запустить два FastCGI-сервера на разных портах и с помощью nginx направить их на разные домены или поддомены.

Задаем владельца:

chown root:staff /usr/local/bin/pdev

Устанавливаем права:

chmod 755 /usr/local/bin/pdev

Далее, делаем симлинк файла pdev из директории /usr/local/bin в /usr/bin:

ln -s /usr/local/bin/pdev /usr/bin/pdev

Таким образом перезапуск FastCGI-сервера Django можно будет осуществлять одной командой.

Добавляем в cron:

crontab -e

* * * * * pdev

Теперь перезапуск сервера Django будет происходить раз в минуту, чего вполне достаточно для неспешной разработки, тем более, что перезапуск можно осуществить вручную. Стоит напомнить, что такой вариант подходит только на этапе разработки либо если запущено два отдельных проекта один из которых работает без регулярного перезапуска.

Кстати, так как Ubuntu основан на Debian, то всё описанное выше будет работать и под Ubuntu, только вы получите более современные версии PostgreSQL и Nginx.

Если будут вопросы или дополнения (например, про статику в сервере для разработки), то вы можете оставить их в комментариях ниже.

Наверх

Опубликовано