Установка и настройка Prometheus + Node Exporter для мониторинга сервера: CPU, RAM, диск, сеть | AdminWiki

Установка и настройка Prometheus + Node Exporter для мониторинга сервера: CPU, RAM, диск, сеть

26 июля 2026 9 мин. чтения

Prometheus и Node Exporter - это проверенная связка для сбора и анализа системных метрик. Вы получаете данные о загрузке процессора, использовании оперативной памяти, дисковой активности и сетевом трафике за 15-20 минут после начала настройки. Это руководство проведет вас через установку двумя способами: в Docker-контейнерах для быстрого старта и через systemd для production-окружений.

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

Зачем нужен мониторинг сервера и почему Prometheus + Node Exporter

Сервер без мониторинга - это авария, о которой вы узнаете от пользователей. Процессор может уйти в 100% загрузки, память закончится, диск заполнится логами, а сетевой интерфейс упрется в пропускную способность. Prometheus решает эту проблему превентивно: вы видите тренды и аномалии до того, как они приведут к отказу.

Prometheus использует pull-модель - он сам опрашивает источники метрик через HTTP. Это упрощает настройку: вам не нужно настраивать очереди сообщений или агентов, которые пушат данные. Node Exporter - легковесный агент, который собирает метрики ядра Linux и отдает их в формате, понятном Prometheus. Связка покрывает четыре критических слоя инфраструктуры: CPU, RAM, диск и сеть.

Эти инструменты стали стандартом де-факто в индустрии. Их поддерживает Cloud Native Computing Foundation, они интегрируются с Grafana для визуализации и Alertmanager для оповещений. Если вы планируете развивать систему мониторинга дальше - например, добавить готовые дашборды и алерты - фундамент из Prometheus и Node Exporter останется неизменным.

Архитектура мониторинга: как Prometheus собирает метрики с Node Exporter

Архитектура проста и линейна. На целевом сервере запускается Node Exporter - он слушает порт 9100 и отдает метрики по HTTP-эндпоинту /metrics. Prometheus-сервер по расписанию (scrape_interval) отправляет GET-запрос на этот эндпоинт, забирает данные и сохраняет их в своей time-series базе. Это pull-модель: инициатором всегда выступает Prometheus.

Node Exporter не хранит метрики и не занимается их агрегацией. Его задача - один раз считать данные из /proc, /sys и других интерфейсов ядра, преобразовать в текстовый формат Prometheus и отдать по запросу. Prometheus отвечает за хранение, индексацию и выполнение запросов PromQL. Веб-интерфейс Prometheus на порту 9090 позволяет выполнять запросы, строить графики и проверять статус targets - целей, которые он опрашивает.

Target - это просто пара хост:порт, указанная в конфигурационном файле prometheus.yml. Вы можете опрашивать один сервер, десятки или сотни - Prometheus масштабируется горизонтально через federation, но для старта достаточно одного экземпляра.

Установка и запуск Node Exporter

Node Exporter нужно устанавливать на каждый сервер, метрики которого вы хотите собирать. Если Prometheus и Node Exporter работают на одной машине, используйте localhost. Если на разных - убедитесь, что порт 9100 открыт в файрволе.

Вариант 1: Запуск Node Exporter в Docker

Самый быстрый способ - одна команда:

docker run -d \
  --name node_exporter \
  --net=host \
  --restart=unless-stopped \
  prom/node-exporter:latest

Флаг --net=host критически важен. Без него Node Exporter не получит доступ к системным метрикам хоста - он будет видеть только изолированное сетевое пространство контейнера. Если вы не можете использовать host-сеть по соображениям безопасности, пробросьте порт явно: -p 9100:9100, но имейте в виду, что часть метрик (например, сетевые интерфейсы) может быть недоступна.

Проверьте, что контейнер запустился и отдает метрики:

docker logs node_exporter
curl http://localhost:9100/metrics

Вы увидите поток текстовых строк с метриками: node_cpu_seconds_total, node_memory_MemAvailable_bytes, node_network_receive_bytes_total и сотни других.

Вариант 2: Установка Node Exporter как systemd-сервиса

Для production-сред, где Docker не используется, Node Exporter устанавливается как нативный сервис. Скачайте актуальную версию с GitHub:

wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/

Создайте системного пользователя для сервиса:

sudo useradd -rs /bin/false node_exporter

Создайте unit-файл /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Запустите и включите автозапуск:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
sudo systemctl status node_exporter

Проверка - тот же curl на порт 9100. Если метрики отдаются, экспортер работает.

Установка и настройка Prometheus

Prometheus устанавливается один раз - это центральный сервер сбора метрик. Он может работать на той же машине, что и Node Exporter, или на выделенном хосте.

Вариант 1: Prometheus в Docker

Создайте конфигурационный файл prometheus.yml в удобной директории, например /opt/prometheus/prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

Запустите контейнер:

docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /opt/prometheus/data:/prometheus \
  --restart=unless-stopped \
  prom/prometheus:latest

Первый volume монтирует конфигурацию, второй - директорию для хранения данных time-series базы. Без второго volume данные потеряются при перезапуске контейнера.

Вариант 2: Prometheus как systemd-сервис

Скачайте и распакуйте бинарник:

wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar xzf prometheus-2.54.1.linux-amd64.tar.gz
sudo mv prometheus-2.54.1.linux-amd64/prometheus /usr/local/bin/
sudo mv prometheus-2.54.1.linux-amd64/promtool /usr/local/bin/
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo mv prometheus-2.54.1.linux-amd64/prometheus.yml /etc/prometheus/

Создайте пользователя и назначьте права:

sudo useradd -rs /bin/false prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Создайте unit-файл /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

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

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

Prometheus доступен на порту 9090. Откройте http://your-server-ip:9090 - вы увидите веб-интерфейс.

Конфигурация targets и проверка сбора метрик

Targets - это список конечных точек, которые Prometheus опрашивает для сбора метрик. Конфигурация targets - ключевой момент, от которого зависит, появятся ли данные в системе.

Настройка prometheus.yml для сбора метрик с Node Exporter

Секция scrape_configs в prometheus.yml определяет, что и как опрашивать. Минимальная конфигурация для одного сервера:

scrape_configs:
  - job_name: 'node_exporter'
    scrape_interval: 15s
    static_configs:
      - targets:
        - '192.168.1.100:9100'
        - '192.168.1.101:9100'
        labels:
          env: 'production'

Параметр job_name группирует метрики - все target'ы внутри одного job получают метку job="node_exporter". scrape_interval задает периодичность опроса (по умолчанию 15 секунд, можно уменьшить до 5 секунд для критичных систем). static_configs перечисляет IP-адреса и порты. Метки labels добавляют дополнительную размерность - например, разделение на production и staging.

После изменения prometheus.yml перезагрузите Prometheus: для systemd - sudo systemctl restart prometheus, для Docker - docker restart prometheus. Prometheus также поддерживает горячую перезагрузку конфигурации по сигналу SIGHUP, но полный рестарт надежнее на этапе настройки.

Проверка targets в веб-интерфейсе Prometheus

Откройте http://localhost:9090/targets. Вы увидите таблицу со статусами targets:

  • UP - Prometheus успешно опрашивает Node Exporter, метрики поступают. Зеленый индикатор.
  • DOWN - опрос не удался. Причины: Node Exporter не запущен, порт 9100 закрыт файрволом, неправильный IP-адрес в конфигурации, сетевые проблемы.

Если статус DOWN, проверьте по порядку: запущен ли Node Exporter на целевом хосте (systemctl status node_exporter или docker ps), отвечает ли порт 9100 (curl http://target-ip:9100/metrics с машины, где работает Prometheus), не блокирует ли файрвол соединение (sudo ufw status или sudo firewall-cmd --list-all).

Когда статус UP, метрики уже собираются. Проверьте несколько ключевых показателей через вкладку Graph в веб-интерфейсе:

  • node_cpu_seconds_total - счетчики процессорного времени в разрезе режимов (idle, user, system, iowait)
  • node_memory_MemAvailable_bytes - доступная память в байтах
  • node_disk_io_time_seconds_total - время, затраченное на дисковый ввод-вывод
  • node_network_receive_bytes_total - входящий сетевой трафик в байтах

Введите любой из этих запросов в строку Expression и нажмите Execute. Если данные отображаются в таблице или на графике - система работает.

Первичная настройка веб-интерфейса и визуализация метрик

Встроенный веб-интерфейс Prometheus не заменит Grafana по возможностям визуализации, но для быстрой проверки и отладки его достаточно. Вы выполняете запросы PromQL, переключаетесь между табличным представлением и графиком, анализируете сырые данные.

Выполнение первого запроса PromQL: загрузка CPU

Загрузка процессора в процентах - самый востребованный показатель. Prometheus хранит счетчики процессорного времени, которые монотонно растут. Чтобы получить процент загрузки, нужно вычислить скорость изменения счетчика и вычесть idle-режим из 100%:

100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

Разберем синтаксис:

  • node_cpu_seconds_total{mode="idle"} - фильтрует метрику, оставляя только время простоя процессора
  • rate(...[5m]) - вычисляет скорость изменения счетчика за 5-минутное скользящее окно. Это превращает монотонно растущий счетчик в секундную скорость
  • avg(...) - усредняет значения по всем ядрам процессора
  • 100 - (... * 100) - переводит долю idle в процент загрузки

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

Мониторинг использования RAM и дискового пространства

Доступная память в процентах:

(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

Этот запрос показывает, сколько процентов оперативной памяти свободно для использования. Значение ниже 10% - повод для беспокойства, ниже 5% - критическая ситуация.

Свободное дисковое пространство в гигабайтах:

node_filesystem_avail_bytes{mountpoint="/"} / 1024 / 1024 / 1024

Фильтр mountpoint="/" ограничивает выдачу корневым разделом. Без фильтра вы получите данные по всем точкам монтирования, включая временные файловые системы, что затруднит анализ. Для мониторинга конкретных разделов укажите соответствующий mountpoint: /var, /home, /data.

Эти три запроса - CPU, RAM, диск - закрывают 80% потребностей базового мониторинга. Для сети используйте rate(node_network_receive_bytes_total[5m]) и rate(node_network_transmit_bytes_total[5m]), фильтруя по device (например, device="eth0").

Типичные проблемы и их решение

При настройке связки Prometheus + Node Exporter встречаются повторяющиеся проблемы. Вот решения для самых частых ситуаций.

Node Exporter не отдает метрики. Проверьте, что порт 9100 не занят другим процессом: ss -tlnp | grep 9100. Если порт свободен, но экспортер не запускается, проверьте логи: для systemd - journalctl -u node_exporter -f, для Docker - docker logs node_exporter. Частая причина - бинарник скачан для другой архитектуры (например, arm64 вместо amd64).

Prometheus видит target как DOWN. Выполните curl с машины Prometheus до целевого хоста: curl -v http://target-ip:9100/metrics. Если соединение устанавливается, но данные не приходят - проблема на стороне Node Exporter. Если соединение отклоняется - проверьте файрвол: sudo ufw allow 9100/tcp или sudo firewall-cmd --add-port=9100/tcp --permanent. В облачных средах также проверьте security groups.

Нет метрик диска или сети в Docker. При запуске Node Exporter без --net=host контейнер изолирован от сетевых интерфейсов хоста и может не видеть реальные дисковые устройства. Решение - использовать --net=host или монтировать необходимые директории: -v /proc:/host/proc:ro -v /sys:/host/sys:ro и передавать флаги --path.procfs=/host/proc --path.sysfs=/host/sys.

Prometheus занимает слишком много дискового пространства. По умолчанию данные хранятся 15 дней. Для production-сред этого достаточно, но на тестовых серверах с ограниченным диском можно уменьшить retention: добавьте флаг --storage.tsdb.retention.time=7d в ExecStart unit-файла или в команду docker run.

Заключение: что дальше?

Вы развернули работающую систему мониторинга. Prometheus опрашивает Node Exporter, собирает метрики CPU, RAM, диска и сети, вы выполняете запросы PromQL и видите графики в веб-интерфейсе. Это минимально жизнеспособная конфигурация, которая уже приносит пользу: вы знаете, что происходит с сервером в реальном времени.

Следующий логический шаг - визуализация. Prometheus отлично собирает данные, но для построения информативных дашбордов используйте Grafana. Готовые дашборды для Node Exporter (например, ID 1860 на grafana.com) показывают все ключевые метрики на одном экране. Подробная инструкция по настройке - в руководстве по развертыванию полного стека мониторинга с Grafana.

Второй шаг - оповещения. Alertmanager отправляет уведомления в Telegram, Slack или email при выходе метрик за пороговые значения. Настройте алерты на высокую загрузку CPU, нехватку памяти или заполнение диска, чтобы узнавать о проблемах до того, как они повлияют на пользователей. Для углубленного изучения метрик Linux-сервера и настройки алертов обратитесь к руководству по ключевым метрикам и алертам Node Exporter.

Третий шаг - расширение мониторинга на другие сервисы. Подключите экспортеры для Nginx, PostgreSQL, Docker, Kubernetes. Каждый экспортер добавляется в scrape_configs аналогично Node Exporter - вы уже знаете, как это делать. Для комплексного взгляда на производительность инфраструктуры изучите обзор систем мониторинга от CLI-утилит до Prometheus.

Поделиться:
Сохранить гайд? В закладки браузера