本指南涵盖常见的 HTTP/2 与 HTTP/3 问题,包括源站不兼容、多路复用错误和浏览器错误,并提供诊断与解决步骤。
- 源站的
max_concurrent_streams在握手过程中协商。 - 如果收到
GOAWAY(0),很可能是由于服务器重启或其他原因导致服务器拒绝新的流。 - 更多信息请参阅 RFC 9113 - SETTINGS_MAX_CONCURRENT_STREAMS ↗。
- 多路复用问题可能由不正确的服务器配置引起。
- 使用 netlogs ↗ 识别
SETTINGS_MAX_CONCURRENT_STREAMS违规或意外的GOAWAY帧。 - 更多信息请参阅 Stream Concurrency Issues ↗。
常见浏览器错误包括:
ERR_HTTP2_PROTOCOL_ERRORERR_HTTP3_PROTOCOL_ERRORERR_QUIC_PROTOCOL_ERROR
这些错误并不一定表示协议级问题。请按以下步骤操作:
- 尝试使用 HTTP/1.1 复现。
- 如果问题在 HTTP/1.1 中仍然存在,请先解决底层错误,再测试 HTTP/2 或 HTTP/3。
- 如果问题不再出现,请分析 netlog,查找 HTTP/2 或 HTTP/3 特有的问题。
更多信息请参阅 Chromium URL Request Header ↗。
如果问题仅在 Chrome 通过 HTTP/3 时复现,而禁用 HTTP/3 后消失,则问题可能与浏览器端的 QUIC 处理有关,而非您的源站服务器。这是已知的 Chrome 问题(crbug.com/41161335 ↗)——Cloudflare 的 QUIC 实现并非原因。
症状可能包括:
- 大文件下载意外卡住。
- 含有大量并发请求的页面挂起一到三分钟后失败。
- 连接停止进展后,Chrome 报告
ERR_QUIC_PROTOCOL_ERROR或ERR_HTTP3_PROTOCOL_ERROR。 - 问题在 Firefox 或 Safari 中无法复现。
- 在
chrome://flags中禁用 QUIC 后问题消失。
- 暂时为该 zone 禁用 HTTP/3。
- 再次通过 HTTP/2 测试同一请求。
- 如果问题在 HTTP/2 上消失,请为 Chrome 捕获 NetLog 并比较行为。
立即测试: 在 Chrome 中,前往 chrome://flags,搜索 "QUIC",将其设置为 Disabled,然后重新启动 Chrome。
如果问题仅限于特定主机名,可以应用更有针对性的变通方法:创建 Response Header Modification Transform Rule,为受影响的主机名移除 Alt-Svc 标头。
- 在 Cloudflare 仪表板中,前往 Rules(规则) Overview(概览) 页面。
- 选择 Create rule(创建规则) > Response Header Transform Rule(响应头转换规则)。
- 将匹配表达式设置为您的主机名:
(http.host eq "example.com")。 - 在 Modify response header(修改响应头) 下,选择 Remove(移除),并将标头名称输入为
Alt-Svc。
这会强制 Chrome 对该主机名使用 HTTP/2,而无需全局禁用 HTTP/3。不过,经过代理的主机名也可能通过生成的 HTTPS 记录通告 HTTP/3,因此在排查期间,为该 zone 禁用 HTTP/3 是强制使用 HTTP/2 的最可靠方式。
更改 Alt-Svc 后请注意,浏览器可能会将通告的替代服务缓存最长 24 小时。