BLOG | NGINX

Pacotes binários agora disponíveis para a pré-visualização da implementação do QUIC+HTTP/3 pelo NGINX

NGINX-Parte-de-F5-horiz-preto-tipo-RGB
Robert Haynes Miniatura
Robert Haynes
Publicado em 08 de fevereiro de 2023

[ Editor : O NGINX agora suporta oficialmente HTTP/3 com QUIC. Ele está disponível como parte da versão principal do NGINX 1.25.1 para usuários de código aberto e do NGINX Plus R30 para clientes corporativos.]
[ngx_snippet nome='tabela-estilo-blog']
Temos o prazer de anunciar que nossa implementação de pré-visualização do suporte NGINX para QUIC+HTTP/3 agora está disponível como pacotes binários pré-compilados para duas distribuições:

  • Red Hat Enterprise Linux 9 e variantes binárias compatíveis
  • Ubuntu 22.04

Os binários são os últimos entregáveis da ramificação quic do repositório nginx-quic separado que hospeda a implementação de visualização. Como tem sido o caso desde que começamos a trabalhar no QUIC+HTTP/3 no NGINX , você ainda pode baixar e construir o NGINX Open Source com QUIC+HTTP/3 e uma escolha de bibliotecas SSL/TLS que suportam QUIC. Embora o código seja rotulado como experimental, vários membros da comunidade relataram que estão usando com sucesso o nginx-quic na produção.

Nossa principal motivação para lançar binários pré-compilados é tornar mais rápido e fácil testar o NGINX com QUIC+HTTP/3. 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 escrita, o padrão de fato para SSL/TLS de código aberto, OpenSSL, não suporta QUIC. Portanto, construímos as distribuições binárias com um pacote de biblioteca quictls , que é instalado automaticamente como uma dependência. Selecionamos o quictls porque ele atualmente representa a melhor combinação de estabilidade, compatibilidade e recursos.

As instruções de instalação para a distribuição binária estão disponíveis no site NGINX QUIC .

Configurando 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 em blocos de configuração de servidor virtual ( server{} ) existentes.

Para a configuração funcional mais básica, tudo o que você precisa fazer é incluir três diretivas no bloco server{} (e filho location{} ):

DiretivaDescrição
ouvir443 relatório de reutilização rápida ;

Adicione uma nova diretiva listen com o parâmetro quic para dizer ao NGINX para escutar conexões HTTP/3 na mesma porta que HTTP/1.1 e HTTP/2, aqui 443.

O parâmetro reuseport é necessário para a operação correta quando há vários processos de trabalho do NGINX. Ele permite que o kernel distribua conexões HTTP/3 de entrada entre eles.

protocolos ssl TLSv1.3;

Incluir TLS 1.3 na lista de protocolos aceitos, conforme exigido pelo QUIC. (Esta diretiva provavelmente já existe na configuração, mas adicione-a se necessário.)

Para oferecer suporte a toda a gama de navegadores, você provavelmente também precisará incluir versões mais antigas do TLS. Para obter informações sobre o suporte do navegador ao TLS 1.3, consulte Posso usar o TLS 1.3?

add_header Alt-Svc 'h3=":$server_port"; ma=86400';

Inclua esta diretiva para que o NGINX adicione um cabeçalho de resposta informando ao navegador que uma atualização para o QUIC está disponível e em qual porta se conectar.

Por convenção, a porta (representada aqui pela variável $server_port ) é a mesma usada para TLS com HTTP/1.1 e HTTP/2.

O valor de ma é o número de segundos que o cliente pode assumir com segurança que o NGINX está aceitando tráfego HTTP/3 sobre UDP; após esse tempo, o cliente precisa reverter para TCP. O valor especificado aqui é equivalente a 24 horas.

Aqui está um exemplo de bloco server{} :

server { # para melhor compatibilidade, recomendamos
# usar o mesmo número de porta para QUIC e 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 / {
# anunciar que QUIC está disponível na porta configurada
add_header Alt-Svc 'h3=":$server_port"; ma=86400';

#proxy_pass <grupo_upstream>; 
        #raiz       /<diretório_raiz>; 
}
}

Há várias novas diretivas e variáveis opcionais relacionadas ao HTTP/3 (não mostradas no snippet), incluindo estas:

  • $http3 – (Variável) Definido como h3 quando a solicitação é enviada durante uma sessão HTTP/3 (caso contrário, é uma string vazia).
  • quic_retry – (Diretiva) Quando definido como on , informa ao NGINX para enviar uma mensagem de nova tentativa QUIC de volta ao solicitante, especificando o novo ID de conexão a ser usado, com o propósito de validar o endereço IP do solicitante. O pacote de repetição 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 porque o QUIC é executado sobre UDP.
  • ssl_early_data – (Diretiva) Quando definido como on , informa ao NGINX para aceitar dados do aplicativo na primeira solicitação enviada por um cliente por meio de uma nova conexão TLS 1.3, se houver uma conexão anterior desse cliente. Isso é conhecido como retomada de conexão com tempo de ida e volta zero (0-RTT) . O suporte para o envio de “dados iniciais” é um recurso do TLS 1.3 e contribui para o desempenho aprimorado do QUIC+HTTP/3 ao eliminar as trocas extras de mensagens de ida e volta necessárias para um handshake TLS.

    Observação:  A retomada da conexão 0-RTT pode criar um risco de segurança, porque os dados iniciais estão sujeitos a ataques de repetição se incluírem um método de solicitação HTTP diferente de GET . Para obter detalhes, consulte a seção sobre TLS 1.3 em Anunciando o NGINX Plus R17 em nosso blog.

O diagrama destaca como a retomada da conexão 0‑RTT com QUIC+HTTP/3 melhora o desempenho, porque o cliente pode enviar uma solicitação HTTP em sua primeira mensagem ao retomar uma conexão QUIC com o NGINX. Para TCP com TLS, em contraste, o cliente deve executar 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 3. Configuração seção do nginx-rápido LEIA-ME.

Testando NGINX com QUIC+HTTP/3

Como mencionado anteriormente, uma das nossas motivações para lançar binários pré-compilados é facilitar o teste de que o NGINX está manipulando o tráfego HTTP/3 corretamente. Para testes simples de linha de comando, você pode criar o curl com suporte a HTTP/3 ou usar um contêiner pré-criado . Além disso, versões mais recentes da maioria dos navegadores suportam QUIC+HTTP/3.

Para verificar se seu site habilitado para QUIC está satisfazendo solicitações de conexão HTTP/3 de navegadores, você pode usar as ferramentas de desenvolvedor de um navegador para examinar os cabeçalhos HTTP retornados pelo NGINX. A implementação QUIC+HTTP/3 está funcionando corretamente se o NGINX incluir o cabeçalho Alt-Svc discutido acima em sua resposta à solicitação HTTP inicial do navegador sobre TCP.

Nesse ponto, um navegador com capacidade QUIC faz uma conexão QUIC na porta especificada na diretiva Alt-Svc , e as solicitações e respostas HTTP subsequentes são sobre QUIC. Outra maneira de verificar se QUIC+HTTP/3 está sendo usado é incluir outra diretiva add_header para definir o valor de um cabeçalho HTTP personalizado para o protocolo capturado pela variável $server-protocol . Você pode rastrear o valor do cabeçalho conforme ele muda de HTTP/1. x antes que a conexão QUIC seja estabelecida para HTTP/3.0 quando o QUIC estiver sendo usado.

Aqui está um exemplo de bloco de localização onde o cabeçalho HTTP personalizado é X-protocol :

location / { # anunciar que QUIC está disponível na porta configurada
add_header Alt-Svc 'h3=":$server_port"; ma=86400'; 

# sinalizar se estamos usando QUIC+HTTP/3
add_header X-protocol $server_protocol always; 

#proxy_pass <grupo_upstream>; 
    #raiz /<diretório_raiz>; 
}

Como alternativa, existem ferramentas como a extensão Chrome HTTP Indicator , que indicam visualmente o protocolo em uso. (Observe que isso não é um endosso de nenhuma extensão de navegador e você deve se certificar de que quaisquer possíveis implicações de segurança de uma extensão sejam aceitáveis, dadas as suas circunstâncias).

O que vem a seguir

Continuaremos a fornecer nossa solução para QUIC+HTTP/3 e forneceremos mais exemplos de otimizações do NGINX nas próximas semanas. Enquanto isso, compartilhe os resultados dos seus próprios testes para ajudar a informar nossas decisões. Você pode compartilhar seu feedback na lista de discussão de desenvolvimento do NGINX e no canal #quic‑http3 no NGINX Community Slack .

Para obter atualizações sobre nosso trabalho no QUIC+HTTP/3, incluindo o próximo marco importante – a fusão do repositório nginx-quic na ramificação principal do NGINX Open Source – assine a lista de discussão de anúncios do NGINX .

Assista ao webinar

Também incentivamos você a participar do nosso próximo webinar, Get Hands-On with NGINX and QUIC+HTTP/3 na quarta-feira, 19 de abril de 2023:


"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."