Eu tenho um aplicativo uWSGI escrito em Python usando o framework Pyramid.
O Nginx é configurado como abaixo (deixei de fora alguns bits, mas não acho que eles sejam importantes):
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;
}
O uWSGI é configurado assim (usando um arquivo .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
Tudo funciona bem. O uWSGI é gerenciado com o supervisor.
O que eu quero fazer é obter minhas respostas HTTP 500 para o Nginx e para o navegador em alguns casos.
Atualmente, quando há um HTTP 500, o rastreamento de pilha vai para o arquivo de log corretamente, mas zero bytes são retornados para o Nginx.
[pid: 19826|app: 0|req: 117/117] 192.168.10.54 () {38 vars in 469 bytes} [Tue Nov 11 02:46:53 2014] POST /jsonendpoint => generated 0 bytes in 2 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)
Antes disso, há um rastreamento de pilha do Python e uma exceção típica do Python que não foi tratada. Tudo funciona como esperado.
A pergunta: Como posso obter o uWSGI para retornar o conteúdo da resposta 500 ao Nginx (e, portanto, ao navegador). No momento, ele gera 0 bytes. Isso é algo que preciso configurar mais profundamente na minha estrutura do Python?
Para referência, estou usando uma configuração completamente padrão (sem alteração de seqüência de conexão de banco de dados): Configuração da pirâmide: link
EDITAR ABAIXO
Eu percebi isso.
A resposta é que meu aplicativo Pyramid não estava retornando nenhum dado.
Se você definir uma exibição, como abaixo, com um contexto de Exceção, essa exibição será executada para todas as exceções. Eu ainda estou trabalhando como obter todo o rastreamento de pilha (uma vez que isso não está em um manipulador de exceção do Python, mas de qualquer forma, a questão principal foi respondida).
@view_config(context=Exception)
def failed_validation(exc, request):
msg = exc.args[0] if exc.args else ""
response = Response('Exception: %s' % msg)
Assim, uma sub-questão é: Como obter todo o rastreamento de pilha. Isso provavelmente será uma resposta Pyramid / Python combinada.