Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 网页资源请求在Chrome中暂停了近一分钟_Amazon Web Services_Google Chrome_Http - Fatal编程技术网

Amazon web services 网页资源请求在Chrome中暂停了近一分钟

Amazon web services 网页资源请求在Chrome中暂停了近一分钟,amazon-web-services,google-chrome,http,Amazon Web Services,Google Chrome,Http,我的webapp上的资源在长时间暂停后需要将近一分钟才能加载。这种情况经常发生。如下图所示,此页面上只有3个请求实际命中服务器本身,其余请求命中内存或磁盘缓存。这个问题似乎只发生在Chrome上,Safari和Firefox都没有表现出这种行为 我已经在这个SO问题中实现了缓存控制:no store建议,但问题仍然存在 下面还提供了一个示例,说明了最终收到响应后的情况 我的应用程序托管在AWS的网络负载均衡器后面,该网络负载均衡器代理运行nginx的EC2实例和应用程序本身 你知道这是什么原因吗

我的webapp上的资源在长时间暂停后需要将近一分钟才能加载。这种情况经常发生。如下图所示,此页面上只有3个请求实际命中服务器本身,其余请求命中内存或磁盘缓存。这个问题似乎只发生在Chrome上,Safari和Firefox都没有表现出这种行为

我已经在这个SO问题中实现了
缓存控制:no store
建议,但问题仍然存在

下面还提供了一个示例,说明了最终收到响应后的情况

我的应用程序托管在AWS的网络负载均衡器后面,该网络负载均衡器代理运行nginx的EC2实例和应用程序本身

你知道这是什么原因吗


我认为有两件事可能导致延误:

1)CDN的使用
如果加载缓慢的资源是从CDN(内容交付网络)加载的,则应尝试将其下载到服务器并直接交付。
特别是如果您使用http2,这可以显著提高速度,但使用http1也是如此。我没有AWS方面的经验,因此我不知道默认情况下如何在那里提供服务。
如果资源是从CDN加载的,那么在您的屏幕截图中不会显示得很清楚,但是因为它是关于脚本的,所以我认为这是一个合理的假设

2)Chrome的资源调度程序 一般说明:
这篇文章发表后,该计划程序可能已经更改,甚至可能已经更改,但至少显示在您的屏幕截图中。
我认为,如果您在和chrome web工具的帮助下优化页面,您可以解决调度程序的任何问题,但也可以解决与速度有关的其他问题,也许还有其他问题。以下是链接:

编辑
3)代理问题

一般来说,chrome可能会因为代理服务器而出现问题或延迟。在锁定日志文件之前无法了解详细信息,也许您必须调整日志文件甚至已生成,并且日志级别足以告诉您任何问题(级别
警告
,甚至
信息
)。

在监视chrome net导出日志之后,似乎我遇到了这个问题:


但是我仍然没有解决这个问题的办法

我遇到了完全相同的问题。我们使用弹性Beanstalk和网络负载均衡器(NLB),TLS终端位于NLB

我从AWS支持部门得到的反馈是:

当客户端连接到网络负载平衡器上的TLS侦听器并且在完成TLS握手后不立即发送数据时,可能会发生此问题。根本原因是处理新连接时出现了边缘问题。请注意,仅当TLS侦听器的目标组配置为使用TCP协议而未启用代理协议v2时,才会发生这种情况

他们正在努力解决这个问题。 不知何故,只有在使用Chrome浏览器时才能注意到这个问题

同时,您有以下两个解决方案:

  • 在目标组或服务器上启用代理协议v2
  • 将目标组配置为使用TLS协议将流量路由到目标

    • 我知道这是一个迟来的答案,但我是为寻求解决方案的人写的

      TL;DR:在我的例子中,启用NLB的
      跨区域负载平衡
      属性解决了问题


      通过使用WireShark进行调查,我发现Chrome使用的是两个不同的IPv4地址。 向其中一个发送数据包总是成功的,而向另一个发送数据包总是失败的。 实际上,这两个地址代表了两个可用性区域

      默认情况下,如果选择NLB,则禁用跨区域负载平衡(相反,默认情况下启用ALB的相同属性)。 假设有两个AZ;AZ-1/AZ-2。 将两个AZ连接到NLB时,每个AZ都有一个节点

      属于AZ-1的节点只是将流量路由到同样属于AZ-1的实例。AZ-2实例被忽略。 我的普通应用程序(托管在Fargate上)在AZ-2中只有一个应用服务器(ECS任务),因此AZ-1中的NLB节点无法将流量路由到任何地方

      我不熟悉TCP/IP或浏览器实现,但据我所知,您的浏览器会在DNS查找后以某种方式选择实际的IP地址。 如果在上述情况下选择了AZ-2节点,则一切正常,但如果选择了AZ-1,则浏览器将开始暂停。 也许Chrome有一个随机选择ip的策略,而Safari或Firefox有一个粘性策略,所以问题只出现在Chrome上

      启用跨区域负载平衡后,AZ-2上的ECS任务可以从AZ-1 NLB节点看到,并且在Chrome浏览器上也可以正常工作


      (请随时纠正我的英语不好。谢谢!)

      为什么有两个对同一资源的请求?如果您的浏览器只发送有问题的请求,您是否可以检查是否出现此问题?EC2实例上的“网络”类型负载平衡器和nginx存在完全相同的问题。直接访问同一实例时没有问题。已将每页请求的资源数降至6以下,但没有帮助。在Firefox浏览器上没有这样的问题。我在回答中添加了一部分,我认为最好是使用我链接的工具优化页面,但是检查服务器和代理的日志也会有所帮助。除此之外,我认为绕过你迄今为止得到的唯一答案是相当奇怪的——一般来说,一些问题是通过对话解决的,而不是忽视——对不起,只有我的2美分。