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

Django хостинг

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

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

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

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

Ограничения данной схемы: вы имеете в распоряжении не все ресурсы, имеющиеся в наличии, а только столько, сколько предусмотрено вашим тарифным планом. Если ваш проект потребует больше ресурсов, нужно подключить другой тарифный план. Делается это из панели управления.

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

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

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

WSGI (Web Server Gateway Interface) на данный момент является стандартом для запуска Django.

Для работы необходим 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.8.2

Установка 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 (один или несколько) есть в списке процессов — сервер работает нормально.

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

Осталось набрать в браузере 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>