Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Otimize Nginx com HTTP/2 e Cache em 20 Minutos

14 min de leitura  ·  Guia técnico

Para otimizar o Nginx com HTTP/2 e cache, instale o Nginx 1.24, configure um certificado TLS com Certbot, habilite HTTP/2, e implemente o fastcgi_cache para PHP-FPM. Siga os passos abaixo para completar a configuração em cerca de 20 minutos.

  1. Instale o Nginx 1.24 no Ubuntu 22.04 LTS
  2. Configure um certificado TLS válido com Certbot
  3. Habilite HTTP/2 no bloco server do Nginx
  4. Crie o diretório de cache e configure fastcgi_cache para PHP-FPM
  5. Defina exceções de cache para sessões dinâmicas
  6. Teste, recarregue o serviço e valide os resultados

Pré-requisitos para otimizar Nginx com HTTP/2 e cache

  • Sistema operacional: Ubuntu 22.04 LTS com acesso root ou sudo
  • Nginx: versão 1.24 (disponível via repositório oficial ou pacote padrão do Ubuntu 22.04)
  • PHP-FPM: versão 8.2 instalada e em execução (necessário para fastcgi_cache)
  • Domínio apontado para o servidor: registro DNS A configurado corretamente
  • Certificado TLS válido: HTTP/2 exige HTTPS — o Certbot será usado para emitir via Let's Encrypt
  • Portas 80 e 443 abertas no firewall (UFW ou iptables)
  • Acesso SSH ao servidor — veja o guia Acessando servidores VPS Linux da AviraHost se precisar de ajuda para conectar

Instalar o Nginx 1.24 e o Certbot no Ubuntu 22.04

O primeiro passo para habilitar HTTP/2 no Nginx é garantir que você está rodando uma versão recente do servidor web. O Nginx 1.24 já inclui suporte nativo a HTTP/2 via diretiva http2 no bloco listen. Atualize os repositórios e instale os pacotes necessários:

sudo apt update && sudo apt upgrade -y
sudo apt install nginx certbot python3-certbot-nginx -y

Verifique a versão instalada:

nginx -v
nginx version: nginx/1.24.0 (Ubuntu)

Em seguida, emita o certificado TLS para o seu domínio. Substitua seudominio.com pelo domínio real:

sudo certbot --nginx -d seudominio.com -d www.seudominio.com

O Certbot modifica automaticamente o arquivo de configuração do Nginx para incluir os caminhos do certificado. Após a conclusão, você verá uma mensagem confirmando que o certificado foi emitido e instalado com sucesso. Se quiser entender como redirecionar HTTP para HTTPS de forma permanente, consulte o artigo Como redirecionar um site http para https?.

Habilitar HTTP/2 no bloco server do Nginx

Com o TLS configurado, habilitar o protocolo HTTP/2 no Nginx é uma alteração de uma única linha. Abra o arquivo de configuração do seu virtual host — normalmente em /etc/nginx/sites-available/seudominio.com:

sudo nano /etc/nginx/sites-available/seudominio.com

Localize as diretivas listen para a porta 443 e adicione http2 logo após o número da porta:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name seudominio.com www.seudominio.com;

    ssl_certificate /etc/letsencrypt/live/seudominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seudominio.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    root /var/www/seudominio.com/html;
    index index.php index.html;
}

Salve o arquivo e teste a sintaxe antes de recarregar:

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

Ao rodar este comando, o Nginx recarrega a configuração sem interromper conexões ativas. O HTTP/2 estará ativo imediatamente após o reload.

Configurar o fastcgi_cache para PHP-FPM no Nginx

O mecanismo de cache FastCGI é a estratégia mais eficiente para sites WordPress com PHP-FPM, pois armazena o HTML gerado pelo PHP diretamente em disco, eliminando a necessidade de processar o PHP e consultar o banco de dados a cada requisição. Crie o diretório de cache e configure as permissões:

sudo mkdir -p /var/cache/nginx/fastcgi
sudo chown www-data:www-data /var/cache/nginx/fastcgi

Abra o arquivo de configuração principal do Nginx para definir a zona de cache global:

sudo nano /etc/nginx/nginx.conf

Dentro do bloco http { }, adicione a diretiva fastcgi_cache_path antes de qualquer bloco server:

fastcgi_cache_path /var/cache/nginx/fastcgi
    levels=1:2
    keys_zone=WORDPRESS:100m
    inactive=60m
    max_size=1g;

Agora, no arquivo do virtual host (/etc/nginx/sites-available/seudominio.com), adicione as configurações de cache dentro do bloco server:

    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

    set $skip_cache 0;

    if ($request_method = POST) { set $skip_cache 1; }
    if ($query_string != "") { set $skip_cache 1; }
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap") {
        set $skip_cache 1;
    }
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in|woocommerce_items_in_cart") {
        set $skip_cache 1;
    }

Em seguida, dentro do bloco location ~ \.php$, ative o cache e configure as exceções:

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;

        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        add_header X-FastCGI-Cache $upstream_cache_status;
    }

O cabeçalho X-FastCGI-Cache retornará HIT, MISS ou BYPASS em cada resposta, permitindo que você monitore o funcionamento do cache em tempo real.

Adicionar compressão Gzip e cabeçalhos de cache estático

A compressão de respostas HTTP complementa o HTTP/2 ao reduzir o volume de dados transferidos. Configure o Gzip no bloco http do nginx.conf:

gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript
           application/rss+xml application/atom+xml image/svg+xml;
gzip_min_length 256;

Para arquivos estáticos como imagens, CSS e JavaScript, configure cabeçalhos de cache de longa duração no virtual host:

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
        access_log off;
    }

Essa configuração instrui os navegadores a armazenar esses arquivos localmente por até um ano, eliminando requisições desnecessárias ao servidor para recursos que raramente mudam. Combinado com HTTP/2 e fastcgi_cache, o resultado é uma redução significativa na carga do servidor e no tempo de carregamento percebido pelo usuário.

Teste novamente a sintaxe e recarregue o Nginx:

sudo nginx -t && sudo systemctl reload nginx

Validar HTTP/2, cache e compressão em produção

Após recarregar o Nginx, valide cada componente da configuração. Para confirmar que o HTTP/2 está ativo, use o curl com suporte a HTTP/2:

curl -I --http2 https://seudominio.com
HTTP/2 200
server: nginx/1.24.0
content-type: text/html; charset=UTF-8
x-fastcgi-cache: MISS

Na primeira requisição, o cache retornará MISS. Repita o comando e o valor mudará para HIT, confirmando que o fastcgi_cache está funcionando:

curl -I --http2 https://seudominio.com
HTTP/2 200
x-fastcgi-cache: HIT

Para verificar a compressão Gzip, use:

curl -H "Accept-Encoding: gzip" -I https://seudominio.com
content-encoding: gzip

Se o cabeçalho content-encoding: gzip aparecer na resposta, a compressão está ativa. Para uma análise mais detalhada de otimizações adicionais no servidor Linux, consulte o artigo Dicas de Otimização de Servidores Linux.

Problemas comuns e como resolver

Sintoma: Nginx retorna erro 502 Bad Gateway após ativar fastcgi_cache

Causa: O socket do PHP-FPM especificado na diretiva fastcgi_pass não corresponde ao socket real em uso. Isso ocorre quando a versão do PHP-FPM instalada é diferente da referenciada na configuração.
Solução: Verifique o socket ativo com ls /run/php/ e ajuste a linha fastcgi_pass para o socket correto, por exemplo unix:/run/php/php8.2-fpm.sock. Reinicie o PHP-FPM com sudo systemctl restart php8.2-fpm e recarregue o Nginx.

Sintoma: HTTP/2 não aparece na aba Network do Chrome (protocolo exibe http/1.1)

Causa: O certificado TLS não está configurado corretamente, ou a diretiva http2 foi adicionada apenas no bloco listen 443 IPv4 e não no IPv6, ou o Nginx não foi recarregado após a alteração.
Solução: Confirme que ambas as linhas listen 443 ssl http2 e listen [::]:443 ssl http2 estão presentes. Execute sudo nginx -t para verificar erros de sintaxe e sudo systemctl reload nginx para aplicar as mudanças. Certifique-se de que o certificado TLS é válido com sudo certbot certificates.

Sintoma: Páginas do carrinho WooCommerce exibem dados de outro usuário

Causa: As exceções de cache baseadas em cookies não estão configuradas corretamente, fazendo com que o Nginx sirva uma página cacheada de um usuário para outro.
Solução: Verifique se a condição if ($http_cookie ~* "woocommerce_items_in_cart") está presente no bloco server e se a variável $skip_cache está sendo passada corretamente para as diretivas fastcgi_cache_bypass e fastcgi_no_cache. Limpe o cache com find /var/cache/nginx -type f -delete e recarregue o Nginx.

Sintoma: Erro "Permission denied" ao criar o diretório de cache

Causa: O diretório /var/cache/nginx foi criado com permissões incorretas ou pertence ao usuário root em vez do usuário www-data que executa o Nginx.
Solução: Execute sudo chown -R www-data:www-data /var/cache/nginx e sudo chmod -R 755 /var/cache/nginx. Confirme o usuário do worker do Nginx com grep "^user" /etc/nginx/nginx.conf — o valor deve ser www-data.

Perguntas frequentes sobre Nginx HTTP/2 e cache

Como verificar se o HTTP/2 está ativo no Nginx?

Execute o comando curl -I --http2 https://seudominio.com e observe o campo HTTP/2 200 na resposta. Alternativamente, use a aba Network do DevTools do Chrome e verifique a coluna Protocol — o valor deve ser h2. O HTTP/2 exige que o servidor tenha um certificado TLS válido configurado, portanto certifique-se de que o Certbot emitiu e instalou o certificado corretamente antes de testar.

O Nginx suporta Brotli nativamente no Ubuntu 22.04?

O Nginx disponível nos repositórios padrão do Ubuntu 22.04 não inclui o módulo Brotli por padrão. É necessário instalar o pacote libnginx-mod-http-brotli-filter ou compilar o Nginx com o módulo ngx_brotli. O Brotli oferece compressão superior ao Gzip para arquivos de texto, CSS e JavaScript, sendo especialmente vantajoso para sites com muito conteúdo textual.

Qual a diferença entre proxy_cache e fastcgi_cache no Nginx?

O proxy_cache armazena respostas de servidores upstream como Node.js ou outro servidor HTTP, enquanto o fastcgi_cache armazena respostas geradas por processos FastCGI, como o PHP-FPM. Para sites WordPress com PHP-FPM, o fastcgi_cache é o mecanismo correto e pode reduzir drasticamente o tempo de geração de páginas dinâmicas, pois o PHP não precisa ser executado a cada requisição quando a resposta já está em cache.

O cache do Nginx interfere em páginas dinâmicas como carrinho de compras?

Sim, por isso é essencial configurar exceções de cache usando a diretiva set $skip_cache com condições baseadas em cookies de sessão, como wordpress_logged_in e woocommerce_items_in_cart. Páginas com esses cookies ativos devem ter o cache ignorado para garantir que dados do usuário sejam sempre frescos. Sem essas exceções, um usuário pode ver o carrinho ou a sessão de outro usuário.

Como limpar o cache do Nginx sem reiniciar o serviço?

Execute find /var/cache/nginx -type f -delete para apagar os arquivos de cache em disco sem interromper o Nginx. Em seguida, envie um sinal de reload com nginx -s reload para que o Nginx reconheça o diretório de cache vazio. Não é necessário parar o serviço, o que evita downtime e mantém as conexões ativas sem interrupção.

Conclusão

  • Ative HTTP/2 imediatamente: adicione http2 às diretivas listen 443 ssl e recarregue o Nginx — o ganho em multiplexação de requisições é imediato para todos os visitantes com navegadores modernos.
  • Configure fastcgi_cache com exceções corretas: defina a variável $skip_cache para proteger páginas dinâmicas como carrinho, área logada e admin, garantindo que o cache beneficie apenas páginas públicas estáticas.
  • Monitore com o cabeçalho X-FastCGI-Cache: use curl -I regularmente para confirmar que o cache está retornando HIT nas páginas esperadas e BYPASS nas exceções configuradas.

Leia também

Precisa de ajuda com Nginx e performance de servidor?

Configurar HTTP/2, cache e compressão no Nginx pode parecer simples, mas cada ambiente tem particularidades — versão do PHP, estrutura do WordPress, regras de firewall — que podem exigir ajustes específicos. Um VPS com recursos dedicados e suporte técnico especializado facilita muito esse processo.

Conheça os planos de VPS da AviraHost e hospede seu projeto com performance real

  • 0 Os usuários acharam isso útil
  • Nginx, HTTP/2, cache, Ubuntu, performance, AviraHost, Brotli
Esta resposta foi útil?

Artigos Relacionados

Instalando painel de gerenciamento de hospedagem VirtualMin.

O virtualmin é um painel de gerenciamento de hospedagem de sites gratuito, que é suportado por...

Como usar a ferramenta oficial de acesso remoto do Windows no PC e celular

1. Pelo menu Iniciar, acesse os “Acessórios do Windows” e abra o “Conexão de Área de Trabalho...

Como acessar o painel de gerenciamento dos meus Serviços.

Para acessar o painel de gerenciamento do seu serviço basta seguir o passo á passo abaixo.   1....

Compreendendo o Servidor VPS: O que é e Como Funciona!

Um servidor VPS (Virtual Private Server) é uma solução de hospedagem na qual um servidor físico é...

Como trocar a senha do usuário root do servidor VPS ou Dedicado.

Para trocar a senha do usuário root em um servidor VPS da AviraHost, você pode seguir os...