Nginx+uWSGI+Django 在大请求正文和过期会话时返回 502

Posted

技术标签:

【中文标题】Nginx+uWSGI+Django 在大请求正文和过期会话时返回 502【英文标题】:Nginx+uWSGI+Django are returning 502 when big request body and expired session 【发布时间】:2017-05-11 05:04:13 【问题描述】:

我有一个 Django 视图,它处理随机大小的 POST 请求(介于 20 char 到 30k 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】:

我发现 statement 向客户端添加 HTTP 标头 connection:keep-alive 应该可以解决此问题。我稍后会验证它,但已经在这里发布了,希望它对某人有所帮助。

【讨论】:

谢谢。我没有时间验证这一点。如果您或某人可以验证这一点,那就太好了。

以上是关于Nginx+uWSGI+Django 在大请求正文和过期会话时返回 502的主要内容,如果未能解决你的问题,请参考以下文章

Django+Nginx+uWSGI部署

Django + uWSGI + Nginx + SSL - 工作配置请求(强调 SSL)

08 nginx+uWSGI+django+virtualenv+supervisor发布web服务器

nginx+uwsgi+django部署流程

Django uWSGI NGINX 错误请求 400

Django1.11+Uwsgi+Nginx的生产环境部署