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:
- Um servidor Ubuntu 22.04 configurado seguindo o guia de configuração inicial do servidor Ubuntu 22.04, incluindo um usuário não root com sudo e um firewall.
- O Nginx instalado em seu servidor, o que pode ser feito seguindo Como Instalar o Nginx no Ubuntu 22.04.
- A domain name configured to point to your server. You can purchase one on Namecheap or get one for free on Freenom. You can learn how to point domains to DigitalOcean Droplets by following the documentation on How To Manage Your Domain With DigitalOcean.
- A TLS/SSL certificate configured for your server. You have two options:
- Você pode obter um certificado gratuito do Let’s Encrypt seguindo Como Proteger o Nginx com Let’s Encrypt no Ubuntu 22.04.
- Você também pode gerar e configurar um certificado autoassinado seguindo o Como Criar um Certificado SSL Autoassinado para o Nginx no Ubuntu 22.04.
- O Nginx está configurado para redirecionar o tráfego da porta
80
para a porta443
, o que deve estar coberto pelos pré-requisitos anteriores. - O Nginx está configurado para usar uma chave Diffie-Hellman Efémera (DHE) de 2048 bits ou superior, o que também deve estar coberto pelos pré-requisitos anteriores.
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:
No arquivo, localize as variáveis de listen
associadas à porta 443
:
...
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
:
...
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:
Se a sintaxe estiver livre de erros, você receberá uma saída como a seguinte:
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:
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
Abaixo dessa linha, adicione esta linha para definir as cifras permitidas:
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:
Localize a seguinte linha:
...
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:
...
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
:
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
:
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:
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:
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:
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:
Por fim, reinicie o servidor Nginx para aplicar as alterações.
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.