Como Configurar o Nginx com Suporte HTTP/2 no Ubuntu 22.04

A previous version of this tutorial was written by Sergey Zhukaev.

Introdução

O Nginx é um servidor web de código aberto rápido e confiável. Ele ganhou popularidade devido à sua pegada de memória baixa, alta escalabilidade, facilidade de configuração e suporte a uma ampla variedade de protocolos.

O HTTP/2 é uma versão mais recente do Protocolo de Transporte de Hipertexto, que é usado na Web para entregar páginas do servidor para o navegador. O HTTP/2 é a primeira grande atualização do HTTP em quase duas décadas: o HTTP1.1 foi introduzido ao público em 1999, quando as páginas da web eram muito menores em tamanho. A Internet mudou drasticamente desde então, e agora estamos enfrentando as limitações do HTTP 1.1. O protocolo limita as velocidades de transferência potenciais para a maioria dos sites modernos porque ele baixa partes de uma página em uma fila – a parte anterior deve ser baixada completamente antes que o download da próxima parte comece – e uma página da web moderna média baixa dezenas de ativos individuais de CSS, javascript e imagem.

O HTTP/2 resolve esse problema porque traz algumas mudanças fundamentais:

  • Todas as solicitações são baixadas em paralelo, não em uma fila
  • Os cabeçalhos HTTP são comprimidos
  • As páginas são transferidas como um arquivo binário, não como um arquivo de texto, o que é mais eficiente
  • Os servidores podem “empurrar” dados mesmo sem a solicitação do usuário, o que melhora a velocidade para usuários com latência alta

Mesmo que o HTTP/2 não exija criptografia, os desenvolvedores dos dois navegadores mais populares, Google Chrome e Mozilla Firefox, afirmaram que, por motivos de segurança, eles darão suporte ao HTTP/2 apenas para conexões HTTPS. Portanto, se você decidir configurar servidores com suporte ao HTTP/2, também precisará protegê-los com HTTPS.

Este tutorial irá ajudá-lo a configurar um servidor Nginx rápido e seguro com suporte ao HTTP/2.

Pré-requisitos

Antes de começar, você precisará de algumas coisas:

Passo 1 — Habilitando Suporte ao HTTP/2

Se você seguiu o passo de configuração do bloco de servidor no tutorial de instalação do Nginx, você deve ter um bloco de servidor para seu domínio em /etc/nginx/sites-available/seu_domínio com a diretiva server_name já configurada adequadamente. A primeira alteração que faremos será modificar o bloco de servidor do seu domínio para usar o HTTP/2.

Abra o arquivo de configuração para o seu domínio usando o nano ou seu editor preferido:

  1. sudo nano /etc/nginx/sites-enabled/your_domain

No arquivo, localize as variáveis listen associadas à porta 443:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl ipv6only=on; 
    listen 443 ssl; 
...

O primeiro é para conexões IPv6. O segundo é para todas as conexões IPv4. Vamos habilitar o HTTP/2 para ambos.

Modifique cada diretiva listen para incluir http2:

/etc/nginx/sites-enabled/your_domain
...
    listen [::]:443 ssl http2 ipv6only=on; 
    listen 443 ssl http2; 
...

Isto diz ao Nginx para usar HTTP/2 com navegadores compatíveis.

Salve o arquivo de configuração e saia do editor de texto. Se estiver usando o nano, pressione Ctrl+X e, quando solicitado, Y e depois Enter.

Sempre que você fizer alterações nos arquivos de configuração do Nginx, você deve verificar a configuração para erros, usando a flag -t, que executa o comando de verificação de sintaxe incorporado do Nginx:

  1. sudo nginx -t

Se a sintaxe estiver sem erros, você receberá uma saída como a seguinte:

Output of sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Em seguida, você irá configurar seu servidor Nginx para usar uma lista de cifras mais restritiva para melhorar a segurança do seu servidor.

Passo 2 — Removendo Conjuntos de Cifras Antigos e Inseguros

O HTTP/2 tem uma lista de bloqueio de cifras antigas e inseguras que devem ser evitadas. Conjuntos de cifras são algoritmos criptográficos que descrevem como os dados transferidos devem ser criptografados.

O método que você utilizará para definir as cifras depende de como você configurou seus certificados TLS/SSL para o Nginx.

Se você usou o Certbot para obter seus certificados, ele também criou o arquivo /etc/letsencrypt/options-ssl-nginx.conf que contém cifras que não são seguras o suficiente para HTTP/2. No entanto, modificar este arquivo impedirá que o Certbot aplique atualizações no futuro, então vamos apenas dizer ao Nginx para não usar este arquivo e especificaremos nossa própria lista de cifras.

Abra o arquivo de configuração do bloco do servidor para seu domínio:

sudo nano /etc/nginx/sites-enabled/your_domain

Localize a linha que inclui o arquivo options-ssl-nginx.conf e comente-a adicionando um caractere # no início da linha:

/etc/nginx/sites-enabled/your_domain

# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

Abaixo dessa linha, adicione esta linha para definir as cifras permitidas:

/etc/nginx/sites-enabled/your_domain

ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Salve o arquivo e saia do editor.

Se você usou certificados autoassinados ou usou um certificado de terceiros e o configurou de acordo com os pré-requisitos, abra o arquivo /etc/nginx/snippets/ssl-params.conf no seu editor de texto:

  1. sudo nano /etc/nginx/snippets/ssl-params.conf

Localize a seguinte linha:

/etc/nginx/snippets/ssl-params.conf
...
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
...

Modifique-a para usar a seguinte lista de cifras:

/etc/nginx/snippets/ssl-params.conf

...
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

Salve o arquivo e saia do seu editor.

Novamente, verifique a configuração quanto a erros de sintaxe usando o comando nginx -t:

  1. sudo nginx -t

Se encontrar quaisquer erros, corrija-os e teste novamente.

Depois que sua configuração passar na verificação de sintaxe, reinicie o Nginx usando o comando systemctl:

  1. sudo systemctl reload nginx.service

Com o servidor reiniciado, vamos verificar se funciona.

Passo 3 — Verificando se o HTTP/2 está Ativado

Vamos garantir que o servidor esteja em execução e funcionando com o HTTP/2.

Use o comando curl para fazer uma solicitação ao seu site e visualizar os cabeçalhos:

  1. curl -I -L --http2 https://your_domain

Você receberá uma saída semelhante à seguinte:

HTTP/2 200
**Server**: nginx/1.18.0 (Ubuntu)
**Date**: Tue, 21 Jun 2022 22:19:09 GMT
**Content-Type**: text/html
**Content-Length**: 612
**Last-Modified**: Tue, 21 Jun 2022 22:17:56 GMT
**Connection**: keep-alive
**ETag**: "62b24394-264"
**Accept-Ranges**: bytes

Você também pode verificar se o HTTP/2 está em uso no Google Chrome. Abra o Chrome e navegue até https://seu_domínio. Abra as Ferramentas do Desenvolvedor do Chrome (Visualizar -> Desenvolvedor -> Ferramentas do Desenvolvedor) e recarregue a página (Visualizar -> Recarregar esta página). Navegue até a aba Rede, clique com o botão direito na linha do cabeçalho da tabela que começa com Nome e selecione a opção Protocolo no menu suspenso.

Você terá uma nova coluna Protocolo que contém h2 (que representa o HTTP/2), indicando que o HTTP/2 está funcionando.

Neste ponto, você está pronto para fornecer conteúdo através do protocolo HTTP/2. Vamos melhorar a segurança e o desempenho ativando o HSTS.

Passo 4 — Habilitando a Segurança de Transporte Estrita HTTP (HSTS)

Mesmo que suas solicitações HTTP redirecionem para HTTPS, você pode habilitar o HTTP Strict Transport Security (HSTS) para evitar ter que fazer esses redirecionamentos. Se o navegador encontrar um cabeçalho HSTS, ele não tentará se conectar ao servidor via HTTP regular novamente por um determinado período de tempo. Independentemente disso, ele trocará dados usando apenas uma conexão HTTPS criptografada. Este cabeçalho também nos protege de ataques de degradação de protocolo .

Abra novamente o arquivo de configuração do bloco do servidor para seu domínio:

sudo nano /etc/nginx/your_domain

Adicione esta linha ao mesmo bloco do arquivo contendo as cifras SSL para habilitar o HSTS:

/etc/nginx/your_domain
server {
...
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    add_header Strict-Transport-Security "max-age=15768000" always;
}
...

O max-age é definido em segundos. O valor 15768000 é equivalente a 6 meses.

Por padrão, este cabeçalho não é adicionado a solicitações de subdomínios. Se você tiver subdomínios e quiser que o HSTS se aplique a todos eles, você deve adicionar a variável includeSubDomains no final da linha, assim:

/etc/nginx/your_domain
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Salve o arquivo e saia do editor.

Mais uma vez, verifique a configuração por erros de sintaxe:

  1. sudo nginx -t

Finalmente, reinicie o servidor Nginx para aplicar as alterações.

  1. sudo systemctl reload nginx.service

Conclusão

Seu servidor Nginx está agora servindo páginas HTTP/2. Se você deseja testar a força da sua conexão SSL, por favor visite Laboratório SSL da Qualys e execute um teste contra o seu servidor. Se tudo estiver configurado corretamente, você deverá obter uma marca A+ para segurança.

Para saber mais sobre como o Nginx analisa e implementa regras de bloco do servidor, tente ler Compreendendo os Algoritmos de Seleção de Bloco de Servidor e Localização do Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-22-04