Назад | Перейти на главную страницу

Pyramid + Nginx + uWSGI Server 500 ошибок

У меня есть приложение 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.