我正在对 nginx->gunicorn->Django 应用程序执行 HTTP POST 请求。响应正文很快返回,但请求还没有完全完成大约 60 秒。
“完全完成”是指我尝试过的各种客户端(Chrome、wget、我正在构建的 Android 应用程序)表明请求仍在进行中,好像在等待更多数据。从 Wireshark 监听我看到所有数据都很快到达,然后在 60 秒后 ACK FIN 终于来了。
本地开发服务器 ( ./manage.py runserver
) 上的相同 POST 请求执行速度很快。此外,它绕过 nginx 直接针对 gunicorn 快速执行。在 Apache/mod_wsgi 设置中也可以快速运行。
GET 请求没有问题。甚至其他 POST 请求也可以。我知道的一个区别是这个特定的请求返回 201 而不是 200。
我认为它与Content-Length
标头、关闭与保持连接连接有关,但还不知道事情应该如何正常工作。
- 后端服务器(gunicorn)当前正在关闭连接,这是有道理的。
- 后端服务器应该包括
Content-Length header
,还是Transfer-encoding: chunked
?或者 nginx 是否应该能够在没有这些的情况下应对,并根据需要添加它们? - 我认为保持连接是好的,不应该在 nginx 中禁用。
更新:设置keepalive_timeout
为 0nginx.conf
解决了我的问题。但是,当然,keep-alive 已经消失了。我仍然不确定是什么问题。可能堆栈中的某些东西(我的 Django 应用程序或 gunicorn)没有正确实现分块传输,并使客户感到困惑。