Django на Superhosting половин година по-късно

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

Преди време бях написал блог пост "Как да подкараме Django на Superhosting.bg". Сега искам да напиша какво е положението половин година по-късно и дали има някакъв напредък.

Започвам с първото положително нещо - вече има Git, така че той може да бъде ползван за качване на проекта на сървъра на СуперХостинг.

Отностно версиите на Python - тук нямаме такъв успех. Все още има само Python2.6. Трябва да отбележа обаче, че Суперхостинг са се постарали да ни направят живота по-лесен, като предварително са инсталирали virtualenv, setuptools и pip. Така вече не се налага ръчното им инсталиране, което бях описал в предишната статия. По този начин директно може да се заемете със създаване на virtual environment, в който да инсталирате необходимите пакети.

Благодарение на инсталираният Git, могат да бъдат инсталирани пакети директно от Github, с помощта на pip.

Тази заварена ситуация се намира на oscar.superhosting.bg. Ако вашият хостинг е разположен на друг сървър на Супер Хостинг тогава може да се наложи да пишете на съпорт-а да ви ги инсталират (Щом са го направили веднъж, ще го наравят и втори път).

Също така има вероятност да липсват пакетите mysql-python и PIL, за които също ще се наложи да си ги поискате.

Самото "подкарване"  на Django сайта не е много по-различно от описаното в предишната статия, но тук мисля да синтезирам стъпките необходими за това. Искам тази статия да представлява "HOW TO", а не критика (каквато беше целта на предишната).

Копиране на проекта

Както вече споменах вече СуперХостинг предлагат Git, така че може да си checkout-нете проекта, или ако не го ползвате, просто да си копирате кода по удобен за вас начин.

Виртуална среда

Ако на даденият хостинг акаунт мислите да инсталирате само един сайт то може да си направите home директорията на вие virtual environment:

virtualenv --system-site-packages .

Ако искате виртуалната среда да е в някоя под директория тогава заменете точката от горната команда с името на желаната от вас директория.

След това активирате виртуалната среда с:

. bin/activate

Инсталиране на зависимостите

След като вече разполагаме с виртуална среда и сме я активирали, може да преминем към инсталиране на зависимостите по познатият начин:

pip install -r requirements.txt

Естествено изпълняваме горната команда в директорията където се намира нашият requirements.txt файл.

 Конфигуриране на базата данни

След като разполагаме с всички необходими пакети си настройваме достъпа до базата данни:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "dbname",
        "USER": "dbuser",
        "PASSWORD": "password",
        "HOST": "127.0.0.1",
        "PORT": "",
    },
}

Тук изрично искам да отбележа, че HOST трябва да бъде 127.0.0.1, а не localhost!

За да проверим дали можем да се свържем с базата данни трябва да изпълним:

python manage.py dbshell

Ако всичко е успешно можем да преминем по-нататък

Статични файлове

За да могат статичните и медиа файловете да се сервират от Apache-то, трябва да сложим коректни пътища за STATIC_ROOT и MEDIA_ROOT

STATIC_ROOT = '/home/<username>/public_html/static/'
MEDIA_ROOT = '/home/<username>/public_html/media/'

След което може да изпълните:

python manage.py collectstatic

E-mail настройки

Вашият сайт може и да не праща електронни писма до клиенти, но има голяма вероятност да се наложи да изпрати мейл с грешка до вас. Ако вашите e-mail настройки не са коректни, няма да разберете, че се случва някаква грешка на вашият сайт. За целта трябва да си направите нов e-mail акаунт чрез cPanel и да въведете данните във вашият конфигурационен файл.

EMAIL_HOST = '<domain.com>'
EMAIL_HOST_USER = '<info@domain.com>'
EMAIL_HOST_PASSWORD = '<password>'

Като замените domain.com със вашият домейн.

Конфигуриране на FastCGI

Преди да създадете вашият index.fcgi файл проверете дали вашият проект успешно може да стартира FastCGI процес и съответно успешно сервира началната страница. За целта първо трябва да сте инсталирали flup модула (ако вече не сте), след което да изпълните следната команда:

python manage.py runfcgi

Ако всичко е Ok, на екрана трябва да се появи HTML кода на вашата начална страница. Ако има някакъв проблем, то тогава или ще видите подробна информация за грешката (ако DEBUG = True) на екрана, или ще получите e-mail с грешката (ако DEBUG = False и e-mail настройките са конфигурирани коректно).

След като всичко е наред трябва да направите index.fcgi файл във public_html директорията, със следното съдържание:

#!/bin/sh
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
export HOME=/home/<your_username>

exec ${HOME}/bin/python ${HOME}/<project>/manage.py runfcgi minspare=1 maxspare=1 maxchildren=1

Използвам Shell Script за да може коректно да настроя текущите локални настройки за езика. Това се налага, тъй като от Супер Хостинг не го правят, а за да ви работи коректно сайта когато имате unicode символи в имената на media файловете, това е необходимо. Също така може да забележите че изрично казвам, че искам FCGI сървъра да бъде с един процес и без тредове. Това го правя, защото и без друго Apache-то може да обработва само една заявка едновременно и няма никакъв смисъл Django-то да вдига втори процес или нишка.

След като сме създали файла трябва да му сменим правата, за да може Apache-то да го изпълни:

chmod 755 index.fcgi

Изрично правата трябва да са 755 иначе Apache-то се инати и връща грешка 500, а в Error log-a може и да няма нищо.

Правим последна проверка дали всичко е наред

./index.fcgi

Така би трябвало пак да видим HTML-a на началната страница. Ако всичко е наред преминаваме към конфигуриране на Apache-то

Да кажем на Apache-то да използва FastCGI

По принцип можем да пуснем сайта с обикновен CGI, но сайтът ни ще бъде изключително бавен и няма да се справя със конкурентни заявки, за целта трябва да сложим следните редове във нашият .htaccess файл

AddHandler fcgid-script .fcgi

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]

В заключение

В заключение искам да кажа, че SuperHosting.bg имат напредък от последният път, в който се опитвах да подкарвам сайт. Естествено документацията им за Python куца, а за Django нямат никаква, но поне вече има Git, virtualenv и pip, което много олеснява нещата.

blog comments powered by Disqus