Logs de Acesso do Nginx: O Que Cada Campo Significa
Os logs de acesso do Nginx registram cada requisição que seu servidor web processa. Eles são o primeiro lugar a consultar ao depurar erros 404, rastrear endpoints lentos ou investigar tráfego suspeito. No entanto, muitos desenvolvedores apenas passam os olhos pelas linhas brutas do log sem entender completamente cada campo. Este guia detalha o formato padrão de log do Nginx, mostra como personalizá-lo e apresenta técnicas práticas de análise usando ferramentas de linha de comando padrão.
Formato Padrão de Log de Acesso do Nginx
Por padrão, o Nginx usa o formato de log combined, que se parece com isto:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Uma linha de log típica:
192.0.2.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
Explicação Campo a Campo
| Campo | Variável | Descrição |
|---|---|---|
| Endereço remoto | $remote_addr | Endereço IP do cliente que faz a requisição. |
| Usuário remoto | $remote_user | Nome de usuário se autenticação HTTP for usada; caso contrário, -. |
| Hora local | $time_local | Hora local do servidor no formato [dia/mês/ano:hora:minuto:segundo fuso]. |
| Requisição | $request | Linha completa da requisição: método, caminho e protocolo HTTP. |
| Status | $status | Código de status da resposta HTTP (ex.: 200, 404, 500). |
| Bytes do corpo enviados | $body_bytes_sent | Tamanho do corpo da resposta em bytes, excluindo cabeçalhos. |
| Referer | $http_referer | A página que originou a requisição (se fornecida pelo cliente). |
| User agent | $http_user_agent | String do software cliente (navegador, bot, ferramenta). |
Personalizando o Formato do Log
Você pode definir seu próprio formato para capturar detalhes adicionais como tempo de requisição, tempo de resposta do upstream ou taxa de gzip. Adicione uma diretiva log_format no bloco http e referencie-a em access_log.
http {
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log detailed;
}
Variáveis extras comuns:
$request_time– tempo total desde o primeiro byte recebido até o último byte enviado.$upstream_response_time– tempo gasto aguardando o upstream (ex.: PHP-FPM, Node.js).$gzip_ratio– taxa de compressão se o gzip estiver habilitado.$http_x_forwarded_for– IP original do cliente quando atrás de um proxy ou balanceador de carga.
Analisando Logs do Nginx com Ferramentas de Linha de Comando
Você não precisa de software caro para extrair insights. Ferramentas Unix padrão como grep, awk, sort e uniq são poderosas o suficiente para a maioria das tarefas.
1. Encontrar os Endereços IP Mais Frequentes
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Isso ajuda a identificar acessos intensos ou possíveis fontes de DDoS.
2. Identificar as URLs Mais Solicitadas
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Útil para entender o conteúdo popular ou detectar padrões incomuns.
3. Contar Códigos de Status HTTP
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
Veja rapidamente quantos 404s ou 500s estão ocorrendo.
4. Encontrar Requisições com Tempos de Resposta Lentos
Se você adicionou $request_time ao seu formato de log, pode filtrar requisições lentas:
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
Ajuste o limite (1 segundo aqui) conforme necessário.
5. Detectar User Agents Suspeitos
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Procure por bots maliciosos conhecidos ou clientes incomuns.
Casos de Uso Práticos
- Solução de problemas: Correlacione erros 500 com endpoints específicos ou tempos de resposta do upstream.
- Ajuste de desempenho: Identifique páginas lentas e otimize consultas ao banco de dados ou cache.
- Monitoramento de segurança: Detecte tentativas de força bruta (muitos 401/403 do mesmo IP) ou padrões de injeção SQL nas URLs.
- Planejamento de capacidade: Acompanhe o volume de requisições ao longo do tempo para antecipar necessidades de escalabilidade.
Automatizando a Análise com Parsers de Log
Embora one-liners de linha de comando funcionem para consultas pontuais, relatórios regulares se beneficiam de ferramentas dedicadas. Você pode usar analisadores de log de código aberto como GoAccess ou AWStats, ou criar scripts personalizados. Para uma análise rápida, baseada no navegador e sem instalar nada, o Nginx Log Analyzer permite colar linhas de log e obter resumos instantâneos de códigos de status, IPs mais frequentes e caminhos solicitados.
Melhores Práticas para Gerenciamento de Logs
- Rotacione logs regularmente: Use
logrotatepara evitar problemas de espaço em disco. - Centralize logs: Envie para um sistema de gerenciamento de logs (ex.: ELK, Graylog) para armazenamento e busca de longo prazo.
- Inclua IDs de requisição: Adicione
$request_idpara correlacionar com logs da aplicação. - Respeite a privacidade: Anonimize IPs se exigido pelo GDPR ou outras regulamentações.
FAQ
Qual é a diferença entre logs de acesso e logs de erro no Nginx?
Os logs de acesso registram cada requisição processada pelo Nginx, incluindo IP do cliente, método da requisição, código de status e user agent. Os logs de erro capturam mensagens de diagnóstico sobre problemas do servidor, como conexões falhas, erros de configuração ou timeouts do upstream. Ambos são essenciais para diferentes cenários de solução de problemas.
Como posso ver o IP real do cliente quando o Nginx está atrás de um balanceador de carga?
Quando o Nginx está atrás de um proxy ou balanceador de carga, $remote_addr mostra o IP do balanceador. Para registrar o IP original do cliente, configure o módulo real_ip para confiar no IP do balanceador e use $http_x_forwarded_for ou $realip_remote_addr no seu formato de log.
Posso analisar logs do Nginx sem instalar software?
Sim. Você pode usar comandos Unix padrão como grep, awk e sort diretamente no terminal. Para uma abordagem gráfica baseada no navegador, ferramentas online como o Nginx Log Analyzer fornecem insights rápidos sem qualquer instalação.
Pronto para mergulhar nos seus logs? Experimente o Nginx Log Analyzer para analisar e visualizar seus logs de acesso em segundos—sem necessidade de configuração.