启用 http2 模块后 Chrome 请求将永远挂起

启用 http2 模块后 Chrome 请求将永远挂起

我有一个 centos 7,带有定制的新 httpd(2.4.46)。

当 http/2 协议的模块加载后,在 chrome 浏览器中 - 并且仅在 chrome 浏览器中 - 如果我点击托管在 centos 服务器上的 API 页面上的刷新按钮,那么在 4-5 次快速点击后,请求状态将变为“待处理”并永远保持这种状态。

如果我进入隐身模式并以不同的用户身份登录,我会收到来自 API 的响应。如果我尝试以同一用户身份在隐身模式下发送请求 - 即使是使用登录令牌登录,请求也会永远处于待处理状态。

当我检查服务器的 access_log 时,我可以看到其中的请求,但没有一个请求处于待处理状态。

如果我让用户像这样卡住,然后在 Firefox 上尝试向该用户发出请求,我首先会得到一些请求的响应,但随后它也会停止响应,并且在邮递员中也会发生同样的情况。

我无法在邮递员中发起这个问题。

等了一会儿后——我花了一些时间试图找到一些解决方案,大概花了 10-20 分钟——我发现,如果我在 postman 和 Firefox 中重新发送请求,我会得到他们的响应,然后在我发送 4-5 个请求后它又卡在那里。与此同时,chrome 仍然卡在请求上。

在 wireshark 中,我看到的是,chrome 中的请求卡住后,它会每隔约 45 秒发送一个 TCP 保持活动包并接收确认包。我在 Postman 和 Firefox 上看不到同样的情况。

httpd 使用 mpm 事件模块。Firefox 通过 TLSv1.2 进行通信,chrome 和 postman 使用 TLSv1.3。

如果我禁用 http2 模块,chrome 仍会按预期使用 TLSv1.3 而不会出现任何问题。

API 应该没问题,它在过去 6-7 年里一直被使用,以前从未出现过此问题。另一方面,Httpd 最近编译时支持 TLSv1.3 和 http/2。

所以问题是,如何在不关闭模块的情况下解决这个问题?

[笔记] 我认为没有人能够快速给出答案,特别是因为有太多未知数,但如果我有任何其他深入研究这个问题的想法,那也会非常有帮助。

相关内容