【问题标题】:Inconsistent ERR_HTTP2_SERVER_REFUSED_STREAM error on page-load页面加载时出现不一致的 ERR_HTTP2_SERVER_REFUSED_STREAM 错误
【发布时间】:2021-05-15 04:41:32
【问题描述】:

我确实有至少两个 wordpress 网站,它们非常不一致地抛出不同数量的 net::ERR_HTTP2_SERVER_REFUSED_STREAM 错误。当这些错误发生时,抛出的错误数量从页面加载到页面加载(或重新加载)变化很大,从带有该错误的 4 个请求到大约 60 个,有时甚至更多(如果页面有很多请求)。实际受影响的资源/请求似乎完全随机,因此不会留下任何线索。

如果发生这些错误,它们的出现通常会持续存在(在进行简单的页面刷新或硬刷新时),直到重新启动浏览器。很少他们甚至在重新启动后也会留下来。

当这种打嗝确实发生并且浏览器/系统进入这种故障状态时,这些错误也会发生在 wordpress 后端加载基本文件(如.../wp-includes/js/wp-lists.min.js?ver=5.7 和类似文件)中。

至少有两个用户在登录和退出 wordpress 时在 Chrome、Opera 和 Edge 中经历过这种行为。在 Opera 和 Edge 中,我们没有安装任何浏览器扩展。据我们所知,其他用户从未遇到过此问题,尽管其中一些用户多次访问该网站。

这可能是什么原因和/或有什么方法可以解决它?


两个站点上安装的插件列表:


【问题讨论】:

  • 您的站点上是否安装了任何安全插件?一周前我遇到了类似的问题。该网站一起安装了 2 个安全插件,我卸载了其中一个,它为我解决了这个问题。
  • 嗯,我猜这不是经典意义上的安全插件,但我确实安装了密码保护插件(请参阅:Password Protect WordPress Lite 在已安装插件的添加列表中)。使用该插件,我启用了站点范围的保护,因为该站点不供公众访问。 ...在我能够停用插件并检查这是否能解决问题之前,我可能不得不寻找某种替代方法来限制对网站的访问,但我必须澄清这一点。我明天会这样做。 ...感谢您在那个方向上的提示。
  • 次要更新:我们已禁用该插件,不久之后,遇到这些错误的其他用户再次遇到这些错误。但是,因为在停用可能与浏览器/缓存相关的插件后非常直接(?)。 ...除此之外,我们从那时起就没有出现任何错误。由于甚至在停用之前的错误只是看似随意地发生,我们不知道问题是否真的解决了。 ...
  • 更新:禁用“Password Protect WordPress Lite”插件后仍然出现错误。所以在我们的例子中,安全插件不是原因。

标签: wordpress hosting web-hosting http-error


【解决方案1】:

这与 WordPress 无关。它使用 HTTP/2 standard 与 Apache 或 Nginx 相关。

REFUSED_STREAM (0x7):端点在之前拒绝了流 执行任何应用程序处理(参见第 8.1.4 节 详情)。

它可能来自太多并发流:

端点不得超过其对等方设置的限制。一个端点接收到一个导致其通告的并发流限制被超过的 HEADERS 帧必须将其视为 PROTOCOL_ERROR 或 REFUSED_STREAM 类型的流错误(第 5.4.2 节)。错误代码的选择决定了端点是否希望启用自动重试(详见第 8.1.4 节)。

也可以在 Push Response 操作期间发送:

如果客户端出于任何原因确定它不希望接收来自服务器的推送响应,或者如果服务器开始发送承诺响应的时间过长,则客户端可以发送一个 RST_STREAM 帧,使用CANCEL 或 REFUSED_STREAM 代码并引用推送流的标识符。

或者如果客户端尝试使用 HTTP/1.1 进行连接:

不希望处理 HTTP/1.1 响应的服务器应在发送连接前言后立即以 REFUSED_STREAM 错误代码拒绝流 1,以鼓励客户端通过升级的 HTTP/2 连接重试请求。

我无法确定在这些请求期间发生了什么,因为它可能有多种原因,如上所述。

所以我建议你几个选择:

  • 通过 Cloudflare 传递您网站的流量,因此它们充当这些连接的中间人并规范发送到您服务器的请求
  • 您可以增加SETTINGS_MAX_CONCURRENT_STREAMS 以最大程度地降低发送REFUSED_STREAM 的风险。如果你使用 Nginx,你可以在这里看到如何做到这一点:http://nginx.org/en/docs/http/ngx_http_v2_module.html#http2_max_concurrent_streams
  • 如果您不知道如何执行上述操作,请联系您的托管公司并要求他们为您完成并升级您的 Nginx 版本,因为已知某些旧版本存在问题。
  • 在 Nginx 中禁用 HTTP/2。 How to disable http2 in nginx
  • 作为最后的资源,您可以迁移到另一家托管公司。

如果您使用 Apache,我上面所说的一切也适用于它。

【讨论】:

  • 感谢您的回复。由于我们无论如何都不是服务器管理员,因此如果可以进行建议的更改,我们会联系我们的托管公司。在这方面:你知道,如果禁用 HTTP/2 会产生任何副作用(在其他项目上)? ...除了这些建议:如果我理解正确,第三个引用指出错误也可能是由客户端引起的。据我所知,这会更有意义。这是因为在我们看来,并非所有用户都会遇到这些错误,此外,当重新启动浏览器时,这些错误通常会消失。
  • 这不太可能是客户端问题,因为该客户端每次都会发生这种情况。这更有可能是服务器负载问题,例如根据当时处理的流量而断开连接。根据答案中的链接,您可以增加最大并发流数。 HTTP/2 是相当新的技术,降级到 HTTP/1.1 是安全的,这是当今互联网的默认设置。
  • 我建议您在放弃和降级到 HTTP/1.1 之前让您的托管公司调整 Nginx/Apache 设置。
  • @SunnyRed 您是否通过 Cloudflare 传递您的流量?
  • 感谢@SunnyRed 的反馈。我已经更新了答案,将 Cloudflare 作为第一个提议的解决方案。
【解决方案2】:

我确实有至少两个 wordpress 网站,它们非常不一致地抛出不同数量的 net::ERR_HTTP2_SERVER_REFUSED_STREAM 错误。当这些错误发生时,抛出的错误数量从 4 个请求到大约 60 个,有时甚至更多(如果页面有足够的请求),

正如您所说,流错误的计数超过请求。一个可能的解释是流是推送流,它甚至具有流 id。推流由服务器端发起。在对比中,客户端启动的流具有奇数 id。

为什么错误如此重要?

我们按照关键错误词来尝试找到一些路线图。 search key word ERR_HTTP2_SERVER_REFUSED_STREAM in chromium github repo

我们得到以下回复 ERROR_CODE_REFUSED_STREAM。

  • 浏览器处理服务器端流RST帧(SpdySession::OnGoAway)。RST帧意味着关闭流但不关闭会话。 我们可能会收到错误 ERR_HTTP2_SERVER_REFUSED_STREAM

  • 浏览器处理服务器端流 Goway 框架 (SpdySession::OnGoAway)。 Goway 框架意味着闭会。服务器端请求 goway 框架没有任何错误(spdy::ERROR_CODE_NO_ERROR)。 我们可能会收到错误 ERR_HTTP2_SERVER_REFUSED_STREAM

错误计数远远超过请求。所以我们可能会导致阶段性疑虑。
服务器端发送 RST 帧的概率很高。

现在我们继续深入研究。

search key word ERROR_CODE_REFUSED_STREAM in chromium github repo

服务器可能会发送 ERROR_CODE_REFUSED_STREAM 与以下情况:

  • 当会话属性 enable_push_ 关闭时,但尝试创建推送流。
  • 会话状态变为 STATE_GOING_AWAY,但接收推送流
  • 没有“:url”标头的错误推送流
  • 只有 http 方案允许受信任的代理进行跨源推送。如果没有,就被拒绝。
  • 推送的 URL 必须具有 https 方案
  • 证书与推送的 URL 不匹配。
  • 具有相同 url 的重复推送流。
  • ERR_TIMED_OUT 或 ERR_HTTP2_CLIENT_REFUSED_STREAM

有用的工具

使用调试工具获取更多信息。

chrome://net-internals/http2#events

chrome://net-export/

关于服务器推送消息

Chrome to remove server push

【讨论】:

  • 如果我理解正确,我认为我错误地表述了抛出的错误数量和页面请求数量之间的关系。据我观察,错误的数量不超过页面请求的数量。如果发生错误,只是实际的错误数量确实因页面加载而异,并且实际受影响的资源/请求不会留下任何提示,错误原因来自何处。 ...我编辑了问题以试图澄清这一点。 ...感谢实用程序通知/建议。我看了看,并尽量记住它。
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多