У меня есть приложение uWSGI, написанное на Python с использованием инфраструктуры Pyramid.
Nginx настроен, как показано ниже (я пропустил несколько бит, но не думаю, что они будут иметь значение):
upstream uwsgicluster {
server 127.0.0.1:8989;
}
# Proxying connections to application servers
location / {
include uwsgi_params;
uwsgi_pass uwsgicluster;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
uWSGI настроен следующим образом (с использованием файла .ini):
[uwsgi]
socket = 127.0.0.1:8989
master = true
home = /home/user/userenv
paste = config:/home/user/userenv/app/production.ini
harakiri = 30
logto = /home/user/userenv/log/app.log
Все отлично работает. uWSGI управляется супервизором.
Я хочу получить свои ответы HTTP 500 на Nginx, а в некоторых случаях и в браузер.
В настоящее время при наличии HTTP 500 трассировка стека корректно попадает в файл журнала, но Nginx возвращает нулевые байты.
[pid: 19826 | app: 0 | req: 117/117] 192.168.10.54 () {38 переменных в 469 байтах} [Вт, 11 ноября, 02:46:53 2014] POST / jsonendpoint => сгенерировано 0 байтов за 2 мс ( HTTP / 1.1 500) 0 заголовков в 0 байтах (0 переключает на ядро 0)
До этого была трассировка стека Python и типичное исключение Python, которое не было обработано. Все работает как положено.
Вопрос: как заставить uWSGI возвращать содержимое ответа 500 Nginx (и, следовательно, браузеру). Сейчас он генерирует 0 байтов. Это то, что мне нужно глубже настроить в моей среде Python?
Для справки, я использую полностью стандартную конфигурацию пирамиды (без изменений, кроме строки подключения к базе данных): https://github.com/Pylons/pyramid/blob/master/pyramid/scaffolds/alchemy/production.ini_tmpl
ИЗМЕНИТЬ НИЖЕ
Я понял это.
Ответ заключается в том, что мое приложение Pyramid не возвращало никаких данных.
Если вы определяете представление, как показано ниже, с контекстом исключения, это представление выполняется для всех исключений. Я все еще работаю над тем, как получить всю трассировку стека (поскольку этого нет в обработчике исключений Python, но, тем не менее, на главный вопрос был дан ответ).
@view_config(context=Exception)
def failed_validation(exc, request):
msg = exc.args[0] if exc.args else ""
response = Response('Exception: %s' % msg)
Итак, подвопрос: как получить всю трассировку стека. Вероятно, это будет комбинированный ответ Pyramid / Python.