Установка Django, PostgreSQL, Nginx на Debian сервере с нуля

в разделе Администрирование | Метки: Python, Nginx, Django, PostgreSQL

Решил снова попробовать Django. Некоторое время назад я перевел все сайты что начинал делать на Django на Drupal, либо на самописные решения, созданные с помощью Zend Framework. Тогда я руководствовался тем что надо хорошо знать какой один язык и забросил Python и Django. Сейчас все же решил снова вернутся к Django по нескольким причинам, во первых все таки многие вещи в Django делаются быстрее, ну например те же формы, даже используя Zend Form кода все равно в разы получается больше, особенно если валидаторы присобачивать, фильтры, кастомизировать как будет форма отображаться.

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

<?php
$emailValidator 
= new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNStrue);
        
        
$email = new Zend_Form_Element_Text('email');
        
$email->setLabel('Email')
              ->
setRequired(true)
              ->
addFilter('StripTags')
              ->
addFilter('StringTrim')
              ->
addValidator($emailValidator)
              ->
addErrorMessage('Ошибка: Email неправильный.');
        
$email->setDecorators(array(
                                    
'ViewHelper','Description',
                                    
'Errors',
                                    array(array(
'data' => 'HtmlTag'), array('tag' => 'td')),
                                    array(
'Label', array('tag' => 'td')),
                                    array(array(
'row' => 'HtmlTag'),
                                    array(
'tag' => 'tr''openOnly' => false))
            ));
?>

В общем ладно, перехожу к описанию установки Django, в качестве базы решил использовать PostgreSQL, лично для меня пофиг какая база PostgreSQL или MySQL, решил использовать PostgreSQL потому что сами разработчики Django когда разрабатывали свой фреймворк, затачивали его под Postgres.

# aptitude install postgresql

Правим файл /etc/postgresql/8.4/main/postgresql.conf (здесь и дальше по тексту заменяем 8.4 на свою версию), меняем

# listen_addresses = 'localhost'

на

listen_addresses = 'localhost, 192.168.1.10'

В моем случае я прописываю внутренний айпишник сервера - 192.168.1.10

Дальше правим файл /etc/postgresql/8.4/main/pg_hba.conf, находим строку # IPv4 local connections:

добавляем

host    all         all         192.168.1.1/24        md5

перезапускаем

# /etc/init.d/postgresql-8.4 restart
Restarting PostgreSQL 8.4 database server: main.

Если все сделали правильно Postgres начнет ждать подключений на нужном айпишнике.

# netstat -tanp |grep postgre
tcp        0      0 192.168.1.10:5432       0.0.0.0:*               LISTEN      23104/postgres  
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      23104/postgres  
tcp6       0      0 ::1:5432                :::*                    LISTEN      23104/postgres

Создаем нового юзера (в моем примере newuser) и зададим ему пароль qwerty

# su postgres
postgres@srv01:/etc/postgresql/8.4/main$ createuser newuser
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.1)
Type "help" for help.
 
template1=# alter user newuser password 'qwerty';
ALTER ROLE

Заодно сменим пароль для пользователя Postgres

template1=# ALTER ROLE postgres WITH ENCRYPTED PASSWORD 'my-super-secret-password';
ALTER ROLE
postgres=# \q

Создаем базу для пользователя newuser, на запрос пароля вводим пароль, который мы установили для пользователя postgres (my-super-secret-password)

$ createdb websitedb --owner=newuser -hlocalhost
Password: 

Теперь пробуем подключиться с клиентской машины

$ psql -Unewuser -W -hsrv01.lan
Password for user newuser: 
psql (8.4.1)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
 
newuser=> 

С базой покончено, можно настраивать сайт

# mkdir /var/www/yourwebsite
# chown yourusername:yourusername /var/www/yourwebsite

Поясню этот шаг, у меня сервак используется для решения задач по разработке, так что я не ставлю целью сделать подобные проекты секьюрными и решаю вопросы по настройке сайтов исходя из того как мне удобно. Я монтирую директории по ssh и поэтому я меняю вдалельца каталогов на юзера yourusername - это тот юзер, которым я подключаюсь/монтирую по ssh этот проект.

Я использую Django из SVN, то есть самую последнюю версию, и я решил держать ее в той же директории, где будет находиться сайт. Тут есть одна особенность - сервер работает под юзером www-data, так что для директории с django я сменю owner на www-data, и туда же счекаютю последнюю версию Django, перед этим став юзером www-data.

srv01:/var/www/yourwebsite# mkdir django-trunk
srv01:/var/www/yourwebsite# chown www-data:www-data django-trunk/
srv01:/var/www/yourwebsite# su www-data
srv01:~/yourwebsite$ cd django-trunk/
srv01:~/yourwebsite/django-trunk$ 
$ svn co http://code.djangoproject.com/svn/django/trunk/ .
A    LICENSE
A    django
A    django/test
A    django/test/simple.py
A    django/test/client.py
A    django/test/testcases.py
 
------------------- >8 вырезано -----------------------------
 
A    examples/hello/urls.py
A    examples/views.py
A    examples/__init__.py
A    examples/settings.py
A    examples/urls.py
A    setup.cfg
 U   .
Checked out revision 11793.
srv01:~/yourwebsite/django-trunk$ exit
srv01:/var/www/yourwebsite# 

Теперь нам надо узнать где находятся site-packages, для этого в консоли (в bash консоли, а не консоли python) надо набрать команду, приведеннуную ниже по тексту, в результате выполнения которой узнаем путь к site-packages.

# python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.5/site-packages

В процессе установки и написания этой статьи я решил что все таки лучше будет хранить последнюю версию Django в директории /var/www, чтобы каждый раз для каждого нового сайта не прописывать пути и каждый раз не апдейтить одну и ту же версию Django для разных сайтов.
# mv /var/www/yourwebsite/django-trunk /var/www

Далее необходимо сделать так чтобы Python мог загружать код Django, для этого необхоимо сделать symlink. После чего еще один symlink для того чтобы можно было запускать django-admin.py из любой директории.

# ln -s `pwd`/django-trunk/django /usr/lib/python2.5/site-packages/django

Для запуска Django как FastCGI server понадобится flup, который можно установить из пакетов.

# aptitude install python-flup

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

$ django-admin.py startproject yourproject
boris@srv01:/var/www/yourwebsite$ ls -lha
total 12K
drwxr-xr-x  3 boris    boris    4.0K Dec  4 13:55 .
drwxrwxrwx 60 www-data www-data 4.0K Dec  4 00:58 ..
drwxr-xr-x  2 boris    boris    4.0K Dec  4 13:55 yourproject
boris@srv01:/var/www/yourwebsite$ ls -lha yourproject/
total 20K
drwxr-xr-x 2 boris boris 4.0K Dec  4 13:55 .
drwxr-xr-x 3 boris boris 4.0K Dec  4 13:55 ..
-rw-r--r-- 1 boris boris    0 Dec  4 13:55 __init__.py
-rwxr-xr-x 1 boris boris  546 Dec  4 13:55 manage.py
-rw-r--r-- 1 boris boris 2.8K Dec  4 13:55 settings.py
-rw-r--r-- 1 boris boris  550 Dec  4 13:55 urls.py

Проект создан, теперь можно запускать FastCGI сервер и настраивать Nginx.

boris@srv01:/var/www/yourwebsite/yourproject$ ./manage.py runfcgi method=threaded host=127.0.0.1 port=3033

Теперь создаем конфиг для nginx /etc/nginx/sites-available/yourwebsite (если не установлен, то устанавливаем командой sudo aptitude install nginx). Ниже содержимое этого файла:

upstream djangoserv {
    server 127.0.0.1:3033;
}
server {
        listen   80;
        server_name  yourwebsite;
        root /var/www/yourwebsite/yourproject;
 
        access_log  /var/www/ /logs/access.log;
        error_log   /var/www/yourwebsite/logs/error.log;
 
        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) {
            access_log   off;
            expires      30d; 
        }
 
        location / {
            fastcgi_pass   127.0.0.1:3033;
            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.

srv01:/etc/nginx/sites-available# ln -s /etc/nginx/sites-available/yourwebsite /etc/nginx/sites-enabled/yourwebsite
srv01:/etc/nginx/sites-available# mkdir /var/www/yourwebsite/logs
srv01:/etc/nginx/sites-available# chown www-data:www-data /var/www/yourwebsite/logs
# /etc/init.d/nginx reload
Reloading nginx configuration: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.

Если все сделали правильно теперь можно зайти по адресу http://yourwebsite и увидеть там дефолтную страницу Django с надписью It worked!

Комментарии