ERR_HTTP2_PROTOCOL_ERROR: příčiny a opravy
ERR_HTTP2_PROTOCOL_ERROR znamená, že prohlížeč a server úspěšně vyjednali HTTP/2, ale konkrétní rámec nebo stream ve výměně porušil pravidla protokolu a spojení bylo resetováno. Liší se od selhání TLS: šifrované spojení fungovalo a problém sedí o vrstvu výš, v tom, jak byl utvořen samotný stream HTTP/2.
Co znamená ERR_HTTP2_PROTOCOL_ERROR
HTTP/2 posílá požadavky a odpovědi jako binární rámce přes jedno spojení, s přísnými pravidly pro velikost rámce, kódování hlaviček (HPACK) a stav streamu. Server, proxy nebo CDN, které pošlou poškozený rámec, předimenzovanou hlavičku, nebo rámec pro stream, který je už zavřený, tato pravidla poruší, a klient spojení strhne, místo aby hádal, co se mělo stát. Protože selhání může mít původ na aplikačním serveru, mezilehlé proxy, edge CDN, nebo ve vlastním síťovém stacku prohlížeče, pokrývá tahle chyba širší rozsah kořenových příčin než většina ostatních v tomto seznamu.
Jak se chyba projevuje
Chrome a Edge zobrazí "This page isn't working - ERR_HTTP2_PROTOCOL_ERROR", někdy jen u některých načtení stránky a u jiných ne, což je náznak, že chyba je přerušovaná, ne trvalá špatná konfigurace. Firefox obvykle zobrazí obecnou chybu spojení, aniž by protokol pojmenoval.
curl může HTTP/2 vynutit a ukázat přesně, na kterém rámci spojení selhalo:
curl --http2 -v https://example.com/ 2>&1 | tail -20
...
* Recv failure: Connection reset by peer
* HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
Porovnání s požadavkem HTTP/1.1 na stejnou URL izoluje, jestli je problém specifický pro protokol:
curl --http1.1 -sI https://example.com/
Pokud požadavek HTTP/1.1 uspěje a HTTP/2 selže, chyba je v tom, jak něco v řetězci implementuje HTTP/2, ne v samotné aplikaci.
Co způsobuje ERR_HTTP2_PROTOCOL_ERROR
- Poškozené nebo předimenzované hlavičky od aplikace nebo proxy. Velmi dlouhá cookie, předimenzovaná sada hlaviček odpovědi, nebo hodnota hlavičky obsahující znaky, které HPACK nedokáže zakódovat, poruší velikost rámce, kterou server nebo klient očekává.
- Reverzní proxy nebo load balancer s chybnou nebo zastaralou implementací HTTP/2. Některé starší stacky HTTP/2 v nginx, Apache, nebo na vestavěných zařízeních mají známé problémy s konkrétními sekvencemi rámců pod zátěží.
- Chyba na edge CDN nebo nesoulad protokolu mezi edge a originem. Úsek mezi prohlížečem a edge a úsek mezi edge a originem mohou používat různé protokoly; chyba v překladu mezi nimi občas vyprodukuje tuhle chybu jen u určitých tvarů požadavků.
- Antivirový software nebo rozšíření prohlížeče, které zachytává provoz HTTPS. Stejná třída softwaru, která způsobuje selhání handshake SSL, může rozbít i zdravý stream HTTP/2, pokud jeho vrstva pro zachytávání nemluví HTTP/2 správně.
- Zastaralý prohlížeč se starou implementací HTTP/2, nebo poškozená síťová cache prohlížeče.
- Nesoulad
Content-Lengthza reverzní proxy. Pokud nginx (nebo jiná proxy) předá odpověď, jejíž deklarovanýContent-Lengthneodpovídá skutečně poslaným bajtům, může se navazující rámcování HTTP/2 uprostřed rozbít.
Jak zjistit, čí je to chyba
Spusťte HTTP kontrolu z několika míst: pokud je selhání konzistentní všude, na vině je zpracování HTTP/2 na serveru nebo CDN. Pokud selhává jen u vás, je mnohem pravděpodobnější lokální příčina, prohlížeč, antivirus, nebo síťové zařízení mezi vámi a webem.
Jak opravit ERR_HTTP2_PROTOCOL_ERROR
Pokud jste návštěvník
- Načtěte stránku znovu. Protože příčinou bývá spíš jeden poškozený rámec než trvalá špatná konfigurace, nové spojení často uspěje.
- Vymažte cache prohlížeče na
chrome://settings/clearBrowserData, protože poškozený cachovaný zdroj může tohle při opětovném načtení spustit. - Dočasně vypněte skenování HTTPS/SSL v antiviru a zkuste to znovu; tahle třída softwaru je běžnou a často přehlíženou příčinou.
- Zkuste anonymní okno, abyste vyloučili rozšíření.
- Aktualizujte prohlížeč na nejnovější verzi, protože starší klientské implementace HTTP/2 měly známé chyby.
Pokud web provozujete
- Porovnejte HTTP/2 s HTTP/1.1 pomocí příkazů curl výše. Pokud selhává jen HTTP/2, problém je ve vrstvě HTTP/2 proxy nebo CDN, ne v aplikaci.
- Zvyšte limity velikosti hlaviček v nginx, pokud jsou zapojené velké cookies nebo hlavičky:
Po změně nginx restartujte nebo znovu načtěte a otestujte znovu.http2_max_field_size 16k; http2_max_header_size 32k; large_client_header_buffers 4 16k; - Zkontrolujte nesoulad
Content-Lengthmezi tím, co posílá aplikace, a tím, co předává proxy; zapněte bufferování proxy (proxy_buffering on;), aby nginx mohl přečíst celou odpověď, než ji zarámuje pro HTTP/2. - Aktualizujte nginx, Apache, nebo jakýkoli load balancer na aktuální verzi; chyby ve zpracování rámců HTTP/2 jsou přesně to, co se opravuje v drobných vydáních.
- Vypněte HTTP/2 jako diagnostický test, ne trvalou opravu: dočasně odeberte
http2z direktivylistenv nginx. Pokud chyby přestanou, je potvrzeno, že chyba je konkrétně ve vrstvě HTTP/2, a znovu ho zapnete, jakmile bude hotová oprava hlaviček nebo bufferování výše. - Zkontrolujte logy na straně CDN, pokud nějaká sedí před originem; většina CDN zobrazuje chyby rámcování HTTP/2 ve svých edge logách s podrobnějšími informacemi, než jaké kdy ukáže prohlížeč.
Související chyby
- ERR_SSL_PROTOCOL_ERROR vypadá podobně, ale selže dřív, během TLS handshake, ještě předtím, než se vymění jakýkoli rámec HTTP/2.
- Chybové kódy serveru 5xx pokrývají případy, kdy spojení a protokol fungují v pořádku, ale selže samotná aplikace.
Jeden detail stojí za oddělení: chyba protokolu HTTP/2 není totéž co stream HTTP/2, který aplikace čistě resetovala, například když klient uprostřed zruší požadavek. Vývojářské nástroje prohlížeče a přístupové logy serveru občas označí obojí jako "reset", ale ERR_HTTP2_PROTOCOL_ERROR v prohlížeči vyprodukuje jen skutečné porušení rámcování; záměrně zrušený stream jednoduše skončí bez chybové stránky.
Jak předejít ERR_HTTP2_PROTOCOL_ERROR
Protože tahle chyba bývá často přerušovaná, vázaná na konkrétní velikosti hlaviček nebo konkrétní verze proxy, může postihovat zlomek návštěvníků celé týdny, než si toho někdo všimne jako vzoru. HTTP kontrola běžící podle plánu z více míst zachytí rostoucí míru selhání hned po nasazení, změně CDN, nebo upgradu proxy, místo aby se spoléhala na roztroušená hlášení uživatelů. HostTracker upozorní e-mailem, SMS, hlasovým hovorem, přes Slack, Telegram a další, jakmile kontrola začne selhávat.
Často kladené otázky
Je ERR_HTTP2_PROTOCOL_ERROR totéž jako chyba SSL?
Ne. Tahle chyba nastává poté, co TLS uspěje, ve vrstvě rámcování HTTP/2. Chyba SSL znamená, že se šifrované spojení vůbec nevytvořilo.
Proč se chyba objevuje jen někdy, ne při každém načtení stránky?
Většinu příčin tady spouští konkrétní podmínky, hlavička, která přeroste limit, souběh v proxy pod zátěží, konkrétní cachovaný zdroj, ne pevná špatná konfigurace, která selže pokaždé.
Poškodí vypnutí HTTP/2 na mém serveru výkon?
HTTP/2 nabízí skutečné výhody (multiplexing, komprese hlaviček), takže jeho vypnutí berte jako dočasný diagnostický krok, ne trvalou opravu. Opravte základní problém s velikostí hlaviček nebo bufferováním a znovu ho zapněte.
Může tohle způsobit CDN, i když je můj origin v pořádku?
Ano. Edge CDN a origin mohou na každém úseku spojení používat jiný protokol, a chyba nebo špatná konfigurace v tom, jak mezi nimi CDN překládá, může vyprodukovat tuhle chybu nezávisle na zdraví samotného originu.
Stává se tohle i na webech s HTTP/1.1?
Ne, ERR_HTTP2_PROTOCOL_ERROR je specifické pro spojení, která vyjednala HTTP/2. Web obsluhující jen HTTP/1.1 tuhle konkrétní chybu vyprodukovat nemůže, i když může mít vlastní problémy se spojením.