Мониторинг PHP-FPM с помощью Proto Observability
Сбор метрик PHP-FPM
Введение
Проверка PHP-FPM отслеживает состояние ваших FPM-пулов и производительность обработки запросов.
- Убедитесь, что у вас установлен и настроен ProtoOBP Агент на сервере с PHP-FPM или в Kubernetes
- Включите страницу статуса PHP-FPM в конфигурации пула
- Настройте 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 агента
-
В файле конфигурации 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 -
Перезапустите 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