Repository navigation
motor nghttp2
Home > Motor NgHttp2 🚧
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.
| 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.
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 emResposta.Trailers) vai como trailers HTTP/2. É o que o gRPC nativo usa para ogrpc-status. -
Proteções: os limites do nghttp2 contra abusos (reinício rápido de streams, CONTINUATION
infinito) ficam ligados; o
MaxRequestSizedoTRALLimitsPluginé respeitado.
Cliente.EngineType := 'NgHttp2';
Cliente.BaseURL.Text := 'https://servidor:8443'; // https: h2; http: h2c
Cliente.ShareConnection := True;-
Sempre HTTP/2:
https://é h2 (ALPN) ehttp://é 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 osTRALClientdo 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. -
OnReceiveDataentrega o corpo ao vivo; os trailers vêm na resposta (Resposta.Trailers). - TLS: os pins de certificado,
SSL.VerifyeOnValidateServerCertvalem como nos outros motores (HTTPS no cliente).
| 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.
| 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 |
- HTTP/2: o que cada motor faz de HTTP/2, e o cliente.
- gRPC, Resposta em fluxo, Qual motor escolher?.
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar