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:
- Um servidor Ubuntu 22.04 configurado seguindo o guia de configuração inicial do servidor Ubuntu 22.04, incluindo um usuário sudo não root e um firewall.
- O Nginx instalado em seu servidor, o que você pode fazer 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 Segurar o Nginx com Let’s Encrypt no Ubuntu 22.04.
- Você também pode gerar e configurar um certificado autoassinado seguindo Como Criar um Certificado SSL Autoassinado para Nginx no Ubuntu 22.04.
- O Nginx está configurado para redirecionar o tráfego da porta
80
para a porta443
, o que deve ser coberto pelos pré-requisitos anteriores. - O Nginx está configurado para usar uma chave de Diffie-Hellman Efêmera (DHE) de 2048 bits ou superior, o que também deve ser coberto pelos pré-requisitos anteriores.
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:
No arquivo, localize as variáveis 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;
...
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:
Se a sintaxe estiver sem 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ê 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:
# 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 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:
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 seu editor.
Novamente, verifique a configuração quanto a erros de sintaxe usando o comando 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
:
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:
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:
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:
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:
Finalmente, reinicie o servidor Nginx para aplicar as alterações.
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.