Dominando a Compressão no Nginx: Gzip vs. Brotli para Performance Web
Domine a compressão de conteúdo no Nginx comparando os algoritmos Gzip e Brotli. Aprenda diretivas de configuração práticas para habilitar ambos, entenda as compensações de desempenho e descubra as melhores práticas, como usar arquivos Brotli estáticos para reduzir drasticamente o uso de largura de banda e acelerar a entrega de conteúdo em seus servidores web.
Dominando a Compressão no Nginx: Gzip vs. Brotli para Performance Web
A compressão no Nginx é uma daquelas mudanças que parecem pequenas até você olhar o painel de rede. Um arquivo CSS, um bundle JavaScript, uma página HTML, uma resposta de API JSON ou um SVG podem frequentemente trafegar pela rede como uma resposta muito menor, expandindo-se de volta para o mesmo conteúdo no navegador.
A escolha prática geralmente não é "Gzip ou Brotli para sempre". A maioria das configurações de produção usa ambos: Brotli para navegadores que o solicitam, Gzip como fallback e arquivos estáticos pré-comprimidos onde o pipeline de build pode criá-los antecipadamente. Os detalhes importam, no entanto. Um bloco de compressão copiado pode desperdiçar CPU, pular tipos MIME importantes ou falhar silenciosamente porque o módulo Brotli não está realmente instalado.
Entendendo a Compressão Web no Nginx
A compressão funciona encontrando padrões repetitivos nos dados (como arquivos HTML, CSS ou JavaScript) e substituindo-os por referências mais curtas. Isso reduz o tamanho total do arquivo transferido pela rede. O Nginx atua como intermediário, aplicando o algoritmo de compressão escolhido dinamicamente antes de enviar os dados ao navegador.
O Nginx normalmente requer o ngx_http_gzip_module para Gzip e um módulo Brotli separado para Brotli. A maioria dos pacotes comuns do Nginx inclui suporte a Gzip. O Brotli é mais variável: algumas distribuições o empacotam como um módulo dinâmico, alguns repositórios de terceiros o incluem e algumas compilações não o possuem.
Pré-requisitos
Certifique-se de que sua instalação do Nginx suporta Brotli se você planeja usá-lo. Você pode verificar se o Brotli está disponível executando:
nginx -V 2>&1 | grep -i brotli
Se a saída mencionar Brotli, confirme se ele está compilado ou carregado como um módulo dinâmico. Em sistemas Debian ou Ubuntu, verifique também os arquivos em /etc/nginx/modules-enabled/ se seu pacote usa módulos dinâmicos:
ls -l /etc/nginx/modules-enabled/ | grep -i brotli
Se o Nginx rejeitar brotli on; durante nginx -t, o módulo não está disponível para o binário do Nginx em execução, mesmo que o sistema operacional tenha um pacote Brotli instalado em outro lugar.
1. Configurando a Compressão Gzip
Gzip é o padrão maduro e amplamente suportado para compressão de conteúdo. Ele oferece um bom equilíbrio entre taxa de compressão e sobrecarga de CPU.
Habilitando Gzip na Configuração do Nginx
As configurações de Gzip são normalmente colocadas nos blocos http, server ou location do seu arquivo de configuração do Nginx (nginx.conf ou arquivos de configuração incluídos).
Para habilitar a compressão Gzip, use as seguintes diretivas:
http {
# Habilita a compressão Gzip
gzip on;
# Define o tamanho mínimo da resposta para comprimir (bytes)
# Apenas comprime arquivos maiores que 1000 bytes
gzip_min_length 1000;
# Nível de compressão (1=mais rápido/menor compressão, 9=mais lento/maior compressão)
gzip_comp_level 6;
# Especifica quais tipos MIME comprimir
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
# Recomendado: Envia o cabeçalho Vary: Accept-Encoding para que proxies armazenem em cache versões comprimidas e descomprimidas
gzip_vary on;
# Recomendado: Adiciona cabeçalho gzip para identificação
gzip_proxied any;
}
Diretivas Chave do Gzip Explicadas
gzip on;: Ativa o módulo Gzip.gzip_comp_level: Definir entre 4 e 6 é geralmente o ponto ideal para desempenho. Níveis mais altos economizam mais largura de banda, mas aumentam o uso de CPU no servidor.gzip_types: Crucialmente, você nunca deve comprimir formatos já comprimidos como imagens (.jpg,.png,.gif) ou vídeos.
2. Configurando a Compressão Brotli
Brotli é um algoritmo de compressão mais novo desenvolvido pelo Google. Para ativos de texto, ele frequentemente produz arquivos menores que o Gzip. O ganho exato depende do conteúdo, do nível de compressão e se os arquivos são comprimidos durante cada requisição ou antecipadamente durante a implantação.
Habilitando Brotli na Configuração do Nginx
A configuração do Brotli usa diretivas semelhantes, mas substitui gzip por brotli.
brotli on;
brotli_comp_level 6; # Normalmente 4 a 8 é recomendado
brotli_static on; # Habilita servir arquivos .br pré-comprimidos se disponíveis
brotli_types text/plain text/css application/json application/javascript application/x-javascript text/xml;
Nota Importante sobre Pré-compressão (brotli_static):
A compressão Brotli pode consumir muita CPU quando realizada dinamicamente para cada requisição. Uma prática recomendada comum é pré-comprimir ativos usando uma ferramenta offline dedicada (como o utilitário de linha de comando brotli) e armazenar a versão .br junto com o arquivo original (por exemplo, style.css e style.css.br).
Definir brotli_static on; instrui o Nginx a verificar se existe um arquivo .br pré-comprimido para o recurso solicitado e servi-lo diretamente se o cliente suportar Brotli, ignorando completamente o processamento em tempo real.
3. Gzip vs. Brotli: Fazendo a Escolha Certa
Escolher entre Gzip e Brotli depende muito do suporte do cliente e dos recursos do seu servidor.
| Característica | Gzip | Brotli | Recomendação |
|---|---|---|---|
| Taxa de Compressão | Boa | Frequentemente melhor para ativos de texto | Brotli geralmente vence |
| Carga de CPU (Dinâmica) | Baixa | Moderada a Alta | Gzip é mais leve |
| Suporte do Cliente | Quase Universal (Todos os navegadores modernos) | Muito Alto (A maioria dos navegadores modernos) | Gzip é mais seguro para suporte legado |
| Pré-compressão | Possível, mas menos comum | Altamente recomendada (brotli_static) |
Use Brotli pré-comprimido se possível |
A Abordagem Híbrida: Melhor Prática
A configuração moderna mais robusta usa uma configuração híbrida, priorizando Brotli para clientes modernos enquanto fornece Gzip como um fallback confiável.
- Priorize Brotli: Configure Brotli primeiro, frequentemente usando
brotli_static on;para velocidade. - Fallback para Gzip: Certifique-se de que o Gzip está habilitado e configurado para lidar com clientes que não suportam Brotli.
O Nginx escolhe uma resposta com base no cabeçalho Accept-Encoding do cliente e nos módulos habilitados em sua compilação. No tráfego normal do navegador, o Brotli é preferido quando o cliente anuncia br; o Gzip permanece útil para clientes, ferramentas, proxies e pilhas mais antigas que solicitam apenas gzip.
Exemplo de Configuração Híbrida
Se sua versão do Nginx suporta ambos os módulos, você pode habilitar ambos simultaneamente. O Nginx prioriza qual módulo serve o conteúdo com base nos cabeçalhos de requisição do cliente.
http {
# --- Configuração Brotli ---
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
# --- Configuração Gzip (Fallback) ---
gzip on;
gzip_comp_level 5;
gzip_vary on;
gzip_proxied any;
gzip_types
text/plain
text/css
application/javascript
application/json
application/xml
image/svg+xml;
}
Dicas de Ajuste de Desempenho
Independentemente do algoritmo que você selecionar, siga estas práticas recomendadas para obter o máximo impacto:
1. Verifique a Resposta Real
Não presuma que a compressão está funcionando porque o arquivo de configuração contém gzip on; ou brotli on;. Verifique uma resposta real:
curl -I -H 'Accept-Encoding: br,gzip' https://example.com/app.js
curl -I -H 'Accept-Encoding: gzip' https://example.com/app.js
Procure por Content-Encoding: br ou Content-Encoding: gzip. Mantenha também Vary: Accept-Encoding em respostas que podem ser armazenadas em cache por um CDN ou proxy compartilhado, para que variantes comprimidas e descomprimidas não se misturem.
2. Evite Compressão Excessiva
Nunca defina gzip_comp_level ou brotli_comp_level muito alto (por exemplo, 9 ou 11) a menos que seu servidor esteja severamente subutilizado. O ganho marginal na redução do tamanho do arquivo raramente justifica os ciclos extras de CPU necessários para o cálculo.
3. Armazene em Cache Arquivos Pré-Comprimidos
Para Brotli, usar brotli_static on; e pré-comprimir seus ativos estáticos é o maior ganho de desempenho. Isso transfere a carga da CPU do tempo de requisição para o tempo de implantação.
4. Teste Sua Configuração
Após modificar sua configuração do Nginx, sempre teste a sintaxe antes de recarregar:
sudo nginx -t
Se bem-sucedido, recarregue o Nginx para aplicar as alterações:
sudo systemctl reload nginx
Você também pode usar as ferramentas de desenvolvedor do navegador ou serviços de teste de desempenho para confirmar que as respostas estão sendo servidas com Content-Encoding: gzip ou Content-Encoding: br.
Uma Maneira Prática de Implementar Isso
Comece com Gzip se o site não tiver compressão alguma. Ele está embutido na maioria dos pacotes do Nginx e fornece uma linha de base rápida. Em seguida, adicione Brotli depois de confirmar o suporte do módulo e ter uma maneira de gerar arquivos .br para ativos estáticos durante a implantação.
Para um site React, Vue ou de documentação estática, a melhor configuração geralmente são arquivos .br e .gz pré-comprimidos para ativos compilados, compressão dinâmica moderada para HTML e respostas de API, e uma configuração de CDN que respeite Accept-Encoding. Para uma API pequena operando perto dos limites da CPU, um nível conservador de Gzip pode ser o melhor primeiro passo.
A vitória não são apenas arquivos menores. Uma boa compressão mantém a largura de banda baixa, ajuda conexões de clientes mais lentas e remove tempo de transferência desnecessário sem alterar o código da aplicação. A principal disciplina é testar os cabeçalhos, evitar comprimir mídia que já está comprimida e manter os níveis de compressão moderados o suficiente para que seu servidor ainda possa respirar durante picos de tráfego.