Crmgo Блог

Zabbix-agent + моніторинг Mysql, Nginx, php-fpm на Centos

Zabbix-agent + моніторинг Mysql, Nginx, php-fpm на Centos

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 |…

Zabbix-agent + моніторинг Mysql, Nginx, php-fpm на Centos
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

nginx 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:

імпорт шаблону в zabbix

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

вибір шаблону для імпорту

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

підключення шаблону до сервера

Тиснемо Update і чекаємо надходження свіжих даних. Перевірити їх можна в Monitoring -> Latest Data:

перегляд інформації, що надходить

У шаблоні вже є кілька тригерів і графіків. Можете їх самі подивитися і відредагувати у властивостях шаблону або окремого хоста. Я віддаю перевагу створенню Screens з потрібним набором графіків. Ось так виглядає табло моніторингу nginx у мене:

моніторинг nginx в zabbix

На цьому налаштування моніторингу nginx закінчено, можна користуватися.

Підготовка php-fpm до моніторингу

Ми будемо моніторити наступні параметри 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;
}
Звертаю вашу увагу на те, що я у своїй конфігурації використовую підключення до php-fpm через unix сокет. За це відповідає параметр конфігурації fastcgi_pass. Якщо ви використовуєте в роботі tcp/ip порт, зазвичай 127.0.0.1:9000, то потрібно вказати його замість сокета, ось так: fastcgi_pass 127.0.0.1:9000

Перезапускаємо 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

php-fpm 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:

дані моніторингу php-fpm

Якщо все гаразд, то перевіряйте графіки, створюйте потрібний вам Screen. У мене він виглядає так:

налаштування моніторингу php-fpm у zabbix

У шаблоні вже налаштовані 3 тригери, які спрацьовують при:

  • падінні служби php-fpm
  • числі робочих процесів менше 3-х
  • часі відклику менше 10 ms за останні 10 вимірювань

Другий тригер можна прибрати або змінити, якщо у вас менша мінімальна кількість робочих процесів.

Висновок

Підіб'ємо підсумок того, що ми зробили:

  1. Налаштували сервер nginx таким чином, щоб він віддавав інформацію про свій стан і стан сервісу php-fpm.
  2. Створили скрипти для обробки інформації від веб-сервера і передачі їх заббіксу.
  3. Налаштували в заббікс-агенті за допомогою користувацьких параметрів передачу на сервер оброблених даних.
  4. Створили на сервері моніторингу потрібні шаблони і прикріпили їх до спостережуваних серверів.
  5. Об'єднали спостережувані параметри в Screen для зручного спостереження.

Тобто виконали весь комплекс дій для організації повноцінного моніторингу веб-сервера на базі nginx + php-fpm у zabbix.

Одне із застосувань подібного моніторингу — вибір швидшого хостингу для свого сайту. Наприклад, мені деякий час тому знадобилося змінити хостинг. Але як дізнатися, чи буде він швидшим за поточний чи ні. Характеристики приблизно у всіх однакові. Я просто взяв тестовий період, налаштував на сервері все, що мені потрібно, в тому числі моніторинг веб-сервера, переніс туди сайт і поспостерігав добу. Вже за часом відклику nginx і php-fpm мені стало зрозуміло, що новий хостинг швидший:

Порівняння швидкості хостингу

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.