Ваш сайт на Laravel 11 под Nginx работает стабильно, пока не приходит пик трафика. Вместо страниц — 502 ошибка, а вы не знаете, что перегружено: PHP-FPM, база данных или диск. Без мониторинга поиск причины занимает часы, а простой обходится в десятки тысяч рублей в месяц. Наши инженеры с сертификатами Prometheus и опытом внедрения на 50+ проектах настраивают полноценный стек мониторинга на Grafana и Prometheus. Вы видите реальную картину: загрузку CPU, очередь PHP-FPM, активные транзакции PostgreSQL — где узкое место, сразу понятно. Получите консультацию — оценим ваш проект за 1 день.
Почему Prometheus, а не традиционные системы?
Prometheus использует pull-модель: он сам опрашивает экспортёры по расписанию, что упрощает обнаружение новых целей и повышает надёжность. Prometheus предоставляет мощный язык запросов PromQL и гибкие возможности алертинга (из официальной документации). По сравнению с Zabbix, Prometheus в 2 раза быстрее при сборе метрик с 10 000 экспортёров. Интеграция с Grafana даёт гибкие дашборды, а Alertmanager отправляет уведомления в Slack, PagerDuty, email при срабатывании алертов.
Что входит в настройку мониторинга серверов?
Настройка мониторинга серверов на Grafana и Prometheus включает установку экспортёров системных метрик (Node Exporter), специализированных экспортёров для PHP-FPM, Nginx, Redis, PostgreSQL, а также создание дашбордов в Grafana и конфигурацию алертов в Alertmanager. Мы разворачиваем стек через Docker Compose, настраиваем правила срабатывания (высокий CPU, низкая память, заполнение диска, очередь PHP-FPM) с маршрутизацией в Slack и PagerDuty. Интегрируем кастомные метрики приложения на примере Laravel. В результате — полная видимость инфраструктуры.
Как развернуть стек мониторинга за 4–6 дней?
Процесс разбит на этапы, каждый из которых можно выполнять параллельно для нескольких серверов:
- Аудит инфраструктуры и проектирование — 1 день.
- Развёртывание Prometheus, Node Exporter и Grafana — 1–2 дня.
- Настройка Alertmanager с интеграциями (Slack, PagerDuty) — +1 день.
- Подключение экспортёров PHP-FPM, Nginx, Redis, PostgreSQL — +1–2 дня.
- Разработка кастомных метрик приложения — +1–2 дня.
- Создание дашбордов и проверка — 1 день.
- Документация и обучение — 1 день.
Стек компонентов:
[Серверы] → [Node Exporter] ←── [Prometheus] ←── [Alertmanager] → [Slack/PagerDuty]
[PHP-FPM] → [php-fpm_exporter] ↓
[Nginx] → [nginx-vts-exporter] [Grafana]
[Redis] → [redis_exporter]
[Postgres]→ [postgres_exporter]
Пример конфигурации Docker Compose
# docker-compose.monitoring.yml
services:
prometheus:
image: prom/prometheus:v2.50.1
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
- ./monitoring/alerts:/etc/prometheus/alerts
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d'
- '--storage.tsdb.retention.size=20GB'
- '--web.enable-lifecycle'
ports:
- "9090:9090"
alertmanager:
image: prom/alertmanager:v0.27.0
volumes:
- ./monitoring/alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- "9093:9093"
grafana:
image: grafana/grafana:10.3.0
environment:
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
GF_SERVER_ROOT_URL: https://grafana.example.com
GF_SMTP_ENABLED: "true"
GF_SMTP_HOST: smtp.example.com:587
volumes:
- grafana_data:/var/lib/grafana
- ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
ports:
- "3000:3000"
node-exporter:
image: prom/node-exporter:v1.7.0
command:
- '--path.rootfs=/host'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
volumes:
- /:/host:ro,rslave
pid: host
network_mode: host
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- "8080:8080"
volumes:
prometheus_data:
grafana_data:
Конфигурация Prometheus и правила алертов
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: production
region: eu-west-1
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
rule_files:
- /etc/prometheus/alerts/*.yml
scrape_configs:
- job_name: node
static_configs:
- targets:
- web01:9100
- web02:9100
- db01:9100
relabel_configs:
- source_labels: [__address__]
target_label: instance
- job_name: php-fpm
static_configs:
- targets: ['web01:9253', 'web02:9253']
- job_name: nginx
static_configs:
- targets: ['web01:9913', 'web02:9913']
- job_name: redis
static_configs:
- targets: ['redis:9121']
- job_name: postgres
static_configs:
- targets: ['db01:9187']
- job_name: myapp
metrics_path: /metrics
bearer_token: ${METRICS_TOKEN}
static_configs:
- targets: ['web01:8080', 'web02:8080']
# monitoring/alerts/servers.yml
groups:
- name: server.alerts
rules:
- alert: HighCPU
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "Высокая нагрузка CPU на {{ $labels.instance }}"
description: "CPU: {{ $value | printf "%.1f" }}%"
- alert: LowMemory
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10
for: 2m
labels:
severity: critical
annotations:
summary: "Критически мало памяти на {{ $labels.instance }}"
description: "Свободно: {{ $value | printf "%.1f" }}%"
- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|fuse.lxcfs"} / node_filesystem_size_bytes) * 100 < 15
for: 5m
labels:
severity: warning
annotations:
summary: "Мало места на диске {{ $labels.instance }}:{{ $labels.mountpoint }}"
- alert: HighPhpFpmQueue
expr: phpfpm_listen_queue > 10
for: 1m
labels:
severity: warning
annotations:
summary: "PHP-FPM очередь заполнена: {{ $value }} запросов"
- alert: PostgresDown
expr: pg_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "PostgreSQL недоступен на {{ $labels.instance }}"
- alert: SlowQueries
expr: rate(pg_stat_activity_max_tx_duration{state="active"}[5m]) > 30
for: 2m
labels:
severity: warning
annotations:
summary: "Долгие запросы PostgreSQL (>30 сек)"
Alertmanager настраивается на маршрутизацию уведомлений: критические алерты отправляются в PagerDuty, остальные — в Slack-каналы #monitoring и #incidents. Группировка по alertname и instance предотвращает спам.
Типичные ошибки при настройке алертов
При настройке алертов часто допускают ошибки. Неправильный scrape_interval: если интервал сбора слишком большой, алерт может сработать с опозданием — рекомендуем 15s. Игнорирование retention: по умолчанию Prometheus хранит данные 15 дней, для production стоит увеличить до 30 дней и ограничить размер. Отсутствие группировки алертов: без неё при массовом сбое придёт сотня уведомлений — Alertmanager должен группировать по alertname и instance.
Какие метрики критичны для веб-приложения?
Кроме системных, важно отслеживать метрики приложения, влияющие на Core Web Vitals: LCP (загрузка контента), TTFB (время ответа сервера), количество N+1 запросов. Наши дашборды включают панели с этими показателями, чтобы вы могли быстро оптимизировать производительность. Например, рост TTFB может сигнализировать о проблемах с PHP-FPM или базой данных, а увеличение LCP — об узких местах в рендеринге.
Кастомные метрики приложения (Laravel)
use Prometheus\CollectorRegistry;
use Prometheus\RenderTextFormat;
class MetricsController extends Controller
{
public function __invoke(CollectorRegistry $registry): Response
{
// Метрики Laravel
$registry->getOrRegisterGauge('myapp', 'queue_size', 'Queue jobs count', ['queue'])
->set(Queue::size('emails'), ['emails']);
$registry->getOrRegisterGauge('myapp', 'active_users', 'Active users in last 5 min')
->set(User::where('last_seen_at', '>', now()->subMinutes(5))->count());
$registry->getOrRegisterGauge('myapp', 'failed_jobs', 'Failed jobs total')
->set(DB::table('failed_jobs')->count());
$renderer = new RenderTextFormat();
return response($renderer->render($registry->getMetricFamilySamples()), 200)
->header('Content-Type', RenderTextFormat::MIME_TYPE);
}
}
Основные метрики для мониторинга
| Метрика | Источник данных | Экспортёр |
|---|---|---|
| Загрузка CPU | /proc/stat |
Node Exporter |
| Использование памяти | /proc/meminfo |
Node Exporter |
| Свободное место на диске | Файловая система | Node Exporter |
| Очередь PHP-FPM | PHP-FPM status | php-fpm_exporter |
| Запросы в секунду Nginx | Nginx status | nginx-vts-exporter |
| Количество команд Redis | Redis INFO | redis_exporter |
| Активные транзакции | PostgreSQL | postgres_exporter |
Начните с системных метрик, затем добавьте основные службы. Мы поможем определить критические показатели для вашего проекта. Получите консультацию инженера по выбору экспортёров.
График работ и сроки
| Этап | Срок |
|---|---|
| Аудит инфраструктуры и проектирование | 1 день |
| Развёртывание Prometheus + Node Exporter + Grafana | 1–2 дня |
| Настройка Alertmanager + Slack/PagerDuty | +1 день |
| Подключение экспортёров PHP-FPM, Nginx, Redis, PostgreSQL | +1–2 дня |
| Разработка кастомных метрик приложения | +1–2 дня |
| Создание дашбордов и проверка | 1 день |
| Документация и обучение | 1 день |
| Итого: полноценный production стек | 4–6 дней |
Свяжитесь с нами, чтобы обсудить детали внедрения мониторинга на вашем проекте. Наши инженеры с сертификатами Prometheus и опытом на 50+ проектах гарантируют стабильную работу и своевременное оповещение о проблемах. Закажите настройку мониторинга под ключ — оценим ваш проект за 1 день.







