Ваш сайт на 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 день.







