当大请求主体和过期会话时,Nginx + uWSGI + Django返回502

时间:2016-12-26 20:55:10

标签: django nginx uwsgi

我有一个Django视图,用于处理随机大小的POST请求(在20 char到30 k char之间)。此API仅适用于注册用户,并使用会话标头进行验证。 API适用于我的测试用例,但我注意到Nginx日志中有502个。错误日志显示此行::

2016/12/26 19:53:15 [error] 1048#0: *72 sendfile() failed (32: Broken pipe) while sending request to upstream, client: XXX.XXX.XXX.XXX, server: , request: "POST /api/v1/purchase HTTP/1.1", upstream: "uwsgi://unix:///opt/project/sockets/uwsgi.sock:", host: "staging.example.com"

经过一些测试后,我设法用一个大的身体请求重新创建了这个电话。

curl -XPOST https://staging.example.com/api/v1/purchase \
-H "Accept: application/json" \
-H "token: development-token" \
-H "session: bad-session" \
-i -d '{"receipt-data": "<25677 character string>"}'
HTTP/1.1 100 Continue

HTTP/1.1 502 Bad Gateway
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 26 Dec 2016 19:54:32 GMT
Content-Type: text/html
Content-Length: 181
Connection: keep-alive

<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.4.6 (Ubuntu)</center>
</body>
</html>

似乎发生的事情是Django检查会话无效并在客户端完成传递正文之前返回响应(403)。

如果我是正确的,有没有办法让Django在检查标题而不是Nginx之后发送100状态?

如果没有,在检查标题之前是否有比等待身体更优雅的解决方案?

1 个答案:

答案 0 :(得分:0)

我发现statement将HTTP标头connection:keep-alive添加到客户端应解决此问题。我稍后会对其进行验证,但已在此处发布,希望它能帮到某人。