Анализ логов Nginx: визуализация через GoAccess и парсинг в Logstash
- Необходимость быстро выявить IP-адреса ботов, атакующих сайт HTTP-флудом.
- Поиск самых медленных эндпоинтов API (анализ переменной
$request_time). - Отсутствие наглядной аналитики кодов ответов (4xx, 5xx), рефереров и браузеров в реальном времени.
1. Настройка расширенного формата логов Nginx
Добавьте формат json_analytics в /etc/nginx/nginx.conf:
http {
log_format json_analytics escape=json
'{"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"request_method":"$request_method",'
'"request_uri":"$request_uri",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"}';
access_log /var/log/nginx/analytics.log json_analytics;
}2. Анализ и генерация Real-Time дашборда через GoAccess
# Установка GoAccess
apt-get install -y goaccess || dnf install -y goaccess
# Консольный интерактивный режим
goaccess /var/log/nginx/access.log --log-format=COMBINED
# Генерация автономного HTML отчета в реальном времени через WebSocket
goaccess /var/log/nginx/access.log --log-format=COMBINED \
--real-time-html --ws-url=wss://status.itstm.ru:7890 \
-o /var/www/html/report.html --daemon3. Конфигурация пайплайна Logstash для парсинга JSON логов Nginx
Создайте файл /etc/logstash/conf.d/10-nginx.conf:
input {
file {
path => "/var/log/nginx/analytics.log"
codec => "json"
type => "nginx_access"
}
}
filter {
mutate {
convert => {
"request_time" => "float"
"status" => "integer"
"body_bytes_sent" => "integer"
}
}
geoip {
source => "remote_addr"
target => "geoip"
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "nginx-access-%{+YYYY.MM.dd}"
}
} Частые вопросы (FAQ)
В чем разница между метриками $request_time и $upstream_response_time в Nginx?
$request_time — полное время обработки запроса с момента получения первых байт от клиента до отправки последнего байта ответа. $upstream_response_time — время ожидания ответа непосредственно от бэкенда (PHP/NodeJS).
Как в GoAccess отфильтровать внутренние IP-адреса и мониторинг?
Используйте параметр --ignore-ip=127.0.0.1 --ignore-ip=10.0.0.0/8 или параметр --ignore-crawlers для исключения поисковых ботов.