Подтвердить что ты не робот

500 Ошибка без каких-либо изменений в журналах apache

В настоящее время я разрабатываю приложение на основе flask. Он работает с мелким нерестом сервера вручную, используя app.run(). Я попытался запустить его через mod_wsgi сейчас. Как ни странно, я получаю ошибку 500 и ничего в журналах. Я немного исследовал, и вот мои выводы.

  • Вставка строки типа print >>sys.stderr, "hello" работает так, как ожидалось. Сообщение появляется в журнале ошибок.
  • При вызове метода без использования шаблона он работает отлично. Ошибка 500.
  • Использование простого шаблона также отлично работает.
  • НО, как только я запускаю доступ к базе данных внутри шаблона (например, цикл по запросу), я получаю сообщение об ошибке.

Моя кишка говорит мне, что это SQLAlchemy, которая испускает ошибку, и, может быть, некоторые настройки протоколирования заставляют журнал отбрасываться в какой-то момент приложения.

Кроме того, для тестирования я использую SQLite. Это, насколько я помню, можно получить только из одного потока. Поэтому, если mod_wsgi порождает больше потоков, это может сломать приложение.

Я немного в растерянности, потому что он только ломается за mod_wsgi, что также, похоже, проглотит мои ошибки. Что я могу сделать, чтобы ошибки попадали в apache error_log?

Для справки, код можно увидеть в этом github permalink.

4b9b3361

Ответ 1

Оказывается, я не совсем ошибался. Исключение действительно было вызвано sqlalchemy. И по мере того, как он по умолчанию передавался по stdout, mod_wsgi молча игнорировал его (насколько я могу судить).

Чтобы ответить на мой главный вопрос: как увидеть ошибки, создаваемые приложением WSGI?

На самом деле это очень просто. Перенесите свои журналы на stderr. Единственное, что вам нужно сделать, добавить в WSGI script следующее:

import logging, sys
logging.basicConfig(stream=sys.stderr)

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

Но для быстрой и грязной отладки это будет прекрасно.

Ответ 2

Если вы поместите это в свой config.py, это значительно поможет в распространении ошибок вплоть до журнала ошибок apache:

PROPAGATE_EXCEPTIONS = True

Ответ 3

У меня была аналогичная проблема: случайная "Внутренняя ошибка сервера" без журналов. Когда вы используете mod_wsgi, вы должны удалить "app.run()", потому что это всегда будет запускать локальный сервер WSGI, который мы не хотим, если мы разворачиваем это приложение в mod_wsgi. См. docs. Я не знаю, если это ваше дело, но я надеюсь, что это может помочь.