access_log формат
Тема дорожной карты · Nginx
Nginx записывает каждый HTTP-запрос в журнал доступа, используя настраиваемый формат, заданный директивой log_format — как правило, размещённой в блоке http файла /etc/nginx/nginx.conf. Формат по умолчанию называется combined и фиксирует IP-адрес клиента, метку времени, строку запроса, код ответа, объём переданных данных, реферер и User-Agent; однако операторы могут определять собственные форматы, включающие время ответа upstream, статус кэша, версию протокола SSL/TLS или любую переменную Nginx. Пользовательский формат объявляется как log_format myformat '...', а затем указывается для конкретного виртуального хоста директивой access_log /var/log/nginx/access.log myformat;, что позволяет легко адаптировать журналирование под нужды обратного прокси, балансировщика нагрузки или статического веб-сервера. Структурированные форматы, такие как JSON, становятся всё популярнее, поскольку они напрямую интегрируются со стеками агрегации журналов — Loki или Elasticsearch — без дополнительного парсинга. Грамотное проектирование формата журнала доступа — фундаментальная часть мониторинга производительности Nginx и аудита безопасности.
Как это работает
access_log формат использует access_log + error_log. Определите JSON log-формат (log_format json escape=json '{"time":"$time_iso8601",...}';) для лёгкого ingestion в Loki, Elasticsearch, Vector. access_log /path/access.log json; per server-блок. Status-модуль (stub_status) экспонирует базовые метрики; nginx-vts-module даёт полные Prometheus-совместимые метрики. nginx-prometheus-exporter — sidecar-вариант.
Когда применять
Переход на JSON access logs — с первого дня; намного проще запрашивать, чем дефолтный combined-формат. Шлите в Loki через Vector/Promtail. nginx-prometheus-exporter — для метрик. Alerts на 5xx > 1%, пороги latency p95/p99, disk usage log-volume. logrotate — для ротации (или daily + dateext конфиг).
Типичные ошибки
Ловушки access_log формат: дефолтный combined-формат лога ломается на спецсимволах (нет эскейпинга); диск забит access-логами без ротации (сервер перестаёт принимать трафик); не логируется X-Real-IP за CDN (видите CDN-IP вместо реальных клиентов); error log на дефолтном warn-уровне пропускает полезное (ставьте info при инцидентах).