Магазин пластинок nowhereland.ru - виниловые пластинки
Вход →  Регистрация →

Django хостинг

Здесь описано как дистанционно установить Django на хостинге, позволяющем это сделать.
Я размещаю свои сайты на Django, в том числе этот, здесь.

Это — виртуальный выделенный сервер (VDS) по абсолютно виртуальной цене от ~250 руб в месяц. На нем можно разместить любой сайт, требующий нестандартного программного обеспечения, в том числе Django сайт.

Что такое VDS? VDS — это практически полноценный выделенный сервер, на котором вы — полный хозяин: вы можете установить или удалить любое программное обеспечение, вы можете конфигурировать все, что угодно, под свои нужды, вы можете перезагружать сервер или отключить его совсем и установить другой. Root доступ, отличная панель управления, возможность не только разместить множество собственных сайтов, но и перепродавать услуги хостинга, техническая поддержка.

При этом ваш сервер не является отдельной физической машиной, но реализован программно, разделяя один физический компьютер с рядом других таких же виртуальных выделенных серверов. Преимущества VDS: вместо тысяч рублей (аренда выделенного сервера) вы платите во много раз меньше и имеете полную свободу действий в ваших web-экспериментах.

Ограничения данной схемы: вы имеете в распоряжении не все ресурсы, имеющиеся в наличии, а только столько, сколько предусмотрено вашим тарифным планом. Если ваш проект потребует больше ресурсов, нужно подключить другой тарифный план. Делается это за несколько секунд из панели управления. Скажем, если на младших тарифных планах не проходит компиляция какой-нибудь толстой штуковины вроде Sphinx, нужно просто включить максимальный тарифный план, установить все, что нужно, а затем переключиться обратно. Сказанное выше о простоте переключения тарифных планов действительно, если при заказе VDS вы выбрали виртуализацию OpenVZ. На данный момент также имеется KVM, там на стартовых тарифах не предусмотрено добавление ресурсов. Если вы не знаете, какую виртуализацию выбрать, то вам, наверное, нужна именно OpenVZ. В плюсах OpenVZ - простота добавления ресурсов и возможность на пиках нагрузки "прихватывать" из ресурсов соседей (а они на своих пиках будут "прихватывать" из ваших - что не страшно, ибо пики не бывают одновременными), в минусах - необходимость выбирать ОС только из числа поддерживаемых, больше возни с установкой версий софта, отличного от предусмотренного по умолчанию (например, придётся поковыряться, чтобы поставить другую версию Python) и отсутствие доступа к некоторым очень специфическим возможностям KVM.

Установка Django + WSGI

Далее описан процесс уcтановки Django по SSH на вышеуказанном хостинге. Надеюсь, эта шпаргалка поможет вам устроиться на новом месте быстрее.

Наша цель — запустить джанго-проект на CentOS + Apache + MySQL + Django

WSGI (Web Server Gateway Interface) на данный момент является стандартом для запуска Django, прежний вариант установки с modpython ввиду прекращения поддержки последнего устарел и к использованию в новых проектах не рекомендован.

Для работы необходим ssh клиент. Я использую putty.
Также установите sftp клиент (ftp через ssh). Я использую WinSCP. Обычный FTP не позволяет входить с правами root.

Для работы будет полезен pip - менеджер пакетов Python.
Проверьте его наличие в системе командой

pip
Если pip не найден, установить его можно, выполнив следующие команды:
 
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py

Установка Django

Установка последней стабильной версии Django:
pip install Django
При необходимости можно указать, какую именно версию устанавливать:
pip install django==1.2.1

Установка mod_wsgi

В веб-сервере Apache WSGI реализован через модуль mod_wsgi Проверим, установлен ли mod_wsgi
rpm -q mod_wsgi
Если мы получим сообщение "package mod_wsgi is not installed", то модуль mod_wsgi требуется установить:
pip install mod_wsgi
Если не получается (ошибка), то есть два пути: 1) Быть сильнее обстоятельств - погуглить, почему ошибка и как с ней бороться 2) Быть выше их - использовать другой менеджер пакетов. В CentOS есть yum (Yellowdog Updater), воспользуемся им:
yum install mod_wsgi

Установка MySQLdb

Для работы MySQL с Python потребуется драйвер MySQLdb, установим его:
yum install MySQL-python
Если при установке выводится сообщение об ошибке или если при попытке доступа к сайту получите сообщение "Error loading MySQLdb module: No module named MySQLdb", значит, MySQL-python не установлен/установлен не полностью. Поробуем так:
pip install MySQL-python
Теперь работает? Прекрасно! Не работает? Странные жалобы на то, что "EnvironmentError: mysql_config not found"? Я решил эту проблему так:
yum install mariadb-devel
MariaDB - это свободая (GNU General Public License) версия MySQL. Наверное, есть более правильное решение проблемы, но я нашёл это и результат меня устроил.

Пример конфигурационного файла Apache для Django+WSGI

У вас в системе имеется главный конфигурационный файл Apache, путь к нему /etc/httpd/conf И пользовательские конфигурации ваших виртуальных хостов, путь к ним /etc/httpd/conf/vhosts/www-root Т.е. там есть файл с названием, например, mydomain.ru, который нужно будет отредактировать в соответствии с особенностями Django. Пример конфигурационного файла дан ниже.
#user 'www-root' virtual host 'mydomain.ru' configuration file


<VirtualHost xx.xxx.xx.xx:80>
    ServerName mydomain.ru
	ServerAlias www.mydomain.ru
	AssignUserID www-root www-root
	ServerAdmin webmaster@mydomain.ru
	
	WSGIDaemonProcess mydomain.ru python-path=/var/www/www-root/data/django-projects/myproject:/usr/lib/python2.7/site-packages

	Alias /robots.txt /var/www/www-root/data/django-projects/myproject/static/robots.txt
	Alias /favicon.ico /var/www/www-root/data/django-projects/myproject/static/favicon.ico
	Alias /static/ /var/www/www-root/data/django-projects/myproject/static/
	
	<Directory /var/www/www-root/data/django-projects/myproject/static>
		Require all granted
	</Directory>
	
	WSGIScriptAlias / /var/www/www-root/data/django-projects/myproject/myproject/myproject.wsgi
	
	CustomLog /var/www/httpd-logs/mydomain.ru.access.log combined
	ErrorLog /var/www/httpd-logs/mydomain.ru.error.log
	LogLevel debug
	

	<Directory /var/www/www-root/data/django-projects/myproject/myproject>
			Require all granted
	</Directory>

</VirtualHost>
Перезапускаем сервер (это можно сделать из панели управления или командой аpachectl restart в коммандной строке). Если после перезагрузки в списке сервисов (см. в панели управления) нет ни одного процесса httpd — проверяем, что мы написали в конфигурационном файле и исправляем ошибки. Если httpd (один или несколько) есть в списке процессов — сервер работает нормально.

Не забывайте, что после любых изменений в конфигурационном файле сервер необходимо перезагрузить.

Осталось набрать в браузере URL вашего сайта и посмотреть, что из всего этого получилось...

Если с первого раза не все идет гладко — не расстаивайтесь, внимательно пройдитесь по всем моментам процесса настройки и разберитесь, что вы пропустили. Зайдите по FTP и посмотрите, действительно ли все созданные вами папки и ссылки находятся там, где им предполагается быть.
Я же благодарю всех, кто воспользовался вышеприведенными ссылками и желаю им удач во всех web-начинаниях!

Установка Django + modpython

Наша цель — запустить джанго-проект на freeBSD + Apache + modpython + MySQL + Django SVN (текущая версия из транка).

Этот способ устарел и не применяется в современных системах.

Установка Subversion

Subversion — программа контроля версий. С её помощью мы далее установим Django и его модули и всегда сможем одной командой обновить их до последних версий.

Ставим из портов.
Порты freeBSD — это стандартный набор ПО, тестированного на данной ОС.
Установка из портов - самый быстрый и надежный способ.

cd /usr/ports/devel/subversion
make install clean
Отмечаем только эти 2 опции:
[X] MOD_DAV_SVN mod_dav_svn module for Apache 2.X
[X] NEON WebDAV/Delta-V repository access module

На втором появившемся экране настроек жмем "cancel".

Установка Django

cd /usr/local/lib/python2.5/site-packages
svn co http://code.djangoproject.com/svn/django/trunk/ django-trunk
Создаем символическую ссылку, указывающую, что /django на самом деле нужно искать в /django-trunk/django
ln -s django-trunk/django /usr/local/lib/python2.5/site-packages/django
Далее "подкладываем" ссылку на django-admin.py туда, где система может ее найти.
cd /usr/local/bin
ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django/bin/django-admin.py django-admin.py
Если вы ошиблись при создании ссылки и хотите, чтобы новая ссылка перезаписала уже существующую, используйте ключ f:
ln -fs ...

Установка mysql-python

mysql-python — драйвер, реализующий доступ к MySQL из python.
Ставим из портов.

cd /usr/ports/databases/py-MySQLdb
make install clean
Отмечаем единственную опцию
[X] MYSQLCLIENT_R Use libmysqlclient_r (thread safe)

Установка mod_python

mod_python — модуль python для Apache
Ставим из портов.

cd /usr/ports/www/mod_python3 
make install clean

Создание папки для наших django проектов

Джанго-код рекомендуется хранить в местах, недоступных по http. В остальном место, куда вы его положите, принципиального значения не имеет. Предположим, ваш пользовательский эккаунт называется myname (существует пользователь myname).

cd /home/myname/data/
mkdir django-apps
Создаем symlink, чтобы иметь отсюда доступ к django:
cd django-apps
ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django django
проверяем, доступен ли здесь django:

python
import django
если сообщений об ошибке не появилось, выходим из коммандной оболочки python коммандой quit()

Если django недоступен, проверяем, имеется ли в папке django-apps ссылка django и действительно ли она ведет туда, куда мы ожидаем. Например, щелкните по ссылке в ftp — если появится ссобщение об ошибке ("файл не найден"), это значит, что ссылка неверна. В WinSCP можно получить окно редактирования символической ссылки, выделив ее и нажав Alt+F6.

Создание django проекта

В папке django-apps создаем папку проекта (например, myproject1) и переносим туда по FTP все имеющиеся у нас файлы и папки из папки нашего django-проекта.

mkdir  myproject1
В эту папку мы переносим наши папки приложений, файлы urls.py, settings.py и т.д.

Чистый проект можно содать командой

python django-admin.py startproject myproject2
Возможная ошибка: No module named django.core
Решение: возвращаемя к пункту "Если django недоступен"

python manage.py syncdb

Установка модулей Django

cd /home/myname/data/django-apps/myproject1/
svn co http://откуда ставить модуль
и т.д.

Установка memcached

memcached реализует кэширование страниц. Установка этого ПО опциональна и не влияет на работоспособность всего остального.
Ставим из портов.

cd /usr/ports/databases/memcached
make install clean
Опцию REPCACHED не отмечаем

Установка python библиотеки для memcached

cd /usr/ports/databases/py-memcached
make install clean
Подробнее о конфигурировании и использовании Django + memcached см. на сайте Django.

Настройка settings.py

Для добавления пути к проекту в system path включите в начале settings.py

import sys
sys.path.append('/home/myname/data/django-apps/myproject1')
Не забудьте, что данные доступа к БД на продакшн сервере скорее всего не такие, как на тестовом сервере.

После отладки проекта нужно будет отключить вывод подробных сообщений об ошибках:

DEBUG = False
Настройте пути к медиа файлам (своим и админки Джанго):
MEDIA_ROOT = '/home/myname/data/www/mydomain.ru/files/'
MEDIA_URL = 'http://mydomain.ru/files/'
ADMIN_MEDIA_PREFIX = '/media/'
Предполагается, что пути к медийным файлам (которые обрабатываются сервером, а не django), указаны в вашем коде как "/files/myimage.jpg", "/files/js/myscript.js" и т.п.

Теперь по URL
http://mydomain.ru/files/myimage.jpg или http://mydomain.ru/files/js/myscript.js сервер будет выдавать соответственно файлы
/home/myname/data/www/mydomain.ru/files/myimage.jpg,
/home/myname/data/www/mydomain.ru/files/js/myscript.js

Теперь нужно создать папку files /home/myname/data/www/mydomain.ru/files и положить туда по FTP свои файлы и папки.

Чтобы админка django нашла свои медийные файлы, нужно будет создать ссылку, связывающую путь /media в URL файлов с их реальным расположением в папке django:

cd /home/myname/data/www/mydomain.ru
ln -s /usr/local/lib/python2.5/site-packages/django-trunk/django/contrib/admin/media media

Настройка httpd.conf

httpd.conf — конфигурационный файл Apache, путь к нему:
/usr/local/etc/apache22/httpd.conf

Рекомендую перед внесением изменений в httpd.conf сохранить его копию в тихом теплом месте. Если вы в нем допустите ошибку, Apache не будет работать и вам пригодится начальная копия для восстановления порядка.

Кстати, ISPmanager (панель управления) позволяет редактировать любые файлы, в том числе этот.

Итак, вносим в httpd.conf команду загрузки мод-питона:

LoadModule python_module libexec/apache22/mod_python.so
Далее дополняем определение вашего виртуального хоста так, чтобы получилось похоже на это:

<VirtualHost 11.222.3.44:80>
	ServerName mydomain.ru
	DocumentRoot /home/myname/data/www/mydomain.ru
	SuexecUserGroup myname myname
	CustomLog /home/httpd-logs/mydomain.ru.access.log combined
	ErrorLog /home/httpd-logs/mydomain.ru.com.error.log
	ServerAlias www.mydomain.ru
	ServerAdmin webmaster@mydomain.ru
	AddDefaultCharset utf8
	......

#Этот блок определяет, что все url (/) обрабатываются mod-python, 
#устанавливает корневую папку нашего джанго-проекта,
#включает вывод сообщений об ошибках mod-python и его рестарт при рестарте сервера,
#добавляет пути к папке наших проектов и к Django в PythonPath
<Location "/">
	SetHandler python-program
	PythonHandler django.core.handlers.modpython
	SetEnv DJANGO_SETTINGS_MODULE myproject1.settings
	PythonOption django.root /myproject1
	PythonAutoReload On
	PythonDebug On
	PythonPath "['/home/myname/data/django-apps', '/usr/local/lib/python2.5/site-packages/django'] + sys.path"
</Location>

#Этот блок определяет, что все пути, начинающиеся на /files, обрабатываются сервером.
#В папке mydomain.ru/files/... хранятся все наши медиа файлы - картинки, css, js, pdf...
<Location "/files">
	SetHandler None
</Location>

#Этот блок определяет, что все пути, начинающиеся на /media, обрабатываются сервером.
#В папке mydomain.ru/media/... как бы хранятся медиа файлы джанго-админ интерфейса.
#На самом деле нет никакой надобности куда-то переносить сами файлы, достаточно
#создать в mydomain.ru/ ссылку media, указывающую на действительное расположение файлов.
<Location "/media">
    SetHandler None
</Location>

#этот блок определяет, что все пути, кончающиеся .jpg .gif и т.д., обрабатываются сервером.
<LocationMatch "\.(jpg|gif|pdf|zip|css|js|ico)$">
    SetHandler None
</LocationMatch>	
	
</VirtualHost>