cat /etc/redhat-release
CentOS/RHEL 7: # rpm -Uvh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm
yum install zabbix-agent
chkconfig zabbix-agent on
vim /etc/zabbix/zabbix_agentd.conf
#Server=zabbix.domain.ua
#ServerActive=zabbix.domain.ua
#Hostname=MyServer
#Include=/usr/local/etc/zabbix2/zabbix_agentd.d/
mkdir /etc/zabbix/zabbix_agentd.d/
service zabbix-agent start
MYSQL
mysql> GRANT USAGE ON *.* TO 'zabbix'@'%' IDENTIFIED BY 'mypass';
FLUSH PRIVILEGES;
vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
UserParameter=mysql.status[*],echo "show global status where Variable_name='$1';" | HOME=/var/lib/zabbix mysql -N | awk '{print $$2}'
UserParameter=mysql.size[*],bash -c 'echo "select sum($(case "$3" in both|"") echo "data_length+index_length";; data|index) echo "$3_length";; free) echo "data_free";; esac)) from information_schema.tables$([[ "$1" = "all" || ! "$1" ]] || echo " where table_schema=\"$1\"")$([[ "$2" = "all" || ! "$2" ]] || echo "and table_name=\"$2\"");" | HOME=/var/lib/zabbix mysql -N'
UserParameter=mysql.ping,HOME=/var/lib/zabbix mysqladmin ping | grep -c alive
UserParameter=mysql.version,mysql -V
vim /etc/zabbix/.my.cnf
[mysql]
user=zabbix
password=*****
[mysqladmin]
user=zabbix
password=*****
service zabbix-agent restart
NG
Сервер nginx вміє віддавати частину необхідної нам інформації про свій стан. Для цього його треба відповідним чином підготувати. Відкриваємо конфіг сервера і додаємо туди наступну конструкцію:
server {
listen localhost;
server_name status.localhost;
keepalive_timeout 0;
allow 127.0.0.1;
deny all;
location /server-status {
stub_status on;
}
access_log off;
}
Зберігаємо і перезапускаємо nginx, перед цим перевіривши його конфіг на помилки:
# nginx -t # systemctl restart nginx
Перевіряємо, чи можемо ми отримати необхідну інформацію:
# wget http://localhost/server-status

У поточній папці має з'явитися файл server-status приблизно такого змісту:
# cat server-status Active connections: 3 server accepts handled requests 156171 156171 318790 Reading: 0 Writing: 1 Waiting: 2
Якщо у вас так само, то все гаразд, можна рухатися далі. Якщо щось не виходить, то перевіряйте конфіги, дивіться логи. Це штатний функціонал, він має без проблем налаштовуватися і працювати.
Налаштування в zabbix моніторингу nginx
Ми будемо парсити отриманий файл server-status за допомогою скрипта. Для його роботи необхідно встановити пару пакетів:
# yum -y install curl zabbix-sender
Створимо папку, де будуть лежати наші скрипти для моніторингу:
# mkdir /etc/zabbix/scripts
І покладемо туди скрипт nginx.sh наступного змісту:
#!/bin/sh
PREFIX='nginx'
URL='http://127.0.0.1/server-status'
CURL='/usr/bin/curl'
TMP='/tmp/nginx-ping.tmp'
SENDER='/usr/bin/zabbix_sender'
CONFIG='/etc/zabbix/zabbix_agentd.conf'
if [ ! -x ${CURL} ]
then echo Seems, path to curl is incorrect or not installed. && exit 0
else if [ ! -x ${SENDER} ]
then echo Seems, path to zabbix_sender is incorrect or not installed. && exit 0
else if [ ! -f ${CONFIG} ]
then echo Seems, path to zabbix_agentd.conf is incorrect && exit 0
fi fi fi
read -a s <<< `(time ${CURL} --no-keepalive -s -m 9 ${URL}) 2>$TMP`
if [[ "${s[7]}" =~ ([0-9]+) ]]
then
echo "\
- ${PREFIX}.accepts ${s[7]}
- ${PREFIX}.connections.active ${s[2]}
- ${PREFIX}.connections.reading ${s[11]}
- ${PREFIX}.connections.waiting ${s[15]}
- ${PREFIX}.connections.writing ${s[13]}
- ${PREFIX}.handled ${s[8]}
- ${PREFIX}.requests ${s[9]}" | ${SENDER} -c ${CONFIG} -i - >/dev/null 2>&1
awk '/real/{split($2,a,"[ms]");print a[1]*60+a[2];}' $TMP
else
echo '-0.001'
fi
rm $TMP
exit 1
Робимо його виконуваним:
# chmod 0645 nginx.sh
Тепер відкриваємо конфіг заббікс агента і додаємо туди користувацький параметр:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.ping,/etc/zabbix/scripts/nginx.sh
Перезапускаємо агента:
# systemctl restart zabbix-agent
Далі нам потрібно додати новий шаблон для моніторингу. Завантажуємо його nginx.xml і відкриваємо web інтерфейс заббікса. Йдемо в розділ Configuration -> Templates і тиснемо Import:

Вибираємо файл і знову натискаємо Import:

Майже все готово. Тепер нам потрібно прикріпити доданий шаблон до web сервера, який ми моніторимо. Йдемо в Configuration -> Hosts, вибираємо потрібний сервер, відкриваємо вкладку Templates і підключаємо шаблон:

Тиснемо Update і чекаємо надходження свіжих даних. Перевірити їх можна в Monitoring -> Latest Data:
У шаблоні вже є кілька тригерів і графіків. Можете їх самі подивитися і відредагувати у властивостях шаблону або окремого хоста. Я віддаю перевагу створенню Screens з потрібним набором графіків. Ось так виглядає табло моніторингу nginx у мене:
На цьому налаштування моніторингу nginx закінчено, можна користуватися.
Підготовка php-fpm до моніторингу
Ми будемо моніторити наступні параметри php-fpm:
| active processes count | Кількість активних процесів |
| connections per sec | Кількість з'єднань за секунду |
| idle processes count | Кількість idle процесів |
| latency | Час відгуку в мілісекундах |
| length of listen queue | Розмір черги очікуваних підключень |
| max children reached | Скільки разів було досягнуто ліміту за процесами |
| max length of listen queue | Максимальний розмір черги підключень |
Пару слів про те, навіщо це потрібно і як користуватися отриманими даними. Цей моніторинг актуальний, якщо у вас динамічне створення процесів у php-fpm. Наприклад, якщо у вас значення max children reached регулярно більше одиниці, то вам рекомендується збільшити ліміт на максимальну кількість процесів, якщо дозволяють ресурси сервера. Те саме стосується і параметра length of listen queue. Якщо він більше нуля, то створюється черга із запитів, які не встигає обробити сервер. Необхідно збільшити кількість процесів, які зможуть обробити очікувані підключення.
Звернути увагу потрібно на параметр latency, якщо він регулярно більше 10-20 мс, то потрібно розбиратися, чому так повільно відповідає сервер. Решта інформації просто для статистики.
Приступаємо до налаштування. Встановимо fcgi:
# yum -y install fcgi
Тепер підготуємо pfp-fpm для збору статистики. Для цього ми знову скористаємося nginx. Редагуємо його конфіг, додаючи в ту саму секцію server, що й на попередньому етапі, наступну конструкцію:
location /status {
access_log off;
allow 127.0.0.1;
deny all;
include fastcgi_params;
fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Перезапускаємо nginx:
# systemctl restart nginx
Внесемо необхідні зміни в конфіг php-fpm — додамо один рядок:
# mcedit /etc/php-fpm.d/www.conf pm.status_path = /status
Перезапускаємо php-fpm:
# systemctl restart php-fpm
Перевіряємо, що за вказаною адресою ми отримуємо статистику php-fpm:
# wget http://127.0.0.1/status

Дивимося вміст файлу status:
# cat status pool: www process manager: dynamic start time: 10/Nov/2015:00:44:55 +0300 start since: 257703 accepted conn: 47066 listen queue: 0 max listen queue: 0 listen queue len: 0 idle processes: 7 active processes: 1 total processes: 8 max active processes: 40 max children reached: 1 slow requests: 0
Якщо у вас приблизно те саме, то все гаразд, php-fpm віддає інформацію про свій стан.
Налаштування в zabbix моніторингу php-fpm
Тепер готуємо для заббікса скрипт обробки отриманого стану:
# mcedit /etc/zabbix/scripts/php-fpm.sh
#!/bin/sh
PREFIX='php.fpm'
URL='http://127.0.0.1/status'
CURL='/usr/bin/curl'
TMP='/tmp/php-fpm-ping.tmp'
SENDER='/usr/bin/zabbix_sender'
CONFIG='/etc/zabbix/zabbix_agentd.conf'
if [ ! -x ${CURL} ]
then echo Seems, path to curl is incorrect or not installed. && exit 0
else if [ ! -x ${SENDER} ]
then echo Seems, path to zabbix_sender is incorrect or not installed. && exit 0
else if [ ! -f ${CONFIG} ]
then echo Seems, path to zabbix_agentd.conf is incorrect && exit 0
fi fi fi
(time ${CURL} --no-keepalive -sm3 ${URL}) 2>$TMP | awk --assign pr="- ${PREFIX}." '
/^accepted c/ {print pr"accepted_conn "$3}
/^active proc/ {print pr"active_processes "$3}
/^idle proc/ {print pr"idle_processes "$3}
/^listen queue:/ {print pr"listen_queue_len "$3}
/^max children reach/ {print pr"max_children_reached "$4}
/^max listen queue:/ {print pr"max_listen_queue_len "$4}' | ${SENDER} -c ${CONFIG} -i - 2>/dev/null | awk --assign t="${TMP}" '/^sent/{if($6==0){print"-0.001";print>t}}'
awk '/real/{split($2,a,"[ms]");print a[1]*60+a[2];}' $TMP
rm $TMP
exit 1
Робимо його виконуваним:
# chmod 0645 php-fpm.sh
Додаємо в конфіг заббікс агента ще один користувацький параметр:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=php.fpm.ping,/etc/zabbix/scripts/php-fpm.sh
Перезапускаємо агента:
# systemctl restart zabbix-agent
Далі, як і у випадку з nginx, йдемо у веб-інтерфейс і імпортуємо шаблон php-fpm.xml. Додаємо цей шаблон потрібному серверу і чекаємо на оновлення даних. Перевіряємо їх надходження як завжди у Monitoring -> Latest Data:

Якщо все гаразд, то перевіряйте графіки, створюйте потрібний вам Screen. У мене він виглядає так:
У шаблоні вже налаштовані 3 тригери, які спрацьовують при:
- падінні служби php-fpm
- числі робочих процесів менше 3-х
- часі відклику менше 10 ms за останні 10 вимірювань
Другий тригер можна прибрати або змінити, якщо у вас менша мінімальна кількість робочих процесів.
Висновок
Підіб'ємо підсумок того, що ми зробили:
- Налаштували сервер nginx таким чином, щоб він віддавав інформацію про свій стан і стан сервісу php-fpm.
- Створили скрипти для обробки інформації від веб-сервера і передачі їх заббіксу.
- Налаштували в заббікс-агенті за допомогою користувацьких параметрів передачу на сервер оброблених даних.
- Створили на сервері моніторингу потрібні шаблони і прикріпили їх до спостережуваних серверів.
- Об'єднали спостережувані параметри в Screen для зручного спостереження.
Тобто виконали весь комплекс дій для організації повноцінного моніторингу веб-сервера на базі nginx + php-fpm у zabbix.
Одне із застосувань подібного моніторингу — вибір швидшого хостингу для свого сайту. Наприклад, мені деякий час тому знадобилося змінити хостинг. Але як дізнатися, чи буде він швидшим за поточний чи ні. Характеристики приблизно у всіх однакові. Я просто взяв тестовий період, налаштував на сервері все, що мені потрібно, в тому числі моніторинг веб-сервера, переніс туди сайт і поспостерігав добу. Вже за часом відклику nginx і php-fpm мені стало зрозуміло, що новий хостинг швидший:




