我们在Heroku上有一个Rails 3应用程序,它在IE11中的jQuery AJAX请求上出现了长时间延迟,持续大约4或5秒。请求没有失败;它们只需要很长时间。文明浏览器如Chrome、FF&Safari都在几分之一秒内做出响应。我可以看到服务器上的响应时间很快,但IE需要4-5秒才能显示请求完成。
我有一个barebones应用程序要演示:https://ajax-testing.herokuapp.com/test.单击文本将AJAX请求发送到服务器,服务器会将其发回并显示在警报中。我发现它在所有浏览器中都很快,除了IE,在那里你5秒钟都看不到警报。
当我在本地测试时,我没有遇到延迟,但当它部署到Heroku时,我会遇到。我已经确定这与Heroku上的SSL有关,因为如果我将config.force_SSL设置为false,问题就会消失。Heroku上的SSL(有延迟)和非SSL(无延迟)标头之间唯一真正的区别是SSL版本中的Strict Transport Security标头。
以下是AJAX请求的代码。。。
$.ajax({
type: "POST",
url: "ajax_call",
dataType: 'json',
data: { message: "Test message" }
}).done(function(data) {
alert(data["message"]);
});
设置:
- Heroku上的轨道3.2.21
- jQuery 1.11.1
- 尝试了thin&独角兽
- IE 11.0.9600.177633(11.0.16更新)
我尝试过不同的服务器,去掉了dataType和其他$.ajax变体,添加了IE特定的元标签,等等。我在网上找不到任何关于这个特定问题的参考。有人对它可能是什么或如何进一步缩小范围有建议吗?
这是一个Heroku问题,原因是最近负载均衡器更新中的一个错误。我花了大量时间来研究它,假设它是由最近的IE更新引起的,这与第一次报告该问题的时间相吻合,而且IE是我们测试中唯一受影响的浏览器。
当我看到JavaScript执行有问题时,我的第一个想法不是:检查ELB——但它可能应该是;)这是我们的应用程序第一次因Heroku/Amazon更新而中断。
显然,这个问题发生在没有Content-Length
或Transfer-encoding: chunked
标头的请求上,它可能只影响某些堆栈配置,否则我想我可以找到更多关于它的报告
如果你遇到这种情况,请创建一个帮助单,告诉他们你的应用程序中有IE延迟,你认为这是由于最近的ELB更新造成的。他们可以为您的应用程序部署ELB更新,这就是他们最终为我们所做的,并且最终将为所有Heroku应用程序所做的。
在我的案例中,我在Heroku上使用了带有独角兽的Rails,所有页面都在SSL下。他们建议设置RACK_ENV=deployment
来强制独角兽加载Rack::ContentLength
和Rack::Chunked
中间件(或者自己手动添加)。这为我解决了这个问题,而无需让他们专门为我的应用程序部署更新。
感谢这个线程,我们很快就要花很多时间了。我们刚刚启用了Rack::Deflate,但回滚并没有解决这个问题。我们也在HTTPS下运行。
Heroku的回应是:
我们最近发现,这是因为独角兽网络服务器行为+Heroku默认RACK_ENV=生产。实际上,您应该使用带有RACK_ENV=部署的Unicorn(请参阅https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79获取更多详细信息),或者您应该将Unicorn与nginx等HTTP服务器一起使用。
他们两个都解决了你现在的问题。
出现此问题是因为您的响应不包含Content-Length标头,也不包含传输编码:chunked。它不是无效的HTTP响应,但不是好的HTTP响应并且您想要修复它。您也可以手动添加中间件,如Rack::ContentLength和/或Rack::Chunked。
或者,您可以切换到彪马(https://github.com/defunkt/unicorn/blob/master/lib/unicorn.rb#L56-L79我们现在推荐的网络服务器)。
我已经添加了Rack::Chunked现在要离开道奇。Rack::Deflate剥离了contentLength标头,我相信。
我并没有真正意识到RACK_ENV选项,但我并不是唯一一个这样做的人!
我想更新RACK_ENV并迁移到彪马是下一步。