浏览器和Nginx之间HTTP POST的神秘〜1分钟延迟

Dav*_*Eyk 5 javascript nginx xmlhttprequest backbone.js tastypie

从客户端javascript发送到我们的服务器时,我们最近经历了一个非常奇怪但非常一致的延迟.

这是我们的技术堆栈,从前到后:

  1. 自定义javascript客户端代码
  2. Backbone.js的
  3. 自定义Backbone.sync()实现
  4. jQuery.ajax()(1.7.2)
  5. 的XmlHttpRequest
  6. 浏览器(在Firefox和Chrome上都经过验证)
  7. 互联网
  8. Nginx前端
  9. 内联网(通过Nginx http://上游)
  10. Nginx后端
  11. Gunicorn(通过Nginx unix://上游插座)
  12. Django 1.4
  13. Django的tastypie

(旁注:您是否曾对网络开发的复杂程度感到敬畏?)

这是事件的时间表:

  1. 客户端代码调用.save()新创建的Backbone APIModel.
  2. 我们的自定义.sync()风向client.send()调度新创建的对象的方式$.ajax().
  3. 生成的XmlHttpRequest POST.该请求显示在浏览器开发工具的网络窗格中,标记为待定.
  4. HTTP请求到达Nginx,后者将其路由到django-tastypie后端.
  5. Tastypie及时,完美地处理请求,创建资源,并返回201 CREATED响应,Location标题指向新资源.
  6. Nginx记录请求并(表面上)发送响应.
  7. 1.1分钟过去了,在此期间,请求仍在"网络"窗格中标记为待处理.
  8. 请求在浏览器的"网络"窗格中标记为已完成.
  9. jQuery xhr触发成功处理程序
  10. 我们的自定义API客户端的成功处理程序检测到201响应代码并触发对该位置的后续GET请求.
  11. 通常的事情发生了,GET迅速响应,最外面的$.Deferred()对象解析,触发任何相关的客户端代码成功处理程序.

其他需要考虑的细节:

  1. 同一堆栈中的GET请求和PUT请求立即解决.
  2. 当通过专用HTTP客户端直接与最外层的Nginx交互时,POST请求与请求中的请求相同,并立即解决.
  3. 删除特殊情况201处理程序和后续GET对该错误没有影响.
  4. 延迟总是 1.1分钟.我曾经console.time()确定延迟在65,000ms范围内变化.
  5. 延迟仅出现在此配置中.它不会出现在我们的开发设置中,它们稍微简单一些.

我正在做的未经证实的假设:

  1. 一旦Nginx记录了一个请求,响应就会被鞠躬并用手写的感谢信发送给客户端.
  2. 这不是浏览器或jQuery中的错误.

请原谅详细的细节,但我已尽力消除变量,目前,我觉得这个问题是以下之一:

  1. 宇宙物理结构的缺陷
  2. 我们头脑中感性模型的缺陷
  3. 我们尚未考虑的其他事情

我希望#3.有任何想法吗?

Dav*_*Eyk 3

谜团已揭开!这是Content-Length标题,或者更确切地说,缺少标题。@MaxDounin 有正确的想法,我只是没有遵循它足够远。

启用 Djangodjango.middleware.http.ConditionalGetMiddleware就成功了。(此中间件设置Content-Length标头。)