我正在针对nginx-> gunicorn-> Django应用做一个HTTP POST请求。响应体快速返回,但请求没有完全完成大约60秒。
通过“完全完成”我的意思是我尝试过的各种客户端(Chrome,wget,我正在构建的Android应用程序)表明请求仍在进行中,就像等待更多数据一样。从Wireshark收听我看到所有数据都快速到达,然后在60秒后ACK FIN终于到来。
本地开发服务器(./manage.py runserver
)上的相同POST请求会快速执行。此外,它直接对枪炮执行,绕过nginx。也可以在Apache / mod_wsgi设置中快速工作。
GET请求没有问题。甚至其他POST请求也没问题。我知道的一个区别是这个特定的请求返回201而不是200.
我认为它与Content-Length
标题,封闭vs keepalive连接有关,但还不知道事情应该如何正常工作。
Content-Length header
还是Transfer-encoding: chunked
?或者nginx是否能够在没有这些的情况下应对,并根据需要添加它们? 更新:在keepalive_timeout
中将nginx.conf
设置为0可解决我的问题。但是,当然,保持活力已经消失。我还不确定是什么问题。堆栈中的某些内容(我的Django应用程序或gunicorn)可能无法正确实现分块传输,并使客户端感到困惑。
答案 0 :(得分:0)
听起来你的上游服务器(gunicorn)以某种方式在特定的api调用上保持连接打开 - 我不知道为什么(取决于你的代码,我认为),但默认的proxy_read_timeout
选项在nginx是60秒,所以听起来这个响应没有收到,出于某种原因。
我使用非常类似的设置,我一般都没有注意到POST或任何其他请求的任何问题。
请注意return HttpResponse(status=201)
之前已经引起了我的问题 - 似乎Django更喜欢明确空的身体:return HttpResponse("", status=201)
。我通常会在我预期的身体中设置某些 - 这可能需要注意。