Ошибка 500 при работе с Django через FastCGI (решение)
Размещено 2007-09-27
в разделе Программирование | Метки:
Python, FastCGI, Django
После чего необходимо проверить содержимое файла ~/domain.ru/dispath.fcgi в самой первой строчке должно быть написано #!/usr/local/bin/python
Как я понял причиной этого является то что при запуске создается несколько процессов, в одном из них болтается старая версия кода, в другом треде - новая. Видимо этим и объясняется что время от времени ошибка то появляется то пропадает.
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.