Как да подкараме Django на Superhosting.bg

Публикувано на

EDIT: Направих си труда да проверя какво е положението със SuperHosting.bg половин година по-късно и ето резултата "Django на Superhosting половин година по-късно". Ако все пак ви интересува оригиналната статия, може да продължите с четенето.

 

Първо малко обща информация. В България трудно може да се намери подходящ Django хостинг,  може би заради това и Django не е нашумяло толкова още у нас, но се надявам това да се промени. Какви са разликите спрямо PHP. При PHP е лесно - вземаш кой да е хостинг (дори има и безплатни), копираш си сайта и той работи. За това може би повечето хора предпочитат PHP. За Django хостинг е необходимо да има SSH достъп, някой друг пакет инсталиран предварително (говоря за тези които не са чист Python а са C-код който трябва да се компилира, като PIL, mysql-python или python-psycopg2 и т.н.). Все пак в България има хостинг компании които предлагат хостинг с Python (което естествено не значи веднага Django, все пак Django не е единствения фреймуорк за Python). Една от тези компании е Суперхостинг.

Тази статия няма да е типичното How To, а ще бъде преразказ на това какво се случи с мен когато се опитах да пусна Django сайт на споделен хостинг план в Суперхостинг, плюс съвети от мен.

Както вече ни е ясно за django хостинг е необходим ssh достъп, за това се пуснах "билет" в системата за потдръжка на Суперхостинг, в който ясно описвам нещата от които имам нужда за да си подкарам сайта. Това са:

  • SSH достъп;
  • GIT;
  • Python2.7;
  • mysql-python;
  • PIL.

Реших да напиша всичко на веднъж за да може да не отварям хиляда билета и всичко да мине от раз. Те ми отговориха, че техният Python e 2.6.6 (което не толкова зле), и че нямат намерение да го ъпдейтват понеже било свързано с други пакети (явно не знаят че на една система може да има няколко версии на Python без да си пречат, a за системата е важно единствено кой е дефолтната версия на езика). Казаха ми също че нямат GIT, но може да ползвам Subversion, а другите неща които искам си ги имат инсталирани. За мен не беше проблем версията на Python да е 2.6, тъй като не съм използвал супер дупер яките фичъри на 2.7 като dict comprehension, или че няма някой друг секюрити бъг фикс. Също така няма чак такъв проблем, че нямат Git, ще мигрирам проекта към Subversion. Отговорих им, че това което предлагат ме устройва и можем да продъжим.

След като получих SSH достъп, веднага се захванах да си изтегля проекта през SVN, но уви уцелих греда. Това че от предните мейли които си бяхме разменили със съпорта бях упоменал че и SVN ще ми свърши работа, това за тях явно не значи, че трябва да го получа. Съответно веднага им писах коментар към билета който бях отворил - "Kакво се случва с моя SVN?". Тогава задачата беше прехвърлена към други служители. Моят съвет е, след като получите SSH достъп, веднага отворете нов билет и несе хабете още от начало че ви трябва. Всичко по реда си.

Докато чакам да си получа SVN-а просто копирах целия проект на хостинга.  Само да отбележа НЕ в публичната директория public_html, или www (което е симлинк към public_html), тъй като те се сервират директно от Apache сървъра и не е добра идея да си излагате кода на публично място. Тъй като от Суперхостинг няма да ви дадат virtualenv вие може да си го сложите сами. Изтегляте последната версия от тук, от архива вземате само virtualenv.py и го копирате в хоум директорията на хостинга. След това изпълнявате:

python virtualenv.py --system-site-packages python

Така ще се създаде виртуален енвайърмент /home/<your_username>/python, в който имате easy_install и pip (за предпочитане да ползвате pip). За да да го активирате просто напишете:

source python/bin/activate

Сега спокойно може да инсталриате в този енвайърмънт пакетите от които има нужда сайтът ви. Ако сте си направили труда да имате requirments.txt спокойно може да изпълните:

pip install -r <path/to/requirements.txt>

До тук всичко върви добре, чакаме си svn-a за да може в бъдще да си ъпдейтваме проекта по-лесно, а през това време си потготвяме останалите неща за да може сайта да тръгне по-скоро. Тъй като използвам MySQL за база в процеса на разработка е много лесно да се използва mysqldump за да се създаде дъмп на данните и след това да се импортнат на production. През cPanel-a си направих база и юзър за достъп до нея. Импортнах данните. Направих си настройките в settings_local.py, решава да изпълня ./manage.py shell_plus (тъй като ползвам django_extensions, иначе може да изпълните ./manage.py shell) и пак греда. Няма инсталиран mysql-python. Само да отбележа че в първото писмо което ми отговориха от Суперхостинг ми казаха, че имат, след като бях заявил, че ми трябва. За това е хубаво ако ползвате Mysql веднага след билета за SVN да си пуснете билет за mysql-python за да не чакате излишно! Има и добра новина, ако ползвате PostgreSQL, пакетът python-psycopg2 беше инсталиран, така че може да си спестите мъките да карата Суперхостинг да ви инсталират mysql-python. За целта обаче е добре да сте се подготвили предварително данните ви да са в подходящ формат за Postgre. За целта може да видите моята статия за Django и Postgre върху Ubuntu.

Ако все пак искате да ползвате MySQL база в Суперхостинг, трябва да внимавате за още нещо localhost е РАЗЛИЧНО от 127.0.0.1! Причината за мен остава неясна. За да ви работи базата, просто трябва HOST в settings.DATABASES трябва да бъде 127.0.0.1, понеже иначе няма да може да се свържете към базата данни.

След като базата е готова и проекта ни е готов, трябва да потготвим неговото сервиране. За статичните файлове ако ползвате staticfiles изпълнете:

./manage.py collectstatic -l

След това отидете в публичната html директория на акаунта си и направете симлинкове към media и static директориите:

cd /home/<your_username>public_html
ln -s /home/<your_username>/your_project/media
ln -s /home/<your_username>/your_project/static 

Сега е ред на подкарването на самия Django проект. Суперхостинг имат инсталиран mod_fcgid на Apache-то. Реших да погледна документацията на Django за случая. Както и примерния файл на Superhosting за PHP под fcgi. Имах леки проблеми с .htaccess файла, за което бях отворил допълнителен билет към Суперхостинг, но проблема се оказаза в "моя телевизор". За да ви спестя главоблъсканиците ето и кода на двата файла които са ви необходими за да пуснете Django сайт под Apache с mod_fcgid.

my_project.fcgi

#!/home/<your_username>/python/bin/python
import sys, os

sys.path.append('/home/<your_username>/<your_project>/')
os.environ['DJANGO_SETTINGS_MODULE'] = "settings"

from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")

.htaccess

Options -Indexes +FollowSymLinks +ExecCGI

<IfModule mod_fcgid.c>
        AddHandler fcgid-script .fcgi
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^(.*)$ my_project.fcgi/$1 [QSA,L]
</IfModule>

Специфично е #!/home/<your_username>/python/bin/python, чрез което указвате python интерпретатора от вашият виртуален енвайермънт. Ако не го укажете, приложенията които са инсталирани там няма да се виждат, следователно сайта няма да тръгне.

Сега при отваряне на вашият домейн ще се зарежда Django сайт. При нужда от рестартиране в документацията на django казват:

touch my_project.fcgi

Но това при Суперхостинг не важи. За това може да се изпъли следната команда:

pkill -f my_project.fcgi

Това убива процеса на сайта ви, а при последващ рекуест апачето само ще го вдигне.

В крайна сметка и в България може да се подкара Django сайт на споделен хостинг. Не е толкова лесно като с PHP, но хората пишещи на Python знаят каква е ползата. Надявам се в бъдеще българските хостинг компании да отделят малко повече внимание на Django хостингите. Например:

  • Да си направят Wiki как се подкарва django проект при тях;
  • Когато клиент каже, че ще ползва хоситнга за Django сайт, да си му сложат всичко което е необходимо да не се налага по сто пъти да се комуникира с тях.

Не е много това което трябва да се свърши за да може и българите да се радват на Django хостинг, а хостинг компаниите не трябва да гледа с недоверие на Python и Django.

blog comments powered by Disqus