我有一个使用 Pyramid 框架用 Python 编写的 uWSGI 应用程序。
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 由 Supervisor 管理。
我想要做的是将我的 HTTP 500 响应发送给 Nginx,在某些情况下发送给浏览器。
目前,当出现 HTTP 500 时,堆栈跟踪会正确转到日志文件,但会向 Nginx 返回零字节。
[pid: 19826|app: 0|req: 117/117] 192.168.10.54 () {38 个变量,469 个字节} [2014 年 11 月 11 日星期二 02:46:53] POST /jsonendpoint => 在 2 毫秒内生成 0 个字节 (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 应用程序没有返回任何数据。
如果您定义一个视图(如下所示),其上下文为 Exception,则此视图将针对所有异常运行。我仍在研究如何获取整个堆栈跟踪(因为这不在 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 组合答案。