[Editor: agora o NGINX oferece suporte oficial a HTTP/3 com QUIC. Ele está disponível como parte da versão principal NGINX 1.25.1 para usuários da versão de código aberto e do NGINX Plus R30 para clientes empresariais.]
[ngx_snippet name=’table-style-blog’]
Temos o prazer de anunciar que nossa implementação de prévia do suporte do NGINX a QUIC+HTTP/3 já está disponível como pacotes binários pré-compilados para duas distribuições:
- Red Hat Enterprise Linux 9 e variantes com compatibilidade binária
- Ubuntu 22.04
Os binários são a versão mais recente disponibilizada pela ramificação quic do repositório separado nginx-quic, que hospeda a implementação de prévia. Como tem sido desde que começamos a trabalhar com QUIC+HTTP/3 no NGINX, você ainda pode baixar e compilar o NGINX Open Source com QUIC+HTTP/3 e escolher entre bibliotecas SSL/TLS compatíveis com QUIC. Embora o código seja classificado como experimental, vários membros da comunidade relataram que estão usando o nginx-quic com sucesso em produção.
Nossa principal motivação para disponibilizar binários pré-compilados é tornar os testes do NGINX com QUIC+HTTP/3 mais rápidos e fáceis. Os binários eliminam a necessidade de compilar a partir do código-fonte e podem ser instalados usando ferramentas padrão de gerenciamento de pacotes.
No momento da redação deste texto, o padrão de fato para SSL/TLS de código aberto, o OpenSSL, não oferece suporte a QUIC. Por isso, compilamos as distribuições binárias com um pacote da biblioteca quictls, que é instalado automaticamente como uma dependência. Escolhemos o quictls porque, atualmente, ele oferece a melhor combinação de estabilidade, compatibilidade e recursos.
As instruções de instalação da distribuição binária estão disponíveis no site do NGINX QUIC.
Configurando o NGINX para QUIC+HTTP/3
Há várias novas diretivas para configurar o NGINX para QUIC+HTTP/3, mas é fácil combiná-las com diretivas para HTTP/1.1 e HTTP/2 nos blocos de configuração de servidor virtual (server{}) existentes.
Para obter a configuração funcional mais básica, basta incluir três diretivas no bloco server{} (e no bloco filho location{}):
| Diretiva | Descrição |
|---|---|
listen 443 quic reuseport; | Adicione uma nova diretiva O parâmetro |
ssl_protocols TLSv1.3; | Inclua o TLS 1.3 na lista de protocolos aceitos, conforme exigido pelo QUIC. (Essa diretiva provavelmente já existe na configuração, mas adicione-a se necessário.) Para oferecer suporte a todos os navegadores, provavelmente também será necessário incluir versões anteriores do TLS. Para obter informações sobre a compatibilidade dos navegadores com o TLS 1.3, consulte Posso usar o TLS 1.3? |
add_header Alt-Svc 'h3=":$server_port"; ma=86400'; | Inclua essa diretiva para que o NGINX adicione um cabeçalho de resposta informando ao navegador que uma atualização para QUIC está disponível e em qual porta ele deve se conectar. Por convenção, a porta (representada aqui pela variável O valor de |
Veja um exemplo de bloco server{}:
server { # for better compatibility we recommend
# using the same port number for QUIC and TCP
listen 443 quic reuseport; # QUIC
listen 443 ssl; # TCP
ssl_certificate certs/example.com.crt;
ssl_certificate_key certs/example.com.key;
ssl_protocols TLSv1.3;
location / {
# advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
#proxy_pass <upstream_group>;
#root /<root_directory>;
}
}Há várias novas diretivas e variáveis opcionais relacionadas ao HTTP/3 (não mostradas no trecho), incluindo as seguintes:
$http3– (Variável) Definida comoh3quando a solicitação é enviada durante uma sessão HTTP/3 (caso contrário, é uma string vazia).quic_retry– (Diretiva) Quando definida comoon, instrui o NGINX a enviar ao solicitante uma mensagem de repetição do QUIC, especificando o novo ID de conexão a ser usado para validar o endereço IP do solicitante. O pacote de repetição do QUIC compensa parcialmente o fato de que um handshake de conexão TCP de três vias não pode ser usado para validar a conexão, pois o QUIC é executado sobre UDP.ssl_early_data– (Diretiva) Quando definida comoon, instrui o NGINX a aceitar dados da aplicação na primeira solicitação enviada por um cliente por meio de uma nova conexão TLS 1.3, caso esse cliente já tenha estabelecido uma conexão anteriormente. Isso é conhecido como retomada de conexão com zero viagens de ida e volta (0‑RTT). O suporte ao envio de “dados antecipados” é um recurso do TLS 1.3 e contribui para melhorar o desempenho do QUIC+HTTP/3, eliminando as trocas adicionais de mensagens de ida e volta necessárias para um handshake TLS.Observação: a retomada de conexão 0‑RTT pode representar um risco à segurança, pois os dados antecipados estão sujeitos a ataques de repetição caso incluam um método de solicitação HTTP diferente deGET. Para obter detalhes, consulte a seção sobre TLS 1.3 em Apresentando o NGINX Plus R17 no nosso blog.
O diagrama destaca como a retomada de conexão 0‑RTT com QUIC+HTTP/3 melhora o desempenho, pois o cliente pode enviar uma solicitação HTTP em sua primeira mensagem ao retomar uma conexão QUIC com o NGINX. Em contrapartida, no caso de TCP com TLS, o cliente precisa realizar um novo handshake TLS com o NGINX para estabelecer uma conexão segura, ao custo de várias viagens de ida e volta adicionais.

Para obter informações sobre todas as novas diretivas e variáveis, consulte a seção 3. Configuração do README do nginx-quic.
Testando o NGINX com QUIC+HTTP/3
Como mencionado anteriormente, uma das nossas motivações para disponibilizar binários pré-compilados é facilitar os testes para verificar se o NGINX está processando corretamente o tráfego HTTP/3. Para testes simples pela linha de comando, você pode compilar o curl com suporte a HTTP/3 ou usar um contêiner pré-compilado. Além disso, as versões mais recentes da maioria dos navegadores são compatíveis com QUIC+HTTP/3.
Para verificar se o seu site habilitado para QUIC está atendendo às solicitações de conexão HTTP/3 dos navegadores, você pode usar as ferramentas de desenvolvedor do navegador para examinar os cabeçalhos HTTP retornados pelo NGINX. A implementação de QUIC+HTTP/3 está funcionando corretamente se o NGINX incluir o cabeçalho Alt-Svc mencionado acima em sua resposta à solicitação HTTP inicial do navegador via TCP.
Nesse ponto, um navegador compatível com QUIC estabelece uma conexão QUIC na porta especificada na diretiva Alt-Svc, e as solicitações e respostas HTTP subsequentes são transmitidas por QUIC. Outra forma de verificar se QUIC+HTTP/3 está sendo usado é incluir outra diretiva add_header para definir o valor de um cabeçalho HTTP personalizado como o protocolo capturado pela variável $server-protocol. Você pode acompanhar o valor do cabeçalho à medida que ele muda de HTTP/1.x antes do estabelecimento da conexão QUIC para HTTP/3.0 quando o QUIC está sendo usado.
Veja um exemplo de bloco location em que o cabeçalho HTTP personalizado é X-protocol:
location / { # advertise that QUIC is available on the configured port
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
# signal whether we are using QUIC+HTTP/3
add_header X-protocol $server_protocol always;
#proxy_pass <upstream_group>;
#root /<root_directory>;
}Como alternativa, existem ferramentas como a extensão HTTP Indicator para o Chrome, que indicam visualmente o protocolo em uso. (Observe que isso não constitui um endosso a nenhuma extensão de navegador, e você deve avaliar se as possíveis implicações de segurança de uma extensão são aceitáveis para as suas circunstâncias).
Próximos passos
Continuaremos desenvolvendo nossa solução para QUIC+HTTP/3 e apresentaremos mais exemplos de otimizações do NGINX nas próximas semanas. Enquanto isso, compartilhe os resultados dos seus próprios testes para nos ajudar a tomar decisões. Você pode enviar seus comentários pela lista de discussão de desenvolvimento do NGINX e pelo canal #quic‑http3 no Slack da comunidade NGINX.
Para receber atualizações sobre nosso trabalho com QUIC+HTTP/3, incluindo o próximo marco importante – a integração do repositório nginx-quic à ramificação mainline do NGINX Open Source –, inscreva-se na lista de e-mails de anúncios do NGINX.
Assista ao webinar
Também recomendamos que você participe do nosso próximo webinar, Prática com NGINX e QUIC+HTTP/3 na quarta-feira, 19 de abril de 2023:
- América do Norte – 10h (PST)
- EMEA – 11h00 CET
- APCJ – 10h SGT
Sobre o autor

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
Descubra como o F5 NGINX One aprimora o gerenciamento e a observabilidade de ambientes híbridos e multicloud ao oferecer um console web centralizado baseado em SaaS, com insights em tempo real, conformidade automatizada e gerenciamento simplificado de configurações.

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa
Descubra como transformar uma definição de esquema OpenAPI em uma configuração NGINX totalmente funcional, operando como um API Gateway com a segurança de um Web Application Firewall e um Portal do Desenvolvedor, usando uma abordagem declarativa de API.

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor
Picos de tráfego e sobrecarga de servidores são preocupações sérias para varejistas online em qualquer época, mas especialmente durante a “Cyber Season” de compras de fim de ano. Detalhamos como você pode aproveitar as soluções de entrega de aplicações de nível de produção da NGINX para se preparar para aumentos repentinos de tráfego.

Distribuição segura de chaves privadas SSL com o NGINX
Descrevemos três maneiras progressivamente mais seguras de proteger chaves privadas SSL ao configurar o NGINX para processar tráfego HTTPS: permitir acesso de leitura apenas ao usuário root, criptografar as chaves com senhas armazenadas separadamente e distribuir as senhas a partir de um repositório central.
Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX
O módulo JavaScript do NGINX lançado com o NGINX Plus R15 oferece suporte a subsolicitações, possibilitando uma classe totalmente nova de casos de uso para o NGINX Plus. Este exemplo completo também usa a API do NGINX Plus e os módulos de chave-valor para converter solicitações de API dos clientes em solicitações separadas para as APIs dos microsserviços que compõem um aplicativo.
Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus
Confira dicas para evitar o esgotamento de portas efêmeras com ajustes no kernel do Linux, conexões keepalive e conexões vinculadas dinamicamente a endereços IP locais.