MSIE $.ajax Heroku SSL Rails 应用延迟
MSIE $.ajax delays in Heroku SSL Rails app
我们在 Heroku 上有一个 Rails 3 应用程序,它在 jQuery AJAX 请求上存在长时间延迟,尤其是在 IE11 中——持续大约 4 或 5 秒。请求没有失败;他们只是永远。 Chrome、FF 和 Safari 等文明浏览器都会在几分之一秒内做出响应。而且我可以看到服务器上的响应时间很快,但是 IE 需要 4-5 秒才能显示请求完成。
我有一个要演示的准系统应用程序:https://ajax-testing.herokuapp.com/test。单击该文本会将 AJAX 请求发送到服务器,服务器将其回显并显示在警报中。我发现它在所有浏览器中都很快,除了 IE,您在 5 秒内看不到警报。
我在本地测试时没有遇到延迟,但是当它部署到 Heroku 时我遇到了。我确定它与 Heroku 上的 SSL 有关,因为如果我将 config.force_ssl 设置为 false,问题就会消失。 Heroku 上 SSL(有延迟)和 non-SSL(无延迟)之间 header 的唯一真正区别是 SSL 版本中的 Strict-Transport-Security header。
这是 AJAX 请求的代码...
$.ajax({
type: "POST",
url: "ajax_call",
dataType: 'json',
data: { message: "Test message" }
}).done(function(data) {
alert(data["message"]);
});
设置:
- Rails Heroku 上的 3.2.21
- jQuery 1.11.1
- 瘦身和独角兽都试过了
- IE 11.0.9600.17633(11.0.16 更新)
我尝试了不同的服务器,删除了数据类型和其他 $.ajax 变体,添加了 IE-specific 元标记等。我在网上找不到任何关于这个特定问题的参考.有人对它可能是什么或如何进一步缩小范围有任何建议吗?
由于最近的负载平衡器更新中的错误,这原来是 Heroku 的问题。我花了很多时间来研究它,假设它是由最近的 IE 更新引起的,这与问题的第一个报告同时发生,因为 IE 是我们测试中唯一受影响的浏览器。
当我看到 JavaScript 执行出现问题时,我的第一个想法不是:检查 ELB —— 但它可能应该是 ;) 这是我们的应用程序第一次因到期而中断Heroku/Amazon 更新。
显然,问题发生在没有 Content-Length
或 Transfer-encoding: chunked
headers 的请求上,它可能只会影响某些堆栈配置,否则我认为我' d 已经能够找到更多关于它的报告。
如果您遇到这种情况,请创建帮助票并告诉他们您的应用中存在 IE 延迟,并且您认为这是由于最近的 ELB 更新所致。他们可以为您的应用程序部署更新到 ELB,这是他们最终为我们做的,并且最终会为所有 Heroku 应用程序做的。
在我的例子中,我在 Heroku 上使用 Rails 和独角兽,所有页面都在 SSL 下。他们建议设置 RACK_ENV=deployment
以强制 unicorn 加载 Rack::ContentLength
和 Rack::Chunked
中间件(或自己手动添加)。这为我解决了问题,无需让他们专门为我的应用程序部署更新。
感谢这个主题,我们非常接近在这上面花很多时间。我们刚刚启用 Rack::Deflate 但回滚并没有解决这个问题。我们也在 HTTPS 下 运行。
Heroku 的回应是:
We recently found out that it is because of Unicorn web server behavior + Heroku default RACK_ENV=production. You actually should use Unicorn with RACK_ENV=deployment (see https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79 for more detail), or you should use Unicorn with HTTP servers such as nginx.
Both of them solve the problem that you have now.
This issue is happening because your response doesn't contain Content-Length header, nor Transfer-encoding: chunked. It is not invalid HTTP response, but it is not good HTTP response and you want to fix it.
You could also manually add the middleware such as Rack::ContentLength and/or Rack::Chunked.
Alternatively, you can switch to Puma (https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79 which is
our recommended web server now).
我已经添加了 Rack::Chunked 以立即退出 Dodge。 Rack::Deflate 去掉 contentLength header 我相信。
我不是很了解 RACK_ENV 选项,但是 I'm not alone there!
我想下一步是更新 RACK_ENV 并迁移到 Puma。
我们在 Heroku 上有一个 Rails 3 应用程序,它在 jQuery AJAX 请求上存在长时间延迟,尤其是在 IE11 中——持续大约 4 或 5 秒。请求没有失败;他们只是永远。 Chrome、FF 和 Safari 等文明浏览器都会在几分之一秒内做出响应。而且我可以看到服务器上的响应时间很快,但是 IE 需要 4-5 秒才能显示请求完成。
我有一个要演示的准系统应用程序:https://ajax-testing.herokuapp.com/test。单击该文本会将 AJAX 请求发送到服务器,服务器将其回显并显示在警报中。我发现它在所有浏览器中都很快,除了 IE,您在 5 秒内看不到警报。
我在本地测试时没有遇到延迟,但是当它部署到 Heroku 时我遇到了。我确定它与 Heroku 上的 SSL 有关,因为如果我将 config.force_ssl 设置为 false,问题就会消失。 Heroku 上 SSL(有延迟)和 non-SSL(无延迟)之间 header 的唯一真正区别是 SSL 版本中的 Strict-Transport-Security header。
这是 AJAX 请求的代码...
$.ajax({
type: "POST",
url: "ajax_call",
dataType: 'json',
data: { message: "Test message" }
}).done(function(data) {
alert(data["message"]);
});
设置:
- Rails Heroku 上的 3.2.21
- jQuery 1.11.1
- 瘦身和独角兽都试过了
- IE 11.0.9600.17633(11.0.16 更新)
我尝试了不同的服务器,删除了数据类型和其他 $.ajax 变体,添加了 IE-specific 元标记等。我在网上找不到任何关于这个特定问题的参考.有人对它可能是什么或如何进一步缩小范围有任何建议吗?
由于最近的负载平衡器更新中的错误,这原来是 Heroku 的问题。我花了很多时间来研究它,假设它是由最近的 IE 更新引起的,这与问题的第一个报告同时发生,因为 IE 是我们测试中唯一受影响的浏览器。
当我看到 JavaScript 执行出现问题时,我的第一个想法不是:检查 ELB —— 但它可能应该是 ;) 这是我们的应用程序第一次因到期而中断Heroku/Amazon 更新。
显然,问题发生在没有 Content-Length
或 Transfer-encoding: chunked
headers 的请求上,它可能只会影响某些堆栈配置,否则我认为我' d 已经能够找到更多关于它的报告。
如果您遇到这种情况,请创建帮助票并告诉他们您的应用中存在 IE 延迟,并且您认为这是由于最近的 ELB 更新所致。他们可以为您的应用程序部署更新到 ELB,这是他们最终为我们做的,并且最终会为所有 Heroku 应用程序做的。
在我的例子中,我在 Heroku 上使用 Rails 和独角兽,所有页面都在 SSL 下。他们建议设置 RACK_ENV=deployment
以强制 unicorn 加载 Rack::ContentLength
和 Rack::Chunked
中间件(或自己手动添加)。这为我解决了问题,无需让他们专门为我的应用程序部署更新。
感谢这个主题,我们非常接近在这上面花很多时间。我们刚刚启用 Rack::Deflate 但回滚并没有解决这个问题。我们也在 HTTPS 下 运行。
Heroku 的回应是:
We recently found out that it is because of Unicorn web server behavior + Heroku default RACK_ENV=production. You actually should use Unicorn with RACK_ENV=deployment (see https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79 for more detail), or you should use Unicorn with HTTP servers such as nginx.
Both of them solve the problem that you have now.
This issue is happening because your response doesn't contain Content-Length header, nor Transfer-encoding: chunked. It is not invalid HTTP response, but it is not good HTTP response and you want to fix it. You could also manually add the middleware such as Rack::ContentLength and/or Rack::Chunked.
Alternatively, you can switch to Puma (https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79 which is our recommended web server now).
我已经添加了 Rack::Chunked 以立即退出 Dodge。 Rack::Deflate 去掉 contentLength header 我相信。
我不是很了解 RACK_ENV 选项,但是 I'm not alone there!
我想下一步是更新 RACK_ENV 并迁移到 Puma。