Skip to content
mobius1qwe edited this page Nov 12, 2026 · 1 revision

Home > Motor NgHttp2 🚧

Motor NgHttp2 (HTTP/2 próprio)

Important

Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.

Vale para a 2.0 · Delphi e Lazarus, Windows e Linux · Nível: avançado

Em uma frase: servidor e cliente HTTP/2 que rodam nos sockets do próprio RAL, com o enquadramento feito pela biblioteca nghttp2: funciona igual em qualquer sistema e dá trailers de verdade, que o gRPC nativo exige.

Você vai precisar: o pacote NgHttp2RAL, a biblioteca nghttp2 e, para TLS, o OpenSSL 3.

A biblioteca

versão nghttp2 1.59 ou mais nova; recomendada a 1.68.1 ou mais (corrige o CVE-2026-27135)
Linux libnghttp2.so.14
Windows libnghttp2-14.dll (de um build MSYS2 ou vcpkg), ao lado do executável ou no PATH
TLS OpenSSL 3

No servidor, LibraryName aponta outro nome ou caminho; no cliente, é a variável RALNgHttp2ClientLibrary (a unit RALNgHttp2Client), a atribuir antes da primeira chamada.

Servidor: TRALNgHttp2Server

uses RALNgHttp2Server;

Servidor := TRALNgHttp2Server.Create(Self);
Servidor.Port := 8443;
Servidor.SSL.Enabled := True;                 // h2 sobre TLS (ALPN h2)
Servidor.SSL.CertFile := 'cert.pem';
Servidor.SSL.KeyFile := 'key.pem';
Servidor.Active := True;
  • Com SSL.Enabled, é h2 (o ALPN oferece só h2); sem TLS, é h2c com conhecimento prévio (o cliente já começa em HTTP/2).
  • É só HTTP/2: não responde HTTP/1.1 nem aceita Upgrade. Para atender os dois, ponha um proxy na frente, ou use outro motor.
  • O certificado vem de arquivos (CertFile, KeyFile, KeyPassword) ou de texto PEM (CertPEM, KeyPEM); MinVersion é TLS 1.2 por padrão.
propriedade padrão
MaxConcurrentStreams 100 pedidos abertos ao mesmo tempo numa conexão
InitialWindowSize 1 MB janela de controle de fluxo por stream e por conexão
IdleTimeout 120000 ms sem nenhum stream aberto antes do GOAWAY; 0 = nunca
PollThreads 0 threads que vigiam as conexões; 0 = uma por processador
PoolCount 0 threads que executam os pedidos; 0 = quatro por processador
ExecuteInPollThread falso executa o pedido na própria thread que o leu, sem passar a um trabalhador
LibraryName vazio a biblioteca nghttp2 a carregar

ExecuteInPollThread é mais rápido para tratadores curtos, mas um tratador lento trava as outras conexões daquela thread (e um fluxo ao vivo espera nela). Deixe falso se há tratadores que demoram.

O que mais vale neste motor:

  • Fluxo ao vivo: resposta em fluxo sai em quadros DATA à medida que é produzida.
  • Trailers: Resposta.AddTrailer(nome, valor) (lista em Resposta.Trailers) vai como trailers HTTP/2. É o que o gRPC nativo usa para o grpc-status.
  • Proteções: os limites do nghttp2 contra abusos (reinício rápido de streams, CONTINUATION infinito) ficam ligados; o MaxRequestSize do TRALLimitsPlugin é respeitado.

Cliente: EngineType := 'NgHttp2'

Cliente.EngineType := 'NgHttp2';
Cliente.BaseURL.Text := 'https://servidor:8443';   // https: h2; http: h2c
Cliente.ShareConnection := True;
  • Sempre HTTP/2: https:// é h2 (ALPN) e http:// é h2c com conhecimento prévio. Um servidor que não fale HTTP/2 faz a chamada falhar, sem voltar para o 1.1.
  • Com ShareConnection, todos os TRALClient do processo que apontam para o mesmo endereço, porta e política de certificado dividem uma conexão: muitas chamadas de muitas threads viram streams dela.
  • OnReceiveData entrega o corpo ao vivo; os trailers vêm na resposta (Resposta.Trailers).
  • TLS: os pins de certificado, SSL.Verify e OnValidateServerCert valem como nos outros motores (HTTPS no cliente).

Quando usar

Você quer Use
gRPC nativo (gpNative), com trailers este motor nos dois lados
HTTP/2 igual em Windows e Linux, sem depender do http.sys este motor
muitas chamadas pequenas por uma conexão só este motor no cliente
HTTP/1.1 e HTTP/2 na mesma porta outro motor, ou um proxy na frente

Medido num Linux de 12 núcleos, 64 chamadas simultâneas (8 conexões de 8 streams), com FPC: cerca de 139 mil pedidos por segundo com ExecuteInPollThread, e 79 mil com o grupo de trabalhadores. É uma ordem de grandeza, não uma promessa: depende do tratador e da máquina.

Erros comuns

O que acontece Causa O que fazer
não carrega a biblioteca nghttp2 ausente, ou versão abaixo de 1.59 instale a 1.68.1 ou mais; ou ajuste LibraryName
TLS não sobe falta o OpenSSL 3, ou CertFile/KeyFile errados confira as DLLs/.so e os caminhos
um navegador ou curl --http1.1 não conecta o servidor só fala HTTP/2 use curl --http2 (ou --http2-prior-knowledge em h2c)
as outras conexões travam tratador lento com ExecuteInPollThread desligue a opção
pedido grande recusado MaxRequestSize do TRALLimitsPlugin aumente o limite

Veja também

Começar

Servidor

MQTT 🚧

E-mail 🚧

Cliente

Motores

Avançado

Ajuda

🚧 = em desenvolvimento, pode mudar

Clone this wiki locally