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. Ganhou popularidade devido ao seu baixo consumo de memória, 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 HTTP 1.1 foi introduzido ao público em 1999, quando as páginas da web eram muito menores em tamanho. A Internet mudou dramaticamente desde então, e agora estamos enfrentando as limitações do HTTP 1.1. O protocolo limita as velocidades potenciais de transferência para a maioria dos sites modernos porque 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 binário, não como um arquivo de texto, o que é mais eficiente
  • Os servidores podem “empurrar” dados mesmo sem o pedido do usuário, o que melhora a velocidade para usuários com alta latência

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

Este tutorial ajudará você a configurar um servidor Nginx rápido e seguro com suporte HTTP/2.

Pré-requisitos

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

Passo 1 — Habilitando o Suporte ao HTTP/2

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

Abra o arquivo de configuração para o seu domínio usando o nano ou o editor de sua preferência:

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

No arquivo, localize as variáveis de 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; 
...

Isso 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 nano, pressione Ctrl+X e, quando solicitado, Y e depois Enter.

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

  1. sudo nginx -t

Se a sintaxe estiver livre de 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ê configurará seu servidor Nginx para usar uma lista de cifras mais restritiva para melhorar a segurança do seu servidor.

Passo 2 — Removendo Suites de Cifras Antigas e Inseguras

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

O método que você usará 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 o HTTP/2. No entanto, modificar este arquivo impedirá que o Certbot aplique atualizações no futuro, então apenas diremos 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 o 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 um certificado de terceiros e o configurou de acordo com os pré-requisitos, abra o arquivo /etc/nginx/snippets/ssl-params.conf em 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 editor.

Mais uma vez, verifique a configuração em busca de erros de sintaxe usando o comando nginx -t:

  1. sudo nginx -t

Se encontrar algum erro, corrija-o e teste novamente.

Assim 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 está funcionando.

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

Vamos garantir que o servidor esteja em execução e funcionando com 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 como a 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á sendo usado 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). Vá para 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 de contexto.

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

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

Passo 4 — Habilitando HTTP Strict Transport Security (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. Esse 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 às solicitações de subdomínio. Se você tiver subdomínios e quiser que o HSTS se aplique a todos eles, deve adicionar a variável includeSubDomains ao 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 para erros de sintaxe:

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx.service

Conclusão

O seu servidor Nginx está agora a servir páginas HTTP/2. Se deseja testar a segurança da sua conexão SSL, por favor visite Qualys SSL Lab e execute um teste contra o seu servidor. Se tudo estiver configurado corretamente, deverá obter uma classificação A+ em termos de segurança.

Para aprender mais sobre como o Nginx analisa e implementa regras de blocos de 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