为什么 Envoy 发送 HTTP/2 重置?
HTTP/2 重置路径主要受 Envoy 用于对 HTTP/2 进行帧处理的编解码器 nghttp2 控制。nghttp2 非常严格地遵守 HTTP/2 规范,但是由于许多客户端并不完全符合规范,这种不匹配会导致意外重置。不幸的是,与调试 内部响应路径 不同,Envoy 对 nghttp2 重置给定流的具体原因的可见性有限。
如果您有可重复的故障情况,可以针对具有“ -l trace”的调试 Envoy 运行它,以获取详细的 nghttp2 错误日志,这些日志通常会指出哪个标头未能通过合规性检查。或者,如果您有能力在遇到错误的机器上使用“ -l trace”运行,则可以查看来自文件“source/common/http/http2/codec_impl.cc”的以下形式的日志 invalid http2: [nghttp2 error detail]
例如: invalid http2: Invalid HTTP header field was received: frame type: 1, stream: 1, name: [content-length], value: [3]
您还可以查看 HTTP/2 统计信息:在 Envoy 重置流的许多情况下(例如,如果标头数量超过配置允许的数量或洪水检测开始),http2 计数器会在流被重置时递增。