Логи Nginx в Kibana: Elastic Agent, data stream и рабочий dashboard
Ниже — практическая настройка сбора access/error logs Nginx через Elastic Agent и официальную Nginx integration. Сначала проверяем локальные журналы, затем подключаем Agent, убеждаемся в появлении data stream и только после этого строим dashboard.
1. Проверяем Nginx и локальные логи
nginx -v
nginx -T | grep -E 'access_log|error_log|log_format'
ls -lh /var/log/nginx/
tail -n 20 /var/log/nginx/access.log
tail -n 20 /var/log/nginx/error.log2. Проверяем формат access log
Стандартная Nginx integration лучше всего работает с обычным combined-форматом. Перед изменением log_format сохраните конфигурацию:
cp -a /etc/nginx /root/nginx-backup-$(date +%F-%H%M)
nginx -T > /root/nginx-config-before.txt3. Проверяем Elastic Agent
elastic-agent version
elastic-agent status
systemctl status elastic-agent --no-pager
journalctl -u elastic-agent -n 100 --no-pager4. Добавляем Nginx integration в Fleet
- Fleet → Agent policies → политика Nginx-сервера.
- Add integration → Nginx.
- Включите Access logs и Error logs.
- Пути:
/var/log/nginx/access.log*и/var/log/nginx/error.log*. - При необходимости включите Metrics и укажите stub_status URL.
- Сохраните policy и дождитесь статуса Healthy.
5. Генерируем тестовые запросы
curl -I http://127.0.0.1/
curl -I http://127.0.0.1/elastic-test-not-found
for i in $(seq 1 5); do curl -s -o /dev/null http://127.0.0.1/; done
tail -n 20 /var/log/nginx/access.log6. Проверяем Agent после изменения policy
elastic-agent status
journalctl -u elastic-agent --since '10 min ago' --no-pager7. Проверяем data streams
curl -sS -u elastic:'PASSWORD' \
'https://elastic.example.com:9200/_data_stream/logs-nginx.access-*?pretty'
curl -sS -u elastic:'PASSWORD' \
'https://elastic.example.com:9200/_data_stream/logs-nginx.error-*?pretty'8. Ищем тестовый 404
curl -sS -u elastic:'PASSWORD' -H 'Content-Type: application/json' \
'https://elastic.example.com:9200/logs-nginx.access-*/_search?pretty' \
-d '{"size":10,"sort":[{"@timestamp":"desc"}],"query":{"bool":{"filter":[{"term":{"http.response.status_code":404}}]}}}'9. Полезные запросы в Kibana Discover
data_stream.dataset : "nginx.access"
http.response.status_code >= 500
http.response.status_code : 404
url.path : "/elastic-test-not-found"
host.name : "web01"10. Собираем первый dashboard
- Requests over time — count по
@timestamp; - Status codes — breakdown по
http.response.status_code; - Top URLs — terms по
url.path; - Top 5xx URLs — filter status >= 500;
- Client IP — terms по
source.ip; - Error log — таблица последних событий
nginx.error.
11. Включаем stub_status для метрик
cat > /etc/nginx/conf.d/stub_status.conf <<'EOF'
server {
listen 127.0.0.1:8081;
server_name localhost;
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
EOF
nginx -t
systemctl reload nginx
curl http://127.0.0.1:8081/nginx_statusВ Nginx integration укажите metrics URL http://127.0.0.1:8081/nginx_status.
12. Типовые проблемы
- data stream не создаётся — Agent не получил новую policy или не читает файлы;
- события не разбираются — log_format не совместим с pipeline;
- нет старых логов — Agent обычно начинает чтение с текущей позиции;
- permission denied — проверьте права на каталог и log-файлы;
- дубли — один файл читают две integrations;
- неверное время — проверьте timezone сервера и поле
@timestamp.
13. Диагностика
elastic-agent status
elastic-agent inspect components --show-config 2>/dev/null | grep -A20 -B5 '/var/log/nginx'
journalctl -u elastic-agent --since '30 min ago' --no-pager
namei -l /var/log/nginx/access.log
nginx -t14. Rollback
rm -f /etc/nginx/conf.d/stub_status.conf
nginx -t && systemctl reload nginxТакже удалите Nginx integration из Agent policy, если сбор больше не нужен.
Критерий успеха: Agent Healthy, data streams access/error созданы, тестовый 404 находится в Discover, dashboard показывает запросы и статусы, а stub_status отдаёт метрики только локально.