Настройка PHP-FPM status
Вывод PHP-FPM-статуса
1 |
pool |
– имя пула;
1 |
process manager |
– тип Process Manager (pm — dynamic, static, ondemand);
1 |
start time |
– время запуска FPM (FastCGI Process Manager);
1 |
start since |
– время в секундах с момента запуска;
1 |
accepted conn |
– количество обработанных пулом запросов;
1 |
listen queue |
– количество запросов в очереди на обработку этим пулом, если количество > 0 – надо подумать об увеличении количества процессов;
1 |
max listen queue |
– максимальное количество запросов, которые были в очереди с момента запуска пула;
1 |
listen queue len |
– количество запросов в очереди к сокету;
1 |
idle processes |
– количество процессов в idle статусе;
1 |
active processes |
– количество активных процессов;
1 |
total processes |
– общее количество процессов (idle + active processes);
1 |
max active processes |
– максимальное количество активных процессов с момента запуска пула;
1 |
max children reached |
– максимальное количество дочерних потоков PHP-FPM с момента запуска, если количество >0 – есть смысл подумать об увеличении pm.max_children;
1 |
slow requests |
– количество медленных запросов (должен быть включён slowlog).
По-умолчанию – status возвращает страницу в plain-text.
Что бы вызвать её в HTML – добавьте ?html:
1 |
http://mysite.com/status?html |
Или в Json:
1 |
http://mysite.com/status?json |
Что бы вывести больше информации – добавьте ?full
1 |
http://mysite.com/status?full |
Настройка Nginx на обработку запроса к PHP-FPM-статусу
В данном случае настраиваем отображение PHP-FPM-статистики в хосте по умолчанию т.е для доступа к
FPM-статус можно использовать IP-адрес сервера или его полное доменное имя
Например, необходимо мониторить статус пула, запущенных под пользователем myusername
В Nginx в хосте по умолчанию настраиваю поддержку FPM-статуса
1 |
# cat /etc/nginx/settings/php-fpm-myusername-status.conf |
1 2 3 4 5 6 7 8 9 10 11 12 |
location ~ ^/(status|ping)$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.1-fpm-myusername.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; access_log off; allow 127.0.0.1; allow 159.224.XXX.YYY; allow <IP-address-Zabbix-agent>; deny all; } |
1 |
# nano /etc/nginx/sites-enabled/default.conf |
1 2 |
include settings/php-fpm-myusername-status.conf; …… |
1 |
# nginx -t && service nginx reload |
Т.е fpm-статус будет досутупен у меня на
1 |
http://server1.mydomain.com/status |
Если дефолтный хост кроме внешного IP-адреса слушает также и localhost, то статистика может быть доступна на localhost
http://localhost/status
Настройка PHP-FPM-пула для поддержки FPM-статуса
1 |
# nano /etc/php/7.1/fpm/pool.d/myusername.conf |
1 2 3 4 5 |
…… pm.status_path = /status ping.path = /ping ping.response = pong … |
1 |
# php-fpm7.1 -t && systemctl reload php7.1-fpm |
Проверяем с командной строки с Zabbix-агента
1 |
# curl -sS --insecure --max-time 10 http://server1.mydomain.com/status |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pool: myusername process manager: dynamic start time: 19/Aug/2018:18:26:40 +0100 start since: 6293 accepted conn: 1452 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 7 active processes: 1 total processes: 8 max active processes: 2 max children reached: 0 slow requests: 0 |
1.Установка скрипта на Zabbix-агенте
1 |
# mkdir /etc/zabbix/scripts/ |
1 |
# chown root:zabbix -R /etc/zabbix/scripts/ |
1 |
# chmod 750 /etc/zabbix/scripts/ |
1 |
# nano /etc/zabbix/scripts/php-fpm.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#!/bin/bash ##### OPTIONS VERIFICATION ##### if [[ -z "$1" || -z "$2" ]]; then exit 1 fi ##### PARAMETERS ##### RESERVED="$1" METRIC="$2" STATSURL="$3" CURL=$(which curl) CACHE_TTL="55" CACHE_FILE="/tmp/zabbix.php-fpm.`echo $STATSURL | md5sum | cut -d" " -f1`.cache" EXEC_TIMEOUT="1" NOW_TIME=`date '+%s'` ##### RUN ##### if [ -s "${CACHE_FILE}" ]; then CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"` else CACHE_TIME=0 fi DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME})) # if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME})) elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then echo "" >> "${CACHE_FILE}" # !!! DATACACHE=`$CURL -sS --insecure --max-time 10 $STATSURL` echo "${DATACACHE}" > "${CACHE_FILE}" # !!! chmod 640 "${CACHE_FILE}" fi # if [ ${METRIC} = "uptime" ]; then cat ${CACHE_FILE} | grep -w 'start since: ' | awk '{print $3}' exit 0 fi if [ ${METRIC} = "max_listen_queue" ]; then cat ${CACHE_FILE} | grep -w 'max listen queue: ' | awk '{print $4}' exit 0 fi if [ ${METRIC} = "listen_queue_len" ]; then cat ${CACHE_FILE} | grep -w 'listen queue len: ' | awk '{print $4}' exit 0 fi if [ ${METRIC} = "listen_queue" ]; then cat ${CACHE_FILE} | grep -w 'listen queue: ' | grep -v max | awk '{print $3}' exit 0 fi if [ ${METRIC} = "total_processes" ]; then cat ${CACHE_FILE} | grep 'total processes: ' | awk '{print $3}' exit 0 fi if [ ${METRIC} = "active_processes" ]; then cat ${CACHE_FILE} | grep -w 'active processes: ' | awk '{print $3}' exit 0 fi if [ ${METRIC} = "idle_processes" ]; then cat ${CACHE_FILE} | grep 'idle processes: ' | awk '{print $3}' exit 0 fi if [ ${METRIC} = "max_active_processes" ]; then cat ${CACHE_FILE} | grep 'max active processes: ' | awk '{print $4}' exit 0 fi if [ ${METRIC} = "max_children_reached" ]; then cat ${CACHE_FILE} | grep 'max children reached: ' | awk '{print $4}' exit 0 fi if [ ${METRIC} = "slow_requests" ]; then cat ${CACHE_FILE} | grep 'slow requests: ' | awk '{print $3}' exit 0 fi if [ ${METRIC} = "accepted_conn" ]; then cat ${CACHE_FILE} | grep 'accepted conn: ' | awk '{print $3}' exit 0 fi |
Установка прав
1 |
# chown root:zabbix /etc/zabbix/scripts/php-fpm.sh |
1 |
# chmod 550 /etc/zabbix/scripts/php-fpm.sh |
За основу скрипта был взят скрипт по мониторингу Nginx отсюда
http://wiki.enchtex.info/howto/zabbix/nginx_monitoring
Скрипт предусматривает кеш, что позволяет сократить количество реальных обращений к серверу.
Время действия кеша в секундах должно устанавливается чуть меньше чем период опроса элементов(по умолчанию в скрипте используется кеширование на 55 секунд, а интервал обновления элементов настроен на 60 секунд)
Проверяем работу скрипта
1 |
# sudo -u zabbix /etc/zabbix/scripts/php-fpm.sh "none" uptime http://server1.mydomain.com/status |
1 |
6485 |
1 |
# cat /tmp/zabbix.php-fpm.14ce5f07ed79d38f1377e320c8eb7cc1.cache |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pool: myusername process manager: dynamic start time: 19/Aug/2018:18:26:40 +0100 start since: 6487 accepted conn: 1498 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 7 active processes: 1 total processes: 8 max active processes: 2 max children reached: 0 slow requests: 0 |
Если для проверки скрипт запускался с правами root, то он будет владельцем кэш файла — удалите кеш файл после проверок.
2.Настройка Zabbix-агента
1 |
# nano /etc/zabbix/zabbix_agentd.d/userparameter_php-fpm.conf |
1 2 |
###PHP-FPM Monitoring UserParameter=php-fpm[*],/etc/zabbix/scripts/php-fpm.sh "none" "$1" "$2" |
1 |
# service zabbix-agent restart |
Проверяем локально с Zabbix-агента
1 |
# zabbix_get -s 127.0.0.1 -k "php-fpm[uptime,http://server1.mydomain.com/status]" |
1 |
6825 |
3.Настройка Zabbix-сервера
Cкачиваем,распаковываем и импортируем шаблон php-fpm_export_templates.xml
Добавляем макрос с указанием URL, на котором доступен статус PHP-FPM-пула
Например, URL в данном случае http://server1.mydomain.com/status
1 |
Configuration->Host->Имя_хоста->Macros-> {$PHP_FPM_STATS_URL}=http://server1.mydomain.com/status |
Применяем шаблон к хосту
Проверяем,что через 1-2 минуты на хосте появились Item с именем PHP-FPM
1 |
Monitoring->Latest Data-> фильтруем по имени хоста в поле Hosts->PHP-FPM |
Примеры графиков:
Источник:
http://wiki.enchtex.info/howto/zabbix/nginx_monitoring
http://rtfm.co.ua/nginx-php-fpm-vklyuchenie-php-server-status/