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.
- Instale o Nginx 1.24 no Ubuntu 22.04 LTS
- Configure um certificado TLS válido com Certbot
- Habilite HTTP/2 no bloco
serverdo Nginx - Crie o diretório de cache e configure
fastcgi_cachepara PHP-FPM - Defina exceções de cache para sessões dinâmicas
- 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 diretivaslisten 443 ssle 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_cachepara 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 -Iregularmente para confirmar que o cache está retornandoHITnas páginas esperadas eBYPASSnas exceções configuradas.
Leia também
- Otimizar o Desempenho do Nginx com Cache Avançado em VPS Linux e Servidor Dedicado
- Otimizar o Carregamento de Sites em VPS Linux e Servidor Dedicado com HTTP/2
- Passo a passo para configurar compressão Gzip e Brotli no Nginx
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