Установка Django, PostgreSQL, Nginx на Debian сервере с нуля
Решил снова попробовать Django. Некоторое время назад я перевел все сайты что начинал делать на Django на Drupal, либо на самописные решения, созданные с помощью Zend Framework. Тогда я руководствовался тем что надо хорошо знать какой один язык и забросил Python и Django. Сейчас все же решил снова вернутся к Django по нескольким причинам, во первых все таки многие вещи в Django делаются быстрее, ну например те же формы, даже используя Zend Form кода все равно в разы получается больше, особенно если валидаторы присобачивать, фильтры, кастомизировать как будет форма отображаться.
Ну вот как пример, кусок из одной партнерки которую я писал:
<?php
$emailValidator = new Zend_Validate_EmailAddress(Zend_Validate_Hostname::ALLOW_DNS, true);
$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!
Комментарии