Мониторинг PHP-FPM с помощью Proto Observability

Мониторинг состояния пулов PHP-FPM и отслеживание производительности обработки запросов

Сбор метрик PHP-FPM

Введение

Проверка PHP-FPM отслеживает состояние ваших FPM-пулов и производительность обработки запросов.

  1. Убедитесь, что у вас установлен и настроен ProtoOBP Агент на сервере с PHP-FPM или в Kubernetes
  2. Включите страницу статуса PHP-FPM в конфигурации пула
  3. Настройте ProtoOBP Агент для сбора метрик PHP-FPM

Конфигурация PHP-FPM

Убедитесь, что в конфигурации вашего FPM-пула (обычно /etc/php-fpm.d/www.conf или /etc/php/*/fpm/pool.d/www.conf) включены параметры статуса и пинга:

pm.status_path = /status
ping.path = /ping
ping.response = pong

Также необходимо настроить ваш веб-сервер (Nginx или Apache) для проксирования запросов на эти URL через PHP-FPM.

Пример конфигурации Nginx:

server {
    listen 81;
    server_name localhost;

    access_log off;
    allow 127.0.0.1;
    deny all;

    location ~ ^/(status|ping)$ {
        fastcgi_pass unix:/run/php-fpm/www.sock;
        # или TCP: fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Конфигурация ProtoOBP агента

  1. В файле конфигурации PHP-FPM проверки ProtoOBP Агента (/etc/protoobp-agent/conf.d/php_fpm.d/conf.yaml) укажите следующее:

    init_config:
    
    instances:
      ## URL страницы статуса FPM-пула.
      ## Должен соответствовать параметру pm.status_path в конфигурации пула.
      - status_url: http://localhost:81/status
    
        ## URL для проверки доступности FPM-пула.
        ## Должен соответствовать параметру ping.path в конфигурации пула.
        ping_url: http://localhost:81/ping
    
        ## Ожидаемый ответ на ping-запрос.
        ## Должен соответствовать параметру ping.response в конфигурации пула.
        ping_reply: pong
    
        ## Использовать прямое подключение по FastCGI вместо HTTP.
        ## По умолчанию: false
        use_fastcgi: false
    
  2. Перезапустите ProtoOBP Агента выполнив:

    systemctl restart protoobp-agent
    

Добавьте лейблы к контейнеру с PHP-FPM:

LABEL "com.protoobp.ad.check_names"='["php_fpm"]'
LABEL "com.protoobp.ad.init_configs"='[{}]'
LABEL "com.protoobp.ad.instances"='[{"status_url": "http://%%host%%/status", "ping_url": "http://%%host%%/ping", "use_fastcgi": false, "ping_reply": "pong"}]'

Добавьте необходимые аннотации и, опционально, лейблы к поду с PHP-FPM.

Пример Deployment с аннотациями для автодискаверинга агентом:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-fpm
  labels:
    app: php-fpm
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-fpm
  template:
    metadata:
      labels:
        app: php-fpm
        tags.proto.group/service: "my-php-fpm"  # тег для метрик PHP-FPM в ProtoOBP
        tags.proto.group/env: "dev"              # тег для метрик PHP-FPM в ProtoOBP
        tags.proto.group/version: "8.3"          # тег для метрик PHP-FPM в ProtoOBP
      annotations:
        ad.proto.group/php-fpm.checks: |-
          {
            "php_fpm": {
              "init_config": {},
              "instances": [
                {
                  "status_url": "http://%%host%%/status",
                  "ping_url": "http://%%host%%/ping",
                  "use_fastcgi": false,
                  "ping_reply": "pong"
                }
              ]
            }
          }          
    spec:
      containers:
        - name: php-fpm
          image: php:8.3-fpm
          ports:
            - name: fpm
              containerPort: 9000

Мониторинг нескольких пулов

Для мониторинга нескольких PHP-FPM пулов через один прокси-сервер (типичный сценарий в Kubernetes) настройте маршруты на разные инстансы PHP-FPM. Пример конфигурации Nginx:

server {
    ...

    location ~ ^/(status1|ping1)$ {
        access_log off;
        fastcgi_pass instance1_ip:instance1_port;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ ^/(status2|ping2)$ {
        access_log off;
        fastcgi_pass instance2_ip:instance2_port;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Если такой подход слишком громоздкий, установите use_fastcgi в true — в этом случае проверка будет обращаться напрямую к PHP-FPM по протоколу FastCGI, минуя прокси-сервер. Порт по умолчанию — 9000.

Собираемые данные

Метрики

Метрика Тип Описание
php_fpm_listen_queue_size gauge Размер очереди ожидающих подключений на сокете
php_fpm_processes_active gauge Количество активных процессов
php_fpm_processes_idle gauge Количество простаивающих процессов
php_fpm_processes_max_active count Максимальное количество одновременно работающих процессов
php_fpm_processes_max_reached count Количество раз, когда был достигнут лимит процессов
php_fpm_processes_total gauge Общее количество процессов
php_fpm_requests_accepted count Общее количество принятых запросов
php_fpm_requests_slow count Общее количество медленных запросов

Проверки доступности (Service Checks)

php_fpm_can_ping

Возвращает CRITICAL, если Агент не может получить ответ на ping-запрос от PHP-FPM.

Статусы: ok, critical

Валидация

Для проверки корректности конфигурации выполните команду статуса Агента и найдите php_fpm в секции Checks:

protoobp-agent status