
Решил у нас в Имхонете сделать мониторинг PHP-FPM, чтобы все было как у нормальных пацанов. Советы в интернете сводятся к тому, чтобы включить статус и проксировать запросы в него через Nginx. Но я считаю, что это как ездить на метро с пересадкой, при условии что пешком дойти ближе и быстрее, поэтому сделал все сам.
Обзор
PHP-FPM
В самом PHP-FPM нам нужно только включить страницу статуса и ответ на пинг запрос. Для этого в конфиг пула (по умолчанию это /etc/php/fpm/pool.d/www.conf
) нужно добавить следующие строки:
pm.status_path = /status
ping.path = /ping
И перезагрузить демон:
$ /etc/init.d/php-fpm restart
Zabbix
Cкрипт
Первую реализацию я написал на Bash, сначала напишу его разбор а потом приведу целиком.
Первой строкой указываем чем необходимо выполнять скрипт:
#!/usr/bin/env bash
Записываем в переменную подсказку по использованию скрипта:
help="Usage: fcgi <ip or dns for check> <port> <check type, maybe ping or status> <parameter, only for status>\nExample: fcgi 127.0.0.1 3000 ping"
В скрипте есть три функции ping
- для простой проверки, status
- для получения пар параметр:значение и status_clear
- для получения статуса без парсинга:
function ping {
SCRIPT_NAME=/ping SCRIPT_FILENAME=/ping REQUEST_METHOD=GET cgi-fcgi -bind -connect $address:$port
}
function status {
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect $address:$port | sed -n "$1p;$1q" | awk -F: '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
function status_clear {
SCRIPT_NAME=/status SCRIPT_FILENAME=/status REQUEST_METHOD=GET cgi-fcgi -bind -connect $address:$port
}
После объявления функций сетим переменные:
address=$1
port=$2
parameter=$4
Ну и дальше основная обработка, в зависимости от типа проверки и параметров вызываются функции и каким-либо образом обрабатываются:
case "$3" in
"ping" )
ping | tail -n1
;;
"status" )
case "$parameter" in
"pool" )
status_clear | sed -n '6p;6q' | awk '{print $2}'
;;
"version" )
status_clear | sed -n '1p;1q' | awk -F/ '{print $2}'
;;
"process_manager" )
status 7
;;
"accepted_conn" )
status 10
;;
"listen_queue" )
status 11
;;
"max_listen_queue" )
status 12
;;
"listen_queue_len" )
status 13
;;
"idle_processes" )
status 14
;;
"active_processes" )
status 15
;;
"total_processes" )
status 16
;;
"max_active_processes" )
status 17
;;
"max_children_reached" )
status 18
;;
"slow_requests" )
status 19
;;
"latency" )
time=$(date +%s%N)
ping >> /dev/null
echo "$(( ($(date +%s%N)-$time) / 1000000 ))"
;;
"all" )
status_clear
;;
* )
echo -e "Bad command!\n$help"
;;
esac
;;
* )
echo -e "Bad command $3!\n$help"
;;
esac
Скрипт полностью можно скачать здесь. Чтобы использвать его во внешних проверках нужно:
- Переместить его в каталог
/usr/lib/zabbix/externalscripts/
- Переименовать
fcgi.txt
->fcgi
- Сделать исполняемым
chmod +x fcgi
- Установить пользователя
chown -R zabbix:zabbix fcgi
Также для работы скрипта должна быть установлена программа cgi-fcgi
в Debian пакет для установки называется fcgiwrap
.
Шаблон
Сам шаблон можно скачать тут. После импорта его необходимо подключить к узлам на которых крутится PHP-FPM. Для запросов используются две переменные: встроенная HOST.CONN
и макрос FPM_PORT
добавленный мной, по дефолту там стоит значение 3000
.
В шаблоне несколько итемов, 2 триггера, графики и даже скрины, все как положено.
Заключение
Таким образом я решил задачу мониторинга необходимых нам параметров, но эту реализация считаю недостаточной. В дальнейшем хочу переписать его на golang c использованием вот этой библиотеки. Так как это внешняя проверка она должна работать быстро, а bash
не подходит по этому параметру. Если у вас есть рекомендации или доработки пишите мне на почту или в Twitter.
UPD
Переписал скрипт на Golang и выложил в open source, подробнее можно почитать вот тут.
#Zabbix #Php-fpm #TechAndDev