Nginx Access Logs: значения полей и анализ
Логи доступа Nginx фиксируют каждый запрос, обрабатываемый вашим веб-сервером. Это первое место, куда стоит заглянуть при отладке 404-х ошибок, поиске медленных эндпоинтов или расследовании подозрительного трафика. Однако многие разработчики просматривают сырые строки логов, не до конца понимая значение каждого поля. В этом руководстве мы разберём формат логов Nginx по умолчанию, покажем, как его настроить, и рассмотрим практические методы анализа с помощью стандартных инструментов командной строки.
Формат логов доступа Nginx по умолчанию
По умолчанию Nginx использует формат combined, который выглядит так:
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
Типичная строка лога:
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"
Разбор полей
| Поле | Переменная | Описание |
|---|---|---|
| Remote address | $remote_addr | IP-адрес клиента, сделавшего запрос. |
| Remote user | $remote_user | Имя пользователя при HTTP-аутентификации; иначе -. |
| Time local | $time_local | Локальное время сервера в формате [день/месяц/год:час:минута:секунда зона]. |
| Request | $request | Полная строка запроса: метод, путь и протокол HTTP. |
| Status | $status | Код состояния HTTP-ответа (например, 200, 404, 500). |
| Body bytes sent | $body_bytes_sent | Размер тела ответа в байтах без учёта заголовков. |
| Referer | $http_referer | Страница, с которой был сделан запрос (если передан клиентом). |
| User agent | $http_user_agent | Строка клиентского ПО (браузер, бот, инструмент). |
Настройка формата логов
Вы можете определить собственный формат для записи дополнительных данных, таких как время запроса, время ответа upstream или степень сжатия gzip. Добавьте директиву log_format в блок http и укажите её в 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;
}
Часто используемые дополнительные переменные:
$request_time– общее время от получения первого байта до отправки последнего.$upstream_response_time– время ожидания ответа от upstream (например, PHP-FPM, Node.js).$gzip_ratio– степень сжатия, если включён gzip.$http_x_forwarded_for– исходный IP-адрес клиента при работе за прокси или балансировщиком нагрузки.
Анализ логов Nginx с помощью командной строки
Для извлечения полезной информации не нужно дорогое ПО. Стандартных Unix-инструментов, таких как grep, awk, sort и uniq, достаточно для большинства задач.
1. Поиск наиболее частых IP-адресов
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Это помогает выявить самых активных клиентов или потенциальные источники DDoS-атак.
2. Определение самых запрашиваемых URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Полезно для понимания популярного контента или выявления необычных шаблонов.
3. Подсчёт кодов состояния HTTP
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
Быстро показывает, сколько возникает ошибок 404 или 500.
4. Поиск запросов с медленным временем ответа
Если вы добавили $request_time в формат логов, можно отфильтровать медленные запросы:
awk '{ if ($NF > 1) print }' /var/log/nginx/access.log
При необходимости измените порог (здесь 1 секунда).
5. Обнаружение подозрительных User Agent
awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
Ищите известных вредоносных ботов или необычных клиентов.
Практические сценарии использования
- Отладка: Сопоставление ошибок 500 с конкретными эндпоинтами или временем ответа upstream.
- Оптимизация производительности: Выявление медленных страниц и оптимизация запросов к базе данных или кэширования.
- Мониторинг безопасности: Обнаружение попыток брутфорса (много 401/403 с одного IP) или шаблонов SQL-инъекций в URL.
- Планирование мощностей: Отслеживание объёма запросов во времени для прогнозирования потребностей в масштабировании.
Автоматизация анализа с помощью парсеров логов
Хотя однострочники командной строки подходят для разовых запросов, для регулярной отчётности лучше использовать специализированные инструменты. Можно применять открытые анализаторы логов, такие как GoAccess или AWStats, либо создавать собственные скрипты. Для быстрого анализа прямо в браузере без установки чего-либо Nginx Log Analyzer позволяет вставить строки логов и мгновенно получить сводку по кодам состояния, топовым IP и запрошенным путям.
Лучшие практики управления логами
- Регулярная ротация логов: Используйте
logrotate, чтобы избежать проблем с дисковым пространством. - Централизация логов: Отправляйте их в систему управления логами (например, ELK, Graylog) для долгосрочного хранения и поиска.
- Добавление request ID: Включите
$request_idдля сопоставления с логами приложения. - Соблюдение приватности: Анонимизируйте IP-адреса, если это требуется GDPR или другими нормативными актами.
FAQ
В чём разница между access-логами и error-логами в Nginx?
Access-логи фиксируют каждый запрос, обработанный Nginx, включая IP клиента, метод запроса, код состояния и user agent. Error-логи содержат диагностические сообщения о проблемах сервера, таких как неудачные соединения, ошибки конфигурации или таймауты upstream. Оба типа логов необходимы для разных сценариев отладки.
Как узнать реальный IP клиента, когда Nginx работает за балансировщиком нагрузки?
Когда Nginx находится за прокси или балансировщиком нагрузки, $remote_addr показывает IP балансировщика. Чтобы логировать исходный IP клиента, настройте модуль real_ip на доверие к IP балансировщика и используйте $http_x_forwarded_for или $realip_remote_addr в формате логов.
Можно ли анализировать логи Nginx без установки ПО?
Да. Можно использовать стандартные Unix-команды, такие как grep, awk и sort, прямо в терминале. Для графического подхода в браузере онлайн-инструменты, такие как Nginx Log Analyzer, дают быстрые результаты без какой-либо установки.
Готовы погрузиться в свои логи? Попробуйте Nginx Log Analyzer, чтобы разобрать и визуализировать access-логи за секунды — без настройки.