ERR_HTTP2_PROTOCOL_ERROR: causas e como corrigir
ERR_HTTP2_PROTOCOL_ERROR significa que o navegador e o servidor negociaram HTTP/2 com sucesso, mas um quadro ou stream específico dentro da troca violou as regras do protocolo e a conexão foi derrubada. É diferente de uma falha de TLS: a conexão criptografada funcionou, e o problema está uma camada acima, na forma como o próprio stream HTTP/2 foi montado.
O que significa ERR_HTTP2_PROTOCOL_ERROR
O HTTP/2 envia requisições e respostas como quadros binários numa única conexão, com regras rígidas de tamanho de quadro, codificação de cabeçalhos (HPACK) e estado de stream. Um servidor, proxy ou CDN que envia um quadro malformado, um cabeçalho grande demais, ou um quadro para um stream que já está fechado quebra essas regras, e o cliente derruba a conexão em vez de tentar adivinhar o que era pretendido. Como a falha pode se originar no servidor da aplicação, num proxy intermediário, na borda de um CDN ou na própria pilha de rede do navegador, esse erro cobre uma variedade maior de causas do que a maioria dos outros desta lista.
Como o erro aparece
Chrome e Edge mostram "Esta página não está funcionando - ERR_HTTP2_PROTOCOL_ERROR", às vezes só em alguns carregamentos e não em outros, o que é um indício de que a falha é intermitente em vez de uma configuração fixa. O Firefox costuma mostrar um erro de conexão genérico, sem nomear o protocolo.
O curl pode forçar HTTP/2 e mostrar exatamente em qual quadro a conexão falhou:
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)
Comparar isso com uma requisição HTTP/1.1 para a mesma URL isola se o problema é específico do protocolo:
curl --http1.1 -sI https://example.com/
Se a requisição HTTP/1.1 funciona e a HTTP/2 falha, a falha está em como algo na cadeia implementa o HTTP/2, não na aplicação em si.
O que causa o ERR_HTTP2_PROTOCOL_ERROR
- Cabeçalhos malformados ou grandes demais vindos da aplicação ou de um proxy. Um cookie muito longo, um conjunto de cabeçalhos de resposta grande demais, ou um valor de cabeçalho com caracteres que o HPACK não consegue codificar violam o tamanho de quadro que o servidor ou o cliente esperam.
- Um proxy reverso ou balanceador de carga com uma implementação de HTTP/2 com bugs ou desatualizada. Algumas pilhas de HTTP/2 mais antigas do nginx, do Apache ou de dispositivos embarcados têm problemas conhecidos com sequências específicas de quadros sob carga.
- Um bug na borda do CDN ou um desencontro de protocolo entre a borda e a origem. O trecho navegador-até-a-borda e o trecho borda-até-a-origem podem usar protocolos diferentes; um bug na tradução entre eles às vezes produz esse erro só para determinados formatos de requisição.
- Antivírus ou uma extensão do navegador que intercepta o tráfego HTTPS. O mesmo tipo de software que causa falhas de handshake SSL também pode quebrar um stream HTTP/2 saudável se sua camada de interceptação não falar HTTP/2 corretamente.
- Um navegador desatualizado com uma implementação antiga de HTTP/2, ou um cache de rede do navegador corrompido.
- Um desencontro de
Content-Lengthatrás de um proxy reverso. Se o nginx (ou outro proxy) encaminha uma resposta cujoContent-Lengthdeclarado não bate com os bytes realmente enviados, a estrutura de quadros HTTP/2 mais adiante pode quebrar no meio do caminho.
Como saber de quem é a culpa
Rode uma verificação HTTP a partir de vários locais: se a falha é consistente em todo lugar, a falha está no tratamento de HTTP/2 do servidor ou do CDN. Se falha só com você, é bem mais provável que seja algo local, um navegador, um antivírus, ou um dispositivo de rede entre você e o site.
Como corrigir o ERR_HTTP2_PROTOCOL_ERROR
Se você é o visitante
- Recarregue a página. Como a causa costuma ser um único quadro malformado e não uma configuração persistente, uma conexão nova frequentemente funciona.
- Limpe o cache do navegador em
chrome://settings/clearBrowserData, já que um recurso cacheado corrompido pode disparar isso ao recarregar. - Desative temporariamente a inspeção HTTPS/SSL do antivírus e tente de novo; esse tipo de software é uma causa comum e muitas vezes ignorada.
- Tente uma janela anônima para descartar uma extensão.
- Atualize o navegador para a versão mais recente, já que implementações de cliente HTTP/2 mais antigas tinham bugs conhecidos.
Se você administra o site
- Compare HTTP/2 com HTTP/1.1 usando os comandos curl acima. Se só o HTTP/2 falha, o problema está na camada de HTTP/2 de um proxy ou CDN, não na aplicação.
- Aumente os limites de tamanho de cabeçalho do nginx se cookies ou cabeçalhos grandes estiverem envolvidos:
Reinicie ou recarregue o nginx depois da mudança e teste de novo.http2_max_field_size 16k; http2_max_header_size 32k; large_client_header_buffers 4 16k; - Verifique um desencontro de
Content-Lengthentre o que a aplicação envia e o que o proxy encaminha; ative o buffering do proxy (proxy_buffering on;) para que o nginx consiga ler a resposta completa antes de montar os quadros HTTP/2. - Atualize o nginx, o Apache ou qualquer balanceador de carga para uma versão atual; bugs de tratamento de quadros HTTP/2 são o tipo de coisa que se corrige em versões menores.
- Desative o HTTP/2 como teste de diagnóstico, não como correção definitiva: remova
http2da diretivalistendo nginx temporariamente. Se os erros pararem, fica confirmado que a falha está especificamente na camada de HTTP/2, e você pode reativá-lo assim que a correção de cabeçalho ou buffering acima estiver aplicada. - Verifique os logs do lado do CDN se houver um na frente da origem; a maioria dos CDNs mostra erros de estrutura HTTP/2 nos logs de borda com mais detalhe do que o navegador jamais mostra.
Erros relacionados
- ERR_SSL_PROTOCOL_ERROR parece parecido mas falha mais cedo, durante o handshake TLS, antes de qualquer quadro HTTP/2 ser trocado.
- Códigos de erro de servidor 5xx cobrem casos em que a conexão e o protocolo funcionam bem, mas a própria aplicação falha.
Um detalhe que vale a pena separar: um erro de protocolo HTTP/2 não é o mesmo que um stream HTTP/2 encerrado de forma limpa pela aplicação, por exemplo quando um cliente cancela uma requisição no meio do caminho. As ferramentas de desenvolvedor do navegador e os logs de acesso do servidor às vezes rotulam os dois como "reset", mas só uma violação genuína de estrutura produz ERR_HTTP2_PROTOCOL_ERROR no navegador; um stream cancelado intencionalmente simplesmente para, sem uma página de erro.
Como prevenir o ERR_HTTP2_PROTOCOL_ERROR
Como esse erro costuma ser intermitente, ligado a tamanhos específicos de cabeçalho ou a versões específicas de proxy, ele pode afetar uma fração dos visitantes por semanas antes que alguém perceba um padrão. Uma verificação HTTP rodando em intervalos regulares a partir de vários locais detecta uma taxa de falha crescente logo após um deploy, uma mudança de CDN ou uma atualização de proxy, em vez de depender de relatos esparsos de usuários. A HostTracker avisa por e-mail, SMS, chamada de voz, Slack, Telegram e outros canais assim que uma verificação começa a falhar.
Perguntas frequentes
O ERR_HTTP2_PROTOCOL_ERROR é o mesmo que um erro de SSL?
Não. Esse erro acontece depois que o TLS já teve sucesso, na camada de estrutura do HTTP/2. Um erro de SSL significa que a conexão criptografada em si nunca se formou.
Por que o erro aparece só às vezes, não em todo carregamento de página?
A maioria das causas aqui é disparada por condições específicas, um cabeçalho que cresce além de um limite, uma disputa numa proxy sob carga, um recurso cacheado em particular, em vez de uma configuração fixa que falha sempre.
Desativar o HTTP/2 no meu servidor vai prejudicar o desempenho?
O HTTP/2 traz benefícios reais (multiplexação, compressão de cabeçalhos), então trate desativá-lo como um passo de diagnóstico temporário, não como correção definitiva. Corrija o problema de tamanho de cabeçalho ou buffering por trás e reative-o.
Um CDN pode causar isso mesmo que meu servidor de origem esteja bem?
Sim. A borda do CDN e a origem podem usar protocolos diferentes em cada trecho da conexão, e um bug ou má configuração na forma como o CDN traduz entre eles pode produzir esse erro independentemente da saúde da origem.
Isso acontece em sites que só usam HTTP/1.1?
Não, o ERR_HTTP2_PROTOCOL_ERROR é específico de conexões que negociaram HTTP/2. Um site que serve só HTTP/1.1 não pode produzir esse erro em particular, embora possa ter seus próprios problemas de conexão.