為何 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 計數器將會遞增。