Ошибка 500 при работе с Django через FastCGI (решение)

в разделе Программирование | Метки: Python, FastCGI, Django

This post in English

В логах ошибка выглядит так:

[Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: comm with (dynamic) server "/storage/home/username/domain.ru/dispatch.fcgi" aborted: (first read) idle timeout (30 sec)
[Fri Sep 28 00:43:49 2007] [error] [client 85.141.235.249] FastCGI: incomplete headers (0 bytes) received from server "/storage/home/username/domain.ru/dispatch.fcgi"

Одна из причин возникновения подобных ошибок - неправильный путь к Python. Для того чтобы определить путь к Python можно воспользоваться командой whereis:

$ whereis python
python: /usr/local/bin/python /usr/local/man/man1/python.1.gz /usr/ports/lang/python

После чего необходимо проверить содержимое файла ~/domain.ru/dispath.fcgi в самой первой строчке должно быть написано #!/usr/local/bin/python

Несколько особенностей при использовании Django на виртуальном хостинге с FastCGI: например мы разрабатываем свой первый сайт при помощи официального руководства, создаем модель голосования (Polls), все сохраняем, заходим на сайт и видим разноцветную фиолетово-синюю страницу с ошибкой:

TemplateDoesNotExist
 
A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

Как я понял причиной этого является то что при запуске создается несколько процессов, в одном из них болтается старая версия кода, в другом треде - новая. Видимо этим и объясняется что время от времени ошибка то появляется то пропадает.

На Dreamhost wiki на этот случай написан совет убить python командой pkill python, но у меня она не сработала, видимо по причине того что fcgi, python работают от пользователя www-server или какого то еще.

Решение этой проблемы:

  • в каталоге cgi-bin создаем скрипт с таким содержанием
    #!/bin/sh
    killall python
  • ставим правильные права ($chmod 750 kill_python2ADF23x.sh)
  • запускаем его http://www.domain.ru/cgi-bin/kill_python2ADF23x.sh Имя файла скрипта специально содержит случайные символы чтобы его не запустил кто-то, не знающий этого имени.
  • после этого необходимо убить все byte-compled файлы, которые создает python:
    cd ~/django_projects/
    $ find ./ -name \*.pyc -type f -exec rm {} \;
    $ find ./ -name \*.pyo -type f -exec rm {} \;
    $ touch ~/domain.ru/dispatch.fcgi ~/build/flup-0.5/flup/server/fcgi.py

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