Продвинутый

Интеграция Nginx с Prometheus для мониторинга

Алексей Кузнецов
Алексей Кузнецов
Системный администратор28 октября 2026 г.15 мин чтения

Разбираем нативную поддержку метрик в Nginx. Как настроить сбор данных, избежать лишних модулей и обеспечить предсказуемость мониторинга вашей инфраструктуры.

Интеграция Nginx с Prometheus для мониторинга

Разбираем нативную поддержку метрик в Nginx. Как настроить сбор данных, избежать лишних модулей и обеспечить предсказуемость мониторинга вашей инфраструктуры.

Зачем Nginx нужна нативная интеграция

Зачем Nginx нужна нативная интеграция

Когда вы строите домашнюю лабораторию или управляете парком серверов, мониторинг становится фундаментом. Если вы не видите, сколько запросов в секунду обрабатывает ваш прокси-сервер или какой процент ответов уходит в 5xx-ошибки, вы не управляете системой, а просто надеетесь, что она работает.

Nginx часто выступает в роли «входной двери» для всей инфраструктуры. Если на этом уровне начинаются проблемы — например, из-за нехватки дескрипторов файлов или перегрузки CPU — они каскадом распространяются на все сервисы за ним. Поэтому важно иметь прозрачную картину происходящего.

Проблема сторонних модулей

Раньше, чтобы получить детальную статистику, инженерам приходилось использовать сторонние решения, такие как nginx-module-vts или классический stub_status. С stub_status ситуация была предсказуемой, но крайне ограниченной: он даёт лишь базовые цифры по активным соединениям и запросам, не позволяя заглянуть в детали распределения трафика по методам или статус-кодам.

Использование сторонних модулей, которые требуют пересборки Nginx из исходников, несёт в себе несколько рисков:

  1. Сложность обновления. Как только выходит патч безопасности для Nginx, вам приходится заново проходить весь цикл сборки с вашими кастомными модулями. В моей практике это часто приводило к тому, что критические обновления безопасности откладывались из-за страха «сломать» кастомную сборку.
  2. Непредсказуемость поведения. Сторонний код может вести себя не так, как ожидает основная ветка разработки. Это может вызвать утечки памяти или нетипичное потребление ресурсов, что в условиях домашнего сервера с ограниченными мощностями (например, на Raspberry Pi) критично.
  3. Проблемы с совместимостью. При переходе на новые версии Nginx или смене дистрибутива (например, с Ubuntu на Alpine) сторонние модули могут просто перестать компилироваться.

Если вы уже пробовали собирать свои сборки, рекомендую изучить настройку экспорта метрик Nginx в Prometheus, чтобы понять, какие именно данные вы теряете при использовании упрощённых методов.

Преимущества встроенного экспортера

Современные версии Nginx (начиная с 1.11.10) получили возможность отдавать метрики в формате, который легко понимается Prometheus, через нативную поддержку модуля http_stub_status_module. Но гораздо важнее то, что архитектура позволяет интегрировать сбор данных без вмешательства в основной цикл обработки запросов.

С практической точки зрения, нативная интеграция даёт три ключевых преимущества:

  • Предсказуемость. Вы используете официальный код, который тестируется разработчиками Nginx. Это гарантирует, что сбор метрик не станет причиной внезапного падения сервиса под нагрузкой.
  • Минимальный оверхед. Нативная поддержка работает максимально эффективно. Мы не тратим лишние циклы процессора на прослойки между веб-сервером и экспортером.
  • Простота конфигурации. Вам не нужно изучать документацию к сторонним библиотекам. Достаточно добавить несколько строк в основной конфиг.

Для начала работы убедитесь, что ваш бинарный файл скомпилирован с поддержкой модуля stub status. Проверить это можно командой:

bash
nginx -V 2>&1 | grep --color http_stub_status_module

Если вы видите этот флаг в выводе, значит, вы готовы к настройке. Если нет — придётся либо пересобирать пакет, либо использовать готовые Docker-образы, где этот модуль уже включён. Правильный подход к интеграции всех компонентов системы описан в материале про интеграцию Nginx с Prometheus.

Настройка сбора метрик в конфигурации

Активация модуля stub_status

Для того чтобы Prometheus мог забирать данные, Nginx должен начать их отдавать. Самый надёжный и предсказуемый способ сделать это без установки сторонних модулей — использовать встроенный модуль http_stub_status_module. Он отдаёт базовую статистику: количество активных соединений, принятых запросов и количество обработанных соединений.

Сначала проверьте, собран ли ваш бинарный файл Nginx с поддержкой этого модуля. Выполните команду:

bash
nginx -V 2>&1 | grep --color http_stub_status_module

Если в выводе вы видите --with-http_stub_status_module, значит, всё в порядке. Если нет — придётся пересобирать пакет или использовать дистрибутив, где этот модуль включен по умолчанию.

Теперь нужно настроить конфигурацию. Я не рекомендую смешивать эндпоинт метрик с основным сайтом. Лучше выделить его в отдельный location внутри блока server. Это позволит нам чётко разделить трафик.

Отредактируйте ваш конфигурационный файл (например, /etc/nginx/sites-available/default) и добавьте следующий блок:

nginx
server {
    listen 80;
    server_name localhost;

    # Основной блок для метрик
    location /metrics {
        stub_status on;
        access_log off;      # Отключаем логирование запросов к метрикам, чтобы не засорять disk
        stub_status_format extended; # Если модуль поддерживает расширенный формат
    }
}

Обратите внимание на директиву access_log off. С практической точки зрения, Prometheus будет опрашивать этот эндпоинт каждые несколько секунд. Если оставить логирование включённым, ваш access.log быстро разрастётся до гигантских размеров, не неся никакой полезной информации для отладки трафика.

После внесения изменений обязательно проверьте синтаксис:

bash
sudo nginx -t

Если ошибок нет, примените конфигурацию:

bash
sudo systemctl reload nginx

Безопасность эндпоинта метрик

Выставлять stub_status в открытый интернет — плохая идея. Хотя сами по себе эти данные не содержат конфиденциальной информации, они раскрывают структуру вашего трафика и нагрузку на сервер, что может быть использовано для планирования DoS-атак.

Если вы планируете использовать настройку экспорта метрик Nginx в Prometheus, у вас есть два основных пути обеспечения безопасности.

Во-первых, ограничение по IP-адресу. Это самый простой и эффективный метод, если ваш Prometheus имеет статический IP. Добавьте директиву allow в блок location:

nginx
location /metrics {
    stub_status on;
    access_log off;

    # Разрешаем доступ только серверу мониторинга
    allow 192.168.1.50; 
    # Запрещаем всем остальным
    deny all;
}

Во-вторых, если Prometheus и Nginx находятся в разных сетях и вы не можете ограничить доступ по IP, используйте базовую аутентификацию (Basic Auth). Для этого создайте файл с паролем с помощью утилиты htpasswd:

bash
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd monitor_user

Затем обновите конфигурацию Nginx:

nginx
location /metrics {
    stub_status on;
    access_log off;

    auth_basic "Metrics Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

При таком подходе в конфигурации самого Prometheus (в файле prometheus.yml) вам нужно будет добавить блок basic_auth:

yaml
scrape_configs:
  - job_name: 'nginx_metrics'
    static_configs:
      - targets: ['localhost:80']
    basic_auth:
      username: 'monitor_user'
      password: 'your_secure_password'

Такой подход гарантирует предсказуемость: вы точно знаете, кто и когда запрашивает данные, и минимизируете риск несанкционированного сбора информации о состоянии вашей инфраструктуры.

Сбор данных через Prometheus

Сбор данных через Prometheus

Когда мы настроили отдачу метрик со стороны Nginx, наступает второй этап: научить Prometheus забирать эти данные. С практической точки зрения, здесь важно не просто «подключить» сервис, а сделать процесс сбора предсказуемым. Если Prometheus не сможет достучаться до эндпоинта или будет делать это слишком часто, вы получите либо дыры в графиках, либо лишнюю нагрузку на сеть и CPU.

Конфигурация scrape_configs

В конфигурационном файле prometheus.yml нам нужно добавить новый джобу (job). Я рекомендую не использовать статическую запись IP-адреса, если у вас в домашней лаборатории динамическая адресация или вы используете Docker с именами сервисов.

Если ваш Nginx работает в том же Docker-окружении, что и Prometheus, используйте имя контейнера. Если же это отдельная нода (например, ваш сервер «Пятачок»), укажите её сетевой адрес.

Пример типичной конфигурации для сбора метрик:

yaml
scrape_configs:
  - job_name: 'nginx-monitoring'
    # Интервал сбора данных. 
    # Для домашнего сервера 15–30 секунд — оптимально.
    scrape_interval: 15s
    
    # Как долго считать экземпляр «живым», если он не отвечает
    scrape_timeout: 10s
    
    static_configs:
      - targets: ['192.168.1.50:9113'] # IP вашего Nginx и порт экспортера
        labels:
          instance: 'nginx-primary'
          env: 'production'

Обратите внимание на секцию labels. Я всегда добавляю метки вроде instance или env. Это помогает потом в Grafana не гадать, с какого именно сервера прилетел скачок 5xx ошибок, особенно когда ваша инфраструктура разрастётся до нескольких нод.

Если вы ранее изучали настройку экспорта метрик Nginx в Prometheus, то знаете, что важно правильно сопоставить порты. Prometheus стучится именно на тот порт, который вы указали в targets.

Проверка доступности метрик

После того как вы отредактировали конфиг и перезапустили Prometheus (или выполнили curl -X POST http://localhost:9090/-/reload), нужно убедиться, что данные действительно поступают.

Во-первых, проверьте статус таргета в самом интерфейсе Prometheus. Перейдите в меню Status -> Targets. Если всё настроено верно, вы увидите nginx-monitoring в состоянии UP. Если статус DOWN, Prometheus напишет причину: например, connection refused (значит, сервис не слушает порт) или context deadline exceeded (проблема с тайм-аутами или сетью).

Во-вторых, выполните проверочный запрос в консоли самого сервера, где запущен Nginx. Это позволит исключить проблемы с сетевыми правилами (firewall):

bash
# Проверяем, отдает ли Nginx метрики локально
curl -v http://localhost:9113/metrics

Если вы видите длинный список текстовых строк с названиями переменных (вроде nginx_http_requests_total), значит, экспортер работает корректно.

Если же вы столкнулись с тем, что данные приходят, но они некорректны, стоит вернуться к этапу интеграции Nginx с Prometheus и проверить, правильно ли установлены модули в самом веб-сервере.

Для полноценного мониторинга важно не только собирать цифры, но и понимать, как они связаны с безопасностью. Например, аномальный рост трафика может быть связан не только с нагрузкой, но и с попытками эксплуатации уязвимостей, таких как уязвимость Canvas API.

Визуализация в Grafana

Выбор подходящих дашбордов

Когда данные из Prometheus попадают в Grafana, перед инженером встаёт выбор: собрать всё вручную или использовать готовые решения. С практической точки зрения, я всегда рекомендую начинать с проверенных шаблонов, но не оставлять их в исходном виде.

Самый популярный вариант — это дашборды из официального репозитория Grafana. Для мониторинга Nginx чаще всего используют шаблоны, заточенные под nginx-vts-exporter или стандартный nginx-exporter. Если вы настраивали сбор метрик через настройку экспорта метрик Nginx в Prometheus, вам подойдут ID дашбордов, которые учитывают специфику VTS (Virtual Host Traffic Status).

Чтобы импортировать готовый дашборд:

  1. В интерфейсе Grafana нажмите на иконку «+» и выберите Import.
  2. Введите ID шаблона (например, 12708 для Nginx VTS) и нажмите Load.
  3. Выберите ваш Prometheus в качестве источника данных.

Однако важно понимать: готовый дашборд — это лишь каркас. В моей домашней лаборатории, когда я настраивал мониторинг для кластера на Proxmox, стандартные панели часто показывали слишком много «шума». Я всегда адаптирую визуализацию под конкретные задачи. Если у вас один сервер — вам достаточно графиков RPS (requests per second) и ошибок. Если у вас распределённая инфраструктура, добавьте панели, которые показывают распределение трафика по конкретным upstream-группам. Это обеспечит предсказуемость: вы сразу увидите, если один из бэкендов начал отвечать медленнее остальных.

Ключевые показатели для алертинга

Визуализация нужна, чтобы смотреть на графики, а алертинг — чтобы не смотреть на них постоянно. Мониторинг бесполезен, если вы узнаёте о падении сервиса от разгневанных пользователей.

Я разделяю показатели на две группы: «здоровье сервиса» и «производительность». Для настройки алертов в Prometheus (через Alertmanager) я рекомендую опираться на следующие метрики:

  1. Количество ошибок (HTTP 5xx). Это критический показатель. Если процент 5-х ошибок растёт, значит, проблема либо в самом Nginx, либо в бэкендах. Пример правила для Prometheus (PromQL):

    yaml
    # Алерт на рост 5xx ошибок выше 5% от общего трафика за последние 5 минут
    rate(nginx_http_requests_total{status=~"5.."}[5m]) 
    / 
    rate(nginx_http_requests_total[5m]) > 0.05
    
  2. Время ответа (Latency). Даже если ошибок нет, медленный ответ — это тоже проблема. Я обычно отслеживаю 95-й или 99-й перцентиль времени ответа. Если p95 резко подскочил, значит, часть пользователей столкнулась с деградацией сервиса.

  3. Доступность Upstream-серверов. Если вы используете Nginx как реверс-прокси, крайне важно мониторить состояние бэкендов.

    yaml
    # Алерт, если количество живых серверов в апстриме упало ниже ожидаемого
    nginx_upstream_status{state="down"} > 0
    
  4. Загрузка соединений (Active Connections). Помогает вовремя заметить признаки DDoS-атаки или утечку соединений.

При настройке алертов соблюдайте принцип умеренности. Если вы настроите уведомление на каждый чих, вы быстро перестанете их читать. Сначала отладьте пороги срабатывания на тестовом стенде, убедитесь, что они не вызывают ложных срабатываний при кратковременных всплесках трафика, и только потом выводите их в рабочий канал связи. Это и есть путь к предсказуемому мониторингу.

Заключение

Итоговая оценка подхода

Выбор между использованием нативного модуля ngx_http_stub_status_module и сторонними экспортерами зависит от того, насколько глубокая аналитика вам требуется. Если ваша задача — просто знать, сколько активных соединений сейчас держит Nginx и не перегружен ли канал, стандартного модуля будет достаточно. Это решение максимально предсказуемо: оно не требует установки дополнительных пакетов, не потребляет лишнюю память и не вносит изменений в стабильность основного процесса.

Однако, если вы строите полноценную систему мониторинга, где важно видеть распределение ответов по кодам (4xx, 5xx) или анализировать время ответа для конкретных upstream-серверов, вам придётся смотреть в сторону настройки экспорта метрик Nginx в Prometheus.

Когда мониторинг требует доработки

С практической точки зрения, «голый» статус Nginx — это лишь верхушка айсберга. В реальной эксплуатации я часто сталкиваюсь с ситуацией, когда стандартных метрик не хватает для диагностики проблем в распределённых системах.

Например, если вы используете Nginx как реверс-прокси перед кластером приложений, вам критически важно понимать:

  1. Задержки возникают на стороне самого Nginx или в upstream-серверах.
  2. Происходит ли отток соединений из-за таймаутов.

В таких случаях я рекомендую не усложнять конфигурацию самого веб-сервера, а использовать связку nginx-exporter + Prometheus. Это позволяет разделить зоны ответственности: Nginx занимается доставкой трафика, а экспортер — преобразованием данных в понятный для Prometheus формат.

Чек-лист перед запуском в продакшн

Прежде чем считать мониторинг настроенным, убедитесь, что вы выполнили следующие шаги:

  1. Проверка доступности эндпоинта. Убедитесь, что метрики доступны только из внутренней сети или через локальный интерфейс.
    bash
    # Проверка доступности статуса локально
    curl -s http://localhost/nginx_status
    
  2. Настройка алертинга. Метрики бесполезны, если вы не узнаете о проблеме первыми. Настройте в Prometheus правила (Alertmanager) на резкий скачок 5xx ошибок или на падение количества активных соединений ниже критического порога.
  3. Проверка частоты сбора (scrape interval). Не ставьте слишком частый сбор данных (например, раз в 1 секунду), если у вас сотни инстансов Nginx — это создаст лишнюю нагрузку на сеть и хранилище метрик. Оптимально — 15–30 секунд.

Правильно выстроенный мониторинг превращает процесс устранения неполадок из гадания на кофейной гуще в планомерную работу с данными. Если вы только начинаете путь в управлении домашней лабораторией, рекомендую также изучить руководство по BorgBackup, чтобы обеспечить сохранность конфигураций и логов, которые вы теперь так тщательно собираете.

FAQ

Как понять, что Nginx отдает метрики в правильном формате?

Самый простой способ проверить работоспособность — выполнить запрос к эндпоинту, который вы настроили в конфигурации (обычно это /metrics). Если вы используете nginx-vts-exporter или нативный модуль, ответ должен соответствовать формату OpenMetrics.

Выполните команду curl прямо с сервера или с машины, где установлен Prometheus:

bash
curl -s http://localhost:9113/metrics | grep nginx_

Если вы видите список строк вида nginx_http_requests_total{status="200", method="GET"} 1250, значит, экспортер работает и данные доступны. Если в ответ приходит 404 или пустая строка, проверьте, запущен ли процесс экспортера и правильно ли указан порт в его конфиге.

Можно ли использовать стандартный stub_status для Prometheus?

Стандартный модуль ngx_http_stub_status_module даёт лишь базовую информацию: количество активных соединений, принятых и обработанных запросов, а также количество обработанных соединений. Этого достаточно для понимания общей нагрузки, но мало для глубокого анализа.

С практической точки зрения, stub_status не даёт разбивку по кодам ответов (4xx, 5xx), методам (GET, POST) или конкретным виртуальным хостам. Для полноценного мониторинга я рекомендую использовать настройку экспорта метрик Nginx в Prometheus через специализированные модули, такие как VTS. Это обеспечит ту самую предсказуемость данных, которая нужна при построении алертов на ошибки сервера.

Зачем нужен экспортер, если Nginx сам умеет отдавать статус?

Nginx — это веб-сервер, а не база данных временных рядов. Он умеет отдавать текстовый статус, но не умеет «общаться» с Prometheus по протоколу pull-модели так, чтобы это было удобно для хранения и агрегации.

Экспортер выступает в роли переводчика (адаптера). Он забирает сырые данные из Nginx, преобразует их в формат, понятный Prometheus, и предоставляет их по HTTP. Без этого звена вам придётся писать собственные скрипты для парсинга логов или текстового статуса, что нарушает принцип системного подхода. Если вы хотите построить надёжную инфраструктуру, лучше сразу использовать проверенные инструменты, как описано в материале про интеграцию Nginx с Prometheus.

Влияет ли сбор метрик на производительность сервера?

Любой дополнительный процесс потребляет ресурсы. Однако, если всё настроено правильно, влияние на CPU и RAM будет ничтожным.

Чтобы минимизировать нагрузку, придерживайтесь трёх правил:

  1. Не делайте слишком частый scrape. Интервал в 15–30 секунд для домашней лаборатории или среднего продакшена — это золотая середина.
  2. Ограничьте доступ к эндпоинту. Метрики не должны быть доступны всему интернету. Настройте allow и deny в секции location вашего конфига Nginx:
nginx
location /metrics {
    allow 127.0.0.1;    # Разрешаем только локальный запрос
    allow 192.168.1.0/24; # Разрешаем вашу подсеть мониторинга
    deny all;           # Всё остальное запрещаем
    stub_status;        # Или используйте vts_stat
}
  1. Используйте локальные сокеты или loopback. Это исключает лишние сетевые задержки при передаче данных от Nginx к экспортеру.

Часто задаваемые вопросы

Можно ли использовать stub_status вместо нативной интеграции?

Технически это возможно, но с точки зрения полноты данных вы получите крайне ограниченную картину. Модуль stub_status предоставляет лишь базовые показатели: количество активных соединений, принятых и обработанных запросов, а также количество ошибок. Для полноценного мониторинга, когда нужно отслеживать распределение статус-кодов (например, всплеск 5xx-ошибок) или специфику трафика, нативная интеграция даст гораздо больше предсказуемости.

Как сбор метрик влияет на производительность Nginx?

Влияние на производительность минимально, если конфигурация настроена грамотно. Сбор метрик — это дополнительная операция, но она не требует пересборки ядра и работает в рамках штатных механизмов обработки запросов. С практической точки зрения, основные ресурсы потребляются не самим сбором данных, а частотой опроса (scrape interval) со стороны Prometheus: если запрашивать метрики слишком часто, это создаст лишнюю нагрузку на CPU.

Нужно ли устанавливать дополнительный экспортер?

Если вы используете нативную поддержку метрик, то сторонний Nginx Exporter для сбора данных через stub_status становится избыточным. Нативная интеграция позволяет Prometheus забирать данные напрямую, что упрощает архитектуру и уменьшает количество запущенных процессов. Это особенно важно при размещении сервисов на домашнем сервере с ограниченными ресурсами, где каждый лишний контейнер или процесс имеет значение.

Что делать, если метрики не отображаются в Prometheus?

Во-первых, убедитесь, что Nginx успешно подхватил конфигурацию и модуль активен, проверив доступность эндпоинта через curl локально. Во-вторых, проверьте файл конфигурации Prometheus (prometheus.yml), чтобы убедиться, что в секции scrape_configs правильно указан IP-адрес и порт, на котором Nginx отдает метрики. Если вы используете Docker, проверьте, что контейнеры находятся в одной сети и порт проброшен наружу.

Поделиться:TelegramX / TwitterVK

Читайте также