Запуск 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
Add post to:   Delicious Reddit Slashdot Digg Technorati Google
Make comment

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.

Required. 30 chars of fewer.

Required.

captcha image Please, enter symbols, which you see on the image