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

标签 javascript backbone.js nginx xmlhttprequest tastypie

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

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

  1. 自定义 javascript 客户端代码
  2. 主干.js
  3. Custom Backbone.sync() implementation
  4. jQuery.ajax() (1.7.2)
  5. XmlHttpRequest
  6. 浏览器(已在 Firefox 和 Chrome 上验证)
  7. 互联网
  8. Nginx 前端
  9. Intranet(通过 Nginx http:// 上游)
  10. Nginx 后端
  11. Gunicorn(通过 Nginx unix:// 上游套接字)
  12. Django 1.4
  13. django-tastypie

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

这是事件的时间表:

  1. 客户端代码在新创建的 Backbone 上调用 .save() APIModel .
  2. 我们的习惯.sync()蜿蜒到client.send()它将新创建的对象分派(dispatch)到 $.ajax() .
  3. 生成的 XmlHttpRequest POST。该请求出现在浏览器开发工具的网络 Pane 中,标记为待处理
  4. HTTP 请求到达 Nginx,Nginx 将其路由到 django-tastypie 后端。
  5. Tastypie 迅速而完美地处理请求,创建资源,并返回 201 CREATED 响应,其中包含指向新资源的 Location header 。
  6. Nginx 记录请求并(表面上)发送响应。
  7. 1.1 分钟过去了,在此期间请求在“网络” Pane 中仍被标记为待处理
  8. 请求在浏览器的网络 Pane 中标记为完成。
  9. jQuery xhr 触发成功处理程序
  10. 我们的自定义 API 客户端的 success handler检测到 201 响应代码并触发对位置的后续 GET 请求。
  11. 通常的事情发生了,GET 迅速响应,最外层的 $.Deferred() 对象解析,触发任何关联的客户端代码成功处理程序。

其他需要考虑的细节:

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

我所做的未经证实的假设:

  1. 一旦 Nginx 记录了一个请求,响应就会系上蝴蝶结并连同手写的感谢信发送给客户。
  2. 这不是浏览器或 jQuery 中的错误。

请原谅我煞费苦心的细节,但我已尽最大努力消除变量,目前,我可以放心地说问题是以下之一:

  1. 宇宙物理结构的缺陷
  2. 我们思维的感知模型存在缺陷
  3. 我们还没有考虑的其他事情

我希望获得#3。有什么想法吗?

最佳答案

谜底揭晓!这是 Content-Length header ,或者更确切地说,缺少 header 。 @MaxDounin 的想法是正确的,我只是没有完全遵循它。

启用 Django 的 django.middleware.http.ConditionalGetMiddleware 达到了目的。 (此中间件设置 Content-Length header 。)

关于javascript - 浏览器和 Nginx 之间的 HTTP POST 神秘约 1 分钟延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606898/

相关文章:

javascript - 销毁 View 时backbone.js从模型中解除函数绑定(bind)

node.js - 为什么容器 IP 和别名之间的交换会导致 AJAX 请求出现差异?

javascript - react 验证以及清除输入

javascript - 是否有一个 Javascript 库可以解析并漂亮地打印以 JSON 形式返回的 .NET 异常?

javascript - Amcharts:在连续图中放置没有线的点

javascript - 在正文中加载脚本的顺序并使用 jquery ready

javascript - 如何允许来自本地文件的弹出窗口(文件 :///addresses) in Firefox 5?

javascript - backbone.js 路由器无法在 IE6 上运行

ubuntu - 使用现有的 Nginx 安装转发到 GitLab 子域

linux - Nginx Proxy_Pass 到 CDN 与直接访问 CDN。优点,缺点,速度是否较慢或对服务器有负面影响?