Запуск django сайта через nginx + superfcgi
Я вчера перевёл все свои сайты на связку nginx + fastcgi-демон. Раньше они работали на связке nginx + apache/mod_wsgi. Даже не знаю, зачем я это сделал. Да и какая разница :o) Я сейчас просто опишу как соединять nginx с fastcgi-django-демонами через библиотеку superfcgi и надеюсь, кому-нибудь это будет полезно.
Так вот, для начала нада поставить superfcgi библиотеку. Кстати, её автор barbuza. Ставится банально: pip install superfcgi. Только не забудьте зависимости поставить предварительно. В debian надо ставить такие пакеты: gcc, python2.5-dev (если у вас 2.5 python), libfcgi-dev. Ещё надо multiprocessing либу поставить в случае python2.5, правда, Виктор говорит, что она уже автоматически ставиться. Но, если что, имейте в виду.
После установки superfcgi надо прописать ‘superfcgi’ в settings.INSTALLED_APPS. Это сделает доступной команду manage.py runserupfcgi, с помощью которой можно запустить процесс, который позволит общаться с nginx через fastcgi-интерфейс.
Проблема в том, что надо как-то контролировать этот процесс: уметь его останавливать, например. Команда manage.py runsuperfcgi этого не умеет, поэтому я использую дополнительный bash скрипт. Пощупать его можно тут: http://bitbucket.org/lorien/spawn/src/tip/spawn.sh
У меня для каждого сайта есть свой маленький spawn.sh, в котором я задаю одну переменную $SITE и затем делаю include главного spawn.sh. Например, для запуска веб-мозгов у меня такой скрипт:
#!/bin/bash
SITE="web_brains"
source /home/web/bin/spawn.sh
На всякий случай, если вдруг сайт упадёт или будет сделан rebot сервера у меня в кроне каждую минуту стартуются все сайты. Тупо, да, зато работает :D Конечно, если сайт уже запущен, то копия не запускается, в spawn.sh учтёт этот момент. Каждую минуту я пытаюсь запустить все сайты таким скриптом:
#!/bin/sh
dirs=$(find /home/web/web -maxdepth 1 -type d)
for dir in $dirs; do
echo "Checking directory $dir"
cd $dir;
if [ -e spawn.sh ]; then
echo "Found spawn.sh"
./spawn.sh $1
fi
done
Кроме django-сайтов я запустил через superfcgi также один trac-проект. Для этого я сделал следующее, создал в директории проекта файл trac_wsgi.py
import os
os.environ['TRAC_ENV'] = '/web/pybb.org'
os.environ['PYTHON_EGG_CACHE'] = '/web/cache/trac/pybb.org'
import trac.web.main
app = trac.web.main.dispatch_request
Это просто создание WSGI приложения, обслуживающего trac-проект. Теперь его можно подцепить к superfcgi библиотеке. Библиотека superfcgi предоставляет команду superfcgi, которая в параметре —app принимает название модуля, где находится wsgi-приложение. Описываю я всё довольно сумбурно, но писать подробнее не могу — шибко лень :) Я просто это всё напишу здесь, потом кто-то будет искать через google, наткнётся, прочитает, что-то поймёт. Я сам иногда на свои старые посты натыкаюсь и иногда даже нахожу то, что успел забыть :D
В общем, spawn.sh файл для запуска trac такой:
#!/bin/sh
SITE="pybb"
SOCKET_FILE="/var/run/www/pybb.sock"
NOHUP="1"
COMMAND="superfcgi --workers 1 --threads 1 --app trac_wsgi.app --socket $SOCKET_FILE --path /web/pybb.org"
source /home/web/bin/spawn.sh






Comments
А почему именно superfcgi?
Да я сам не знаю :o) А почему бы и нет? Интересно же. Кстати, я уже наблюдал как этот блог отваливался сегодня (работая на superfcgi), в error логе вот такая непонятная ошибка: http://dumpz.org/13335/
Это значит рано еще в продакшен сувать это “супер” чудо?
Нет, это ничего не значит. Статья не носит аналитического характера — просто голая техническая информация о том, как подключить сайт через superfcgi библиотеку :) Рано или не рано — решать каждому в индивидуальном порядке :)
ну согласитесь. Рассказать, как настраивать супер фаст цжи, и в коментах написать — как оно все падает :)
Да блог ещё ничо, а вот трак перманентно лежит (запущенный из-под superfcgi). Но это не значит, что именно superfcgi кривой, может быть, руки мои :)
Настоятельно рекомендую обновить superfcgi. На pypi залита последняя версия, она как раз более дружелюбна. Время идет проект развивается.
А какие конкретно проблемы с trac’ом?
Я с ним до этого не работал, но сейчас сделал virtualenv, поставил туда Trac и superfcgi, взял wsgi скрипт на официальном wiki (http://trac.edgewall.org/wiki/TracModWSGI) и все запустилось и вроде работает.
Да я уже на apache/mod_wsgi всё перевёл обратно :-)) C траком не могу сказать, сначала работало, потом перестало — мне было лень разбираться.
If you have no notion how to complete your United States essays paper, you would have to hire the writing service to see a way to complete essay.