nginx / gunicorn连接挂60秒

时间:2012-05-10 07:39:03

标签: django nginx timeout gunicorn

我正在针对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连接有关,但还不知道事情应该如何正常工作。

  • 后端服务器(gunicorn)目前正在关闭连接,这很有意义。
  • 后端服务器应该包含Content-Length header还是Transfer-encoding: chunked?或者nginx是否能够在没有这些的情况下应对,并根据需要添加它们?
  • 我认为连接保持活动很好,并且不应该在nginx中禁用。

更新:keepalive_timeout中将nginx.conf设置为0可解决我的问题。但是,当然,保持活力已经消失。我还不确定是什么问题。堆栈中的某些内容(我的Django应用程序或gunicorn)可能无法正确实现分块传输,并使客户端感到困惑。

1 个答案:

答案 0 :(得分:0)

听起来你的上游服务器(gunicorn)以某种方式在特定的api调用上保持连接打开 - 我不知道为什么(取决于你的代码,我认为),但默认的proxy_read_timeout选项在nginx是60秒,所以听起来这个响应没有收到,出于某种原因。

我使用非常类似的设置,我一般都没有注意到POST或任何其他请求的任何问题。

请注意return HttpResponse(status=201)之前已经引起了我的问题 - 似乎Django更喜欢明确空的身体:return HttpResponse("", status=201)。我通常会在我预期的身体中设置某些 - 这可能需要注意。