python
Установка Django, PostgreSQL, Nginx на Debian сервере с нуля
Оригинал статьи размещен по адресу http://www.mindinmotion.ru/content/207.html
Решил снова попробовать Django. Некоторое время назад я перевел все сайты что начинал делать на Django на Drupal, либо на самописные решения, созданные с помощью Zend Framework. Тогда я руководствовался тем что надо хорошо знать какой один язык и забросил Python и Django. Сейчас все же решил снова вернутся к Django по нескольким причинам, во первых все таки многие вещи в Django делаются быстрее, ну например те же формы, даже используя Zend Form кода все равно в разы получается больше, особенно если валидаторы присобачивать, фильтры, кастомизировать как будет форма отображаться.
Ну вот как пример, кусок из одной партнерки которую я писал:
$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 неправильный.'); 'ViewHelper','Description', 'Errors', ));
В общем ладно, перехожу к описанию установки 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!
Использование sqlite и Django
Создание каждой новой базы данных для нового веб-сайта на виртуальном хостинге довольно таки не дешевое занятие. Раньше при использовании Django я каждый раз заводил новую PosgreSQL базу, недавно зашел посмотрел во сколько мне это обходится, оказалось 841 рубль ![]()
В связи с тем что мои сайты потребляют очень мало трафика использовать полноценные базы данных смысла просто нет. Судя по информации на wiki sqlite использование этой базы данных оправдано для сайтов с посещаемостью до 10000 хитов в сутки.
Ошибка 500 при работе с Django через FastCGI (решение)
В логах ошибка выглядит так:
[Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: comm with (dynamic) server "/storage/home/username/domain.ru/dispatch.fcgi" aborted: (first read) idle timeout (30 sec) [Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: incomplete headers (0 bytes) received from server "/storage/home/username/domain.ru/dispatch.fcgi"
Одна из причин возникновения подобных ошибок - неправильный путь к Python. Для того чтобы определить путь к Python можно воспользоваться командой whereis:
$ whereis python python: /usr/local/bin/python /usr/local/man/man1/python.1.gz /usr/ports/lang/python
Несколько особенностей при использовании Django на виртуальном хостинге с FastCGI: например мы разрабатываем свой первый сайт при помощи официального руководства, создаем модель голосования (Polls), все сохраняем, заходим на сайт и видим разноцветную фиолетово-синюю страницу с ошибкой:
TemplateDoesNotExist A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.
На Dreamhost wiki на этот случай написан совет убить python командой pkill python, но у меня она не сработала, видимо по причине того что fcgi, python работают от пользователя www-server или какого то еще.
Решение этой проблемы:
- в каталоге cgi-bin создаем скрипт с таким содержанием
ставим правильные права ($chmod 750 kill_python2ADF23x.sh)запускаем его http://www.domain.ru/cgi-bin/kill_python2ADF23x.sh Имя файла скрипта специально содержит случайные символы чтобы его не запустил кто-то, не знающий этого имени.- #!/bin/sh
- killall python
- после этого необходимо убить все byte-compled файлы, которые создает python:
- cd ~/django_projects/
- $ find ./ -name \*.pyc -type f -exec rm {} \;
- $ find ./ -name \*.pyo -type f -exec rm {} \;
- $ touch ~/domain.ru/dispatch.fcgi ~/build/flup-0.5/flup/server/fcgi.py
На всякий случай полезно очистить кэш браузера и обновить страницу, если глюки продолжаться то необходимо выпоснить приведенные выше команды find ... в корневой директории где установлен сам django.
Последние комментарии
2 weeks 5 days ago
2 weeks 5 days ago
2 weeks 5 days ago
2 weeks 5 days ago
4 weeks 15 hours ago
4 weeks 4 days ago
5 weeks 1 day ago
5 weeks 4 days ago
6 weeks 3 days ago
6 weeks 6 days ago