Top.Mail.Ru
OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

Мониторинг Nginx: nginx-prometheus-exporter vs VTS — что выбрать

Два популярных способа мониторинга Nginx для Prometheus: официальный nginx-prometheus-exporter со stub_status и модуль VTS. Сравниваем установку, набор метрик, кардинальность и накладные расходы, безопасность; в конце — готовые конфиги.
Мониторинг Nginx: nginx-prometheus-exporter vs VTS — что выбрать

Если у вас в продакшене крутится Nginx, вопрос «что и как мониторить» быстро становится не риторическим. Классические графики CPU/Disk/Net говорят о железе, но не о живых HTTP-потоках: сколько запросов, где затык, почему растут 5xx и проседают апстримы. Для Prometheus существует два основных подхода: использовать официальный nginx-prometheus-exporter со встроенным модулем stub_status или подключить модуль VTS (Virtual Host Traffic Status) и отдать расширенные метрики через отдельный экспортер. В статье сравним эти варианты без фанатизма, посмотрим на типовые конфиги и разберём подводные камни.

Кратко о подходах

Оба пути решают одну задачу — получить метрики Nginx в формате Prometheus. Отличается источник данных и глубина метрик.

  • nginx-prometheus-exporter + stub_status: лёгкая установка, минимум зависимостей, базовые метрики по соединениям и запросам. Подходит как «быстрый старт» и для простых стендов.
  • VTS (ngx_http_vhost_traffic_status) + VTS-экспортер: больше деталей — по виртуальным хостам, апстримам, кэшу, кодам ответов. Требует модуля в Nginx и отдельного экспортера, более сложная эксплуатация.

Что такое nginx-prometheus-exporter

Это процесс-«прокси»: он периодически опрашивает Nginx по stub_status (или API NGINX Plus) и отдаёт преобразованные метрики в формате Prometheus. Для open-source Nginx из коробки доступен только stub_status — компактная сводка по соединениям и количеству запросов.

Ключевые метрики при работе со stub_status:

  • nginx_connections_active, nginx_connections_reading, nginx_connections_writing, nginx_connections_waiting
  • nginx_connections_accepted, nginx_connections_handled
  • nginx_http_requests_total — общее количество запросов

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

Что такое VTS (Virtual Host Traffic Status)

VTS — динамический модуль для Nginx (чаще в репозиториях как vhost_traffic_status), который собирает расширенную статистику и отдаёт её в JSON. На основе этого JSON работает отдельный VTS-экспортер, преобразуя данные в Prometheus-метрики.

Что даёт VTS:

  • Разрезы по серверным блокам, именам хостов и локациям (при желании).
  • Статистика по апстримам: активные/неактивные, время ответа, коды ответов, трафик.
  • Поддержка статуса кэша (если используете proxy_cache) и распределение по статусам HTTP.
  • Shared-memory зона для счётчиков — переживает перезагрузку (reload), но обнуляется при рестарте процесса.

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

Сравнение по ключевым критериям

1) Установка и совместимость

  • Exporter + stub_status: stub_status присутствует в большинстве пакетов Nginx. Нужен только конфиг локации и бинарник экспортера. Работает практически везде, в контейнерах и на bare-metal.
  • VTS: требуется модуль. На Debian/Ubuntu часто доступен пакет с префиксом libnginx-mod-http-vhost-traffic-status. На других системах может понадобиться сборка или использование сторонней сборки. Плюс нужен VTS-экспортер.

2) Глубина и количество метрик

  • Exporter + stub_status: основные показатели по соединениям и суммарным запросам. Этого хватает для базовой доступности и трендов нагрузки. Не даёт видимости по апстримам и кодам ответа.
  • VTS: детальная видимость — HTTP-коды, апстримы, серверные зоны, кэш. Можно строить SLI/SLO, отслеживать деградацию конкретных сервисов за балансировщиком, находить «тяжёлые» виртуальные хосты.

3) Кардинальность меток и нагрузка на Prometheus

  • Exporter + stub_status: очень низкая кардинальность, минимум серий — дешёво и сердито.
  • VTS: легко «положить» хранилище метрик, если бездумно расширять разрезы. Каждое имя хоста, локация, апстрим и код ответа множат число метрик. Нужна дисциплина: отбирать нужные лейблы и аккуратно включать фильтры.

4) Накладные расходы и производительность

  • Exporter + stub_status: запрос к очень лёгкой странице статуса, парсинг простого ответа — накладные расходы обычно пренебрежимо малы.
  • VTS: сбор детальной статистики требует больше работы на каждом запросе и дополнительной памяти в shared zone. На умеренных нагрузках это, как правило, приемлемо; на сверхнагруженных фронтах — измеряйте и будьте готовы отключать избыточные разрезы.

5) Безопасность

  • В обоих случаях страницу статуса надо изолировать: слушать только на 127.0.0.1 или закрывать по allow/deny, можно повесить базовую авторизацию, если требуется диагностика через браузер.
  • Экспортер должен ходить локально — не раскрывайте статус наружу. Для продвинутых сценариев используйте отдельный listen на localhost.

6) Обслуживание и обновления

  • Exporter + stub_status: минимум подвижных частей. При обновлении Nginx почти ничего не ломается.
  • VTS: следите за совместимостью модуля с вашей версией Nginx. Иногда релизы Nginx меняют API модулей, и модуль нужно обновлять.

7) Поведение при reload/restart

  • stub_status: счётчики привязаны к процессу. При reload числа продолжают расти, при полном рестарте — обнуляются. Используйте функции rate() в PromQL.
  • VTS: данные лежат в shared memory зоне модуля — переживают reload, обнуляются на полный рестарт демона или пересоздание зоны.

8) Контейнеры и Kubernetes

  • Exporter + stub_status: ставится как sidecar или отдельный deployment, минимальные требования.
  • VTS: образ Nginx должен содержать модуль, или используйте сборки, где модуль уже включён. Это усложняет базовый образ и пайплайн.

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

Схема: stub_status и Prometheus exporter для Nginx

Практика: быстрый старт с nginx-prometheus-exporter и stub_status

Включим stub_status на локальном интерфейсе и поднимем экспортер.

1) Конфигурация Nginx

# /etc/nginx/conf.d/stub_status.conf
server {
    listen 127.0.0.1:8080;
    server_name localhost;

    location /stub_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

Перезагрузите конфиг:

nginx -t
systemctl reload nginx

2) Запуск экспортера (systemd)

# /etc/systemd/system/nginx-prometheus-exporter.service
[Unit]
Description=NGINX Prometheus Exporter
After=network.target

[Service]
Type=simple
User=nobody
Group=nobody
ExecStart=/usr/local/bin/nginx-prometheus-exporter -nginx.scrape-uri=http://127.0.0.1:8080/stub_status -telemetry.address=0.0.0.0:9113 -telemetry.endpoint=/metrics
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

Обратите внимание: строка ExecStart должна быть одной строкой. Если нужно читабельно разнести аргументы, используйте EnvironmentFile и подставляйте переменные.

Запустите сервис:

systemctl daemon-reload
systemctl enable --now nginx-prometheus-exporter.service

3) Scrape-конфиг для Prometheus

# fragment of prometheus.yml
scrape_configs:
  - job_name: nginx
    static_configs:
      - targets: ['127.0.0.1:9113']

Далее проверьте графики: соединения, скорость запросов через rate(nginx_http_requests_total[1m]). Базовые алёрты на рост 5xx лучше строить по логам или VTS, потому что stub_status коды ответа не различает.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Практика: расширенный мониторинг через VTS

План действий: установить модуль, включить зону VTS, отдать JSON и подключить VTS-экспортер.

1) Установка модуля

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

2) Конфигурация VTS в Nginx

# /etc/nginx/nginx.conf (фрагмент в верхнем уровне)
load_module modules/ngx_http_vhost_traffic_status_module.so;

http {
    vhost_traffic_status_zone;
    # По умолчанию vts будет собирать метрики по server{};
    # Дополнительно можно включить фильтры, но осторожно с кардинальностью.
}

Добавим эндпоинт статуса на localhost:

# /etc/nginx/conf.d/vts_status.conf
server {
    listen 127.0.0.1:8081;
    server_name localhost;

    location /status {
        vhost_traffic_status_display;
        vhost_traffic_status_display_format json;
        allow 127.0.0.1;
        deny all;
    }
}

Тест и перезагрузка:

nginx -t
systemctl reload nginx

3) Экспортер для VTS (systemd)

VTS-экспортер — отдельный процесс, который опрашивает JSON и выдаёт метрики Prometheus.

# /etc/systemd/system/nginx-vts-exporter.service
[Unit]
Description=NGINX VTS Prometheus Exporter
After=network.target

[Service]
Type=simple
User=nobody
Group=nobody
ExecStart=/usr/local/bin/nginx-vts-exporter -nginx.scrape_uri=http://127.0.0.1:8081/status/format/json -telemetry.addr=:9913 -telemetry.path=/metrics
Restart=always
RestartSec=2

[Install]
WantedBy=multi-user.target

Запуск:

systemctl daemon-reload
systemctl enable --now nginx-vts-exporter.service

4) Scrape-конфиг для Prometheus

# fragment of prometheus.yml
scrape_configs:
  - job_name: nginx-vts
    static_configs:
      - targets: ['127.0.0.1:9913']

Теперь у вас появятся метрики вида nginx_vts_server_requests_total, nginx_vts_upstream_requests_total, nginx_vts_upstream_response_seconds с лейблами по серверным именам, апстримам и кодам ответа. Это позволяет строить SLI по конкретным сервисам за Nginx, искать деградацию апстримов и измерять долю ошибок.

Обзор метрик VTS по апстримам и виртуальным хостам

Производительность и типичные ошибки

  • Частота опроса: разумный интервал 15–30 секунд. Слишком частый опрос увеличивает overhead и объём метрик.
  • Кардинальность VTS: не включайте детальные фильтры (например, по локациям), если реально не используете эти графики.
  • Изоляция эндпоинта: держите статус на 127.0.0.1. Если нужен доступ снаружи — ограничьте allow/deny и при необходимости включите базовую авторизацию.
  • Падение экспортера: чаще всего это неверный scrape_uri или недоступность локального порта. Проверьте логи и доступность локации curl-ом на локалхосте.
  • Обнуление счётчиков: это норма при рестарте процесса. Стройте графики через rate(), алёрты — через increase() и процентные доли.

Минимальные алёрты (PromQL)

# Рост 5xx по VTS (за 5 минут) больше 1% от всех запросов
sum by (server) (increase(nginx_vts_server_requests_total{code=~"5.."}[5m]))
  /
sum by (server) (increase(nginx_vts_server_requests_total[5m]))
  > 0.01

# Высокая доля 4xx на апстриме (за 10 минут) больше 5%
sum by (upstream) (increase(nginx_vts_upstream_requests_total{code=~"4.."}[10m]))
  /
sum by (upstream) (increase(nginx_vts_upstream_requests_total[10m]))
  > 0.05

# Перегрузка по активным соединениям (stub_status)
nginx_connections_active > 10000

Когда выбирать каждый вариант

Нет универсального ответа. Выбор зависит от того, насколько глубокую наблюдаемость вы хотите получить и сколько усилий готовы потратить на сопровождение.

  • Берите nginx-prometheus-exporter + stub_status, если нужен быстрый, надёжный и простой мониторинг: жив ли фронт, как растёт трафик, насколько много соединений. Отлично для минимальных стендов, статики, простых API-шлюзов.
  • Берите VTS + VTS-экспортер, если важны разрезы по апстримам, кодам ответов и виртуальным хостам: микросервисы, сложные балансировки, наличие кэша. Будьте готовы контролировать кардинальность и обновления модуля.
  • Если у вас NGINX Plus, логично использовать официальный экспортер в режиме опроса API Plus — получите богатые метрики без внешних модулей.

Практические советы по эксплуатации

  • Храните экспортёры под systemd с рестартом и health-логикой. Следите за их RAM/CPU в тех же Prometheus-мониторингах.
  • Готовьте отдельные dashboards: базовый (stub_status) и расширенный (VTS). Так проще разделить ответственность и ускорить онбординг.
  • Для «тяжёлых» инсталляций VTS, где много хостов и апстримов, полезно сегментировать метрики по инстансам и группам сервисов, чтобы не раздувать общий TSDB.
  • Если меняете конфиг и метрики, заранее договоритесь об именовании лейблов и стабильности контрактов, иначе поломаете алёрты и панели.
  • Для безопасного вынесения балансировщиков и мониторинга на отдельные инстансы используйте VDS — проще изолировать ресурсы и доступ.

Итоги

Экспортер со stub_status — это простота, надёжность и нулевой порог входа. VTS — детальная наблюдаемость, но с ценой в виде большего числа метрик, зависимости от модуля и необходимости дисциплины. Для большинства минимальных и средних инсталляций разумно начать со stub_status, а затем добавлять VTS точечно, где действительно нужны разрезы по апстримам и кодам ответов. Такой путь экономит ресурсы, сохраняет простоту эксплуатации и даёт нужную глубину там, где она окупается.

Поделиться статьей

Вам будет интересно

PHP 8 JIT в продакшене: измеряем пользу и понимаем ограничения OpenAI Статья написана AI (GPT 5)

PHP 8 JIT в продакшене: измеряем пользу и понимаем ограничения

JIT в PHP 8 компилирует «горячий» PHP-код в машинные инструкции и обещает ускорение. Разбираем, что это даёт в реальном продакшене ...
OpenVPN vs WireGuard на VDS: производительность, безопасность и миграция OpenAI Статья написана AI (GPT 5)

OpenVPN vs WireGuard на VDS: производительность, безопасность и миграция

Что выбрать для VPN на VDS — OpenVPN или WireGuard? Без фанатизма разбираем архитектуру, реальную производительность на виртуалке, ...
Переезд с Let's Encrypt на коммерческий DV: SAN, цепочки и автоматизация обновления OpenAI Статья написана AI (GPT 5)

Переезд с Let's Encrypt на коммерческий DV: SAN, цепочки и автоматизация обновления

Если пришло время уйти от Let's Encrypt на коммерческий DV, важно сделать это без простоев и сюрпризов для клиентов. Разберём SAN, ...