django - 当大请求正文和过期 session 时,Nginx+uWSGI+Django 返回 502

标签 django nginx uwsgi

我有一个 Django View ,它处理随机大小(20 个字符到 30k 字符之间)的 POST 请求。此 API 仅适用于注册用户,并通过 session header 进行验证。该 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 检查 session 是否无效并在客户端完成传递正文之前返回响应(403)。

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

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

最佳答案

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

关于django - 当大请求正文和过期 session 时,Nginx+uWSGI+Django 返回 502,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41336205/

相关文章:

django - 在 Heroku 中安装 C 库

python - 多个类的 find_element_by_class_name

django - 如何覆盖(基于特定条件的过滤器)Django 管理过滤器选择?

nginx - 自动将 docker 容器附加到 nginx 负载均衡器的上游配置

python - 从 Django South 的重复迁移中恢复

docker - Kibana 5.5.1 位于 nginx 1.13 代理后面(dockerized)

ssl - 将客户端ssl cert变量设置为openresty中消息的请求头

python - 为什么 uWSGI 在监听队列应该满的时候不拒绝请求?

multithreading - uWSGI:我遇到了线程模式的问题

python - Supervisord 中的“环境”和 'directory' 选项