Полный гайд по настройке мониторинга сети и сервисов
Чтобы настроить сервер мониторинга интернета, используйте связку Prometheus (сбор метрик), Blackbox Exporter (проверка доступности сайтов и портов), Loki (хранение логов) и Grafana (визуализация). Для уведомлений подключите Alertmanager, который будет отправлять алерты в Telegram, Slack или на почту при падении сервисов или превышении времени отклика.
Эта статья поможет развернуть надежную систему контроля за 1–2 часа, избегая сложных корпоративных решений вроде Zabbix или Nagios, если вам нужен современный и легковесный стек.
Кому подойдет это решение:
- Администраторам небольших и средних инфраструктур.
- Разработчикам, желающим контролировать uptime своих проектов.
- Компаниям, которым нужна прозрачная история доступности сервисов (SLA).
Выбор архитектуры и инструментов
Для эффективного контроля доступности, логирования и оповещений лучше всего подходит модульная архитектура. Монолитные системы часто избыточны и сложны в поддержке.
Рекомендуемый стек (Open Source):
- Сбор метрик доступности:
Prometheus+Blackbox Exporter. Blackbox позволяет пинговать HTTP/HTTPS, TCP, DNS и ICMP извне, имитируя действия реального пользователя. - Сбор системных метрик:
Node Exporter. Устанавливается на каждый сервер для отслеживания CPU, RAM, диска и сети. - Логирование:
Promtail(сборщик) +Loki(хранилище). Легковесная альтернатива Elasticsearch, идеально интегрируется с Grafana. - Визуализация и алертинг:
Grafana+Alertmanager. Grafana строит дашборды, Alertmanager маршрутизирует уведомления.
Почему не Ping?
Обычный ping (ICMP) показывает только доступность хоста. Он не скажет вам, упал ли веб-сервер (ошибка 500), истек ли SSL-сертификат или зависла база данных. Blackbox Exporter решает эти проблемы, проверяя приложение на уровне протоколов.
Установка и базовая настройка стека
Самый быстрый способ развернуть систему — использовать Docker Compose. Создайте файл docker-compose.yml на вашем сервере мониторинга.
1. Конфигурация Docker Compose
version: '3'
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
ports:
- "9090:9090"
blackbox-exporter:
image: prom/blackbox-exporter:latest
volumes:
- ./blackbox.yml:/etc/blackbox/blackbox.yml
ports:
- "9115:9115"
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # Смените пароль!
volumes:
- grafana_data:/var/lib/grafana
volumes:
prometheus_data:
grafana_data:
2. Настройка Prometheus (prometheus.yml)
Здесь мы указываем, откуда брать данные. Важно добавить задачу для сканирования через Blackbox.
global:
scrape_interval: 15s
scrape_configs:
# Сбор метрик с самого Prometheus
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Проверка доступности сайтов (через Blackbox)
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx] # Ищем успешный ответ
static_configs:
- targets:
- https://google.com
- https://mysite.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115 # Адрес контейнера blackbox
Совет по безопасности: Не храните пароли в открытом виде в docker-compose.yml. Используйте .env файлы или secrets management инструменты для продакшена.
Контроль доступности (Uptime Monitoring)
Главная задача — понимать, работает ли сервис. Мы настроим проверки двух типов: внешние (из интернета) и внутренние (из локальной сети).
Типы проверок в Blackbox Exporter
- HTTP/HTTPS: Проверяет код ответа (ожидается 200), время отклика и наличие определенных слов на странице.
- TCP: Проверяет, открыт ли порт (например, 3306 для MySQL или 22 для SSH).
- DNS: Проверяет разрешение доменного имени и время ответа DNS-сервера.
- ICMP: Классический пинг хоста.
Настройка модулей (blackbox.yml)
Стандартный конфиг уже содержит модуль http_2xx. Для более строгого контроля можно создать кастомный модуль, который проверяет также скорость загрузки:
modules:
http_2xx_fast:
prober: http
timeout: 5s
http:
valid_status_codes: [200]
preferred_ip_protocol: "ip4"
fail_if_body_not_matches_regexp:
- "Welcome" # Пример: проверка наличия ключевого слова
Ключевые метрики для дашборда
В Grafana добавьте следующие графики:
probe_success: 1 — сайт доступен, 0 — упал.probe_duration_seconds: время полной проверки.probe_http_duration_seconds{phase="tls"}: время рукопожатия SSL (поможет выявить проблемы с сертификатами или шифрованием).
Логирование: сбор и анализ
Метрики говорят что случилось, логи объясняют почему.
Настройка Promtail
Promtail читает логи с серверов и отправляет их в Loki. В файле promtail-config.yml укажите пути к логам ваших приложений (nginx, apache, app logs).
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
Корреляция событий
В Grafana вы можете настроить переключение между вкладками "Metrics" и "Logs". Если график probe_success падает до 0, кликните на этот момент времени — справа откроются логи Nginx за эту же секунду. Это сокращает время диагностики с часов до минут.
Ротация логов: Loki хранит данные эффективно, но не бесконечно. Настройте политику хранения (retention) в конфиге Loki, например, 7 дней для детальных логов и 30 дней для агрегированных метрик, чтобы не забить диск.
Настройка уведомлений (Alerting)
Бессмысленно мониторить систему, если вы узнаете о падении только от пользователей.
1. Правила алертов в Prometheus
Создайте файл rules.yml и подключите его в prometheus.yml.
groups:
- name: uptime_alerts
rules:
- alert: SiteDown
expr: probe_success == 0
for: 1m # Ждем 1 минуту, чтобы исключить ложные срабатывания
labels:
severity: critical
annotations:
summary: "Сайт {{ $labels.instance }} недоступен"
description: "Сервис не отвечает уже более 1 минуты."
- alert: HighLatency
expr: probe_duration_seconds > 2
for: 5m
labels:
severity: warning
annotations:
summary: "Высокая задержка на {{ $labels.instance }}"
2. Интеграция с Telegram через Alertmanager
В alertmanager.yml настройте получателей. Для Telegram потребуется создать бота через @BotFather и узнать свой Chat ID.
route:
receiver: 'telegram-notifications'
receivers:
- name: 'telegram-notifications'
telegram_configs:
- bot_token: 'ВАШ_ТОКЕН_БОТА'
chat_id: ВАШ_CHAT_ID
send_resolved: true # Присылать уведомление, когда все починилось
Структура идеального уведомления
Уведомление должно содержать:
- Статус: CRITICAL или WARNING.
- Объект: Какой именно сервис упал (домен или IP).
- Длительность: Как долго длится проблема.
- Ссылка: Прямая ссылка на дашборд Grafana с фильтром по этому хосту.
Частые ошибки при настройке
- Отсутствие гистерезиса (дребезг): Если порог срабатывания равен порогу восстановления, алерты будут сыпаться постоянно при колебаниях нагрузки.
- Решение: Используйте параметр
forв правилах Prometheus (как в примере выше:for: 1m).
- Решение: Используйте параметр
- Мониторинг "сам себя": Если сервер мониторинга упадет, вы ничего не узнаете.
- Решение: Используйте внешний независимый сервис (например, бесплатный UptimeRobot) для мониторинга самого сервера с Prometheus/Grafana.
- Игнорирование SSL-сертификатов: Сайт может работать, но сертификат истек.
- Решение: Добавьте проверку
probe_ssl_earliest_cert_expiryи алерт, если до истечения осталось менее 14 дней.
- Решение: Добавьте проверку
- Слишком частый опрос: Интервал
scrape_intervalв 5 секунд для внешних сайтов создаст лишнюю нагрузку и может быть расценен как DDoS.- Решение: Для внешних проверок достаточно 60–120 секунд. Для внутренних метрик — 15 секунд.
FAQ
Вопрос: Хватит ли одного сервера для мониторинга 50+ сайтов? Да, Prometheus и Blackbox Exporter очень легковесны. Один небольшой VPS (1 vCPU, 1GB RAM) справится с тысячами проверок в минуту, если не хранить историю метрик годами.
Вопрос: Как мониторить сайты, закрытые фаерволом от внешнего мира?
Установите blackbox-exporter внутри периметра сети (в той же подсети, что и сервисы) и настройте Prometheus на опрос этого внутреннего экспортера. Так вы будете знать о доступности сервиса для внутренних пользователей или бэкендов.
Вопрос: Можно ли получать звонки при падении критических сервисов? Да, Alertmanager поддерживает интеграцию с PagerDuty, OpsGenie и телефонией через вебхуки. Для критической инфраструктуры (финансы, медицина) это обязательная практика.
Вопрос: Чем Loki лучше ELK (Elasticsearch)? Loki не индексирует содержимое логов, а только метаданные (лейблы). Это делает его в разы дешевле по ресурсам диска и RAM. Для задач мониторинга и дебага этого достаточно. Полнотекстовый поиск в Loki тоже возможен, но работает медленнее, чем в ES.