Почему Django fcgi просто умер? Как я могу узнать?

Я запускаю Django в Linux, используя fcgi и Lighttpd. Время от времени (примерно раз в день) сервер просто умирает. Я использую последнюю стабильную версию Django, Python и Lighttpd.

Единственное, о чем я могу думать, так это о том, что моя программа открывает множество файлов и выполняет множество внешних процессов, но я вполне уверен, что с этой стороны все в порядке.

Глядя на журналы ошибок и доступа, ничего необычного не происходит (т.е. нагрузка не выше нормы). В тех случаях, когда у меня были исключения из Python, они отображались в error.log, но когда происходит этот сбой, я ничего не получаю.

Есть ли способ узнать, почему процесс умер? Если не помещать операторы регистрации в каждую строку? Очевидно, я не могу воспроизвести это, поэтому я не знаю, где именно искать.

Изменить

Это процесс django, который умирает. Я запускаю сервер с manage.py runfcgi daemonize=true method=threaded host=127.0.0.1 port=12345


person Joe    schedule 08.04.2010    source источник
comment
Вы искали основные файлы? Вы установили свои rlimits для разрешения файлов ядра?   -  person jemfinch    schedule 08.04.2010
comment
Можете ли вы просто запустить сервер из командной строки в режиме отладки без демонизации?   -  person Mike DeSimone    schedule 08.04.2010
comment
Читая вопрос еще раз, не совсем понятно одно: умирает ли демон lighttpd или ваш собственный процесс FastCGI?   -  person Thomas    schedule 08.04.2010
comment
@Thomas - это процесс джанго. Я уточнил вопрос.   -  person Joe    schedule 08.04.2010
comment
@Mike - Я мог бы, но проблема в том, что сайт умирает в производстве, и я хочу, чтобы рабочий сервер работал как демон (не так ли?). Тестовый сайт работает нормально. Я попробую провести стресс-тестирование сайта в режиме без демонизации и посмотрю, что произойдет.   -  person Joe    schedule 08.04.2010


Ответы (3)


Вы можете отредактировать manage.py, чтобы перенаправить stderr в файл, предполагая, что runfcgi сам этого не делает:

import sys
if sys.argv[1] == "runfcgi":
    sys.stderr = open("/path/to/my/django-error.log", "a")
person Mike DeSimone    schedule 09.04.2010
comment
Спасибо за предложение. Я думаю, что, поскольку я получал различные исключения в error.log lighttpd (по несвязанным причинам), stderr уже зарегистрирован. Достаточно сказать, что журнал пуст, когда процесс умирает. - person Joe; 09.04.2010

Это на вашем сервере? (у вас есть коробка?). У меня была эта проблема на виртуальном хостинге, и хост просто убивал длинные процессы. Знаете ли вы, получает ли ваш fcgi SIGTERM?

person Jared Forsyth    schedule 16.04.2010
comment
Вы знаете, какой процесс будет отправлять эти сообщения? Это мой [виртуальный] ящик. У меня есть несколько процессов Django. Это единственный умирающий. - person Joe; 16.04.2010

Были такие же проблемы. Мало того, что они умирают без предупреждения или причины, они также утекают как сумасшедшие с потоками, застрявшими без главного процесса. Мы решили эту проблему, запустив cronjob каждые 5 минут, который проверяет, работает ли номер порта, и если он не перезагружается.

Кстати, сейчас мы (медленно мигрируем) отказались от fcgi и перешли на uwsgi.

person Peter Bengtsson    schedule 18.04.2010
comment
Я пришел к такому же выводу, но с интервалом в 1 минуту. uwsgi решил вашу проблему? - person Joe; 20.04.2010
comment
Еще не знаю. По крайней мере, еще не видел, чтобы он рухнул. - person Peter Bengtsson; 21.04.2010