Crmgo Blog

Zabbix-agent + monitoring MySQL, Nginx, php-fpm na Centosu

Zabbix-agent + monitoring MySQL, Nginx, php-fpm na Centosu

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 + monitoring MySQL, Nginx, php-fpm na Centosu
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:

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

Све је готово. Сада нам је потребно да повежемо додати шаблон са веб сервером који пратимо. Идите у 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. Ако је већи од нуле, онда се формира ред захтева који сервер не успевa да обради. Потребно је повећати број процеса који могу да обраде чекајуће везе.

Пажњу треба обратити на параметар latency, ако је редовно већи од 10-20 ms, онда треба истражити зашто сервер тако споро одговара. Остале информације су само за статистику.

Почетна подешавања. Инсталирајте 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

Сада припремамо за zabbix скрипту за обраду добијеног стања:

# 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

Додајте у конфиг zabbix агента још један кориснички параметар:

# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=php.fpm.ping,/etc/zabbix/scripts/php-fpm.sh

Рестартујте агента:

# systemctl restart zabbix-agent

U nastavku, kao i u slučaju sa nginx-om, ulazimo u web interfejs i uvozimo šablon php-fpm.xml. Dodajemo ovaj šablon odgovarajućem serveru i čekamo ažuriranje podataka. Proveravamo njihov dolazak na uobičajeni način u Monitoring -> Latest Data:

podaci o monitoringu php-fpm

Ako je sve u redu, proverite grafikone i kreirajte potreban Screen. Kod mene izgleda ovako:

podešavanje monitoringa php-fpm u zabbix-u

U šablonu su već podešena 3 okidača (trigera) koji se aktiviraju pri:

  • padu usluge php-fpm
  • broju radnih procesa manjem od 3
  • vremenu odziva manjem od 10 ms u poslednjih 10 merenja

Drugi okidač možete ukloniti ili izmeniti ako imate manji minimalni broj radnih procesa.

Zaključak

Ukratko, uradili smo sledeće:

  1. Podesili smo nginx server tako da dostavlja informacije o svom stanju i stanju usluge php-fpm.
  2. Kreirali smo skripte za obradu informacija od web servera i njihovo slanje u Zabbix.
  3. Podesili smo u Zabbix agentu, pomoću korisničkih parametara, slanje obrađenih podataka na server.
  4. Kreirali smo potrebne šablone na serveru za monitoring i pridružili ih posmatranim serverima.
  5. Ujedno smo grupisali posmatrane parametre u Screen radi lakšeg praćenja.

Dakle, izvršili smo kompletan skup radnji za organizaciju potpunog monitoringa web servera na bazi nginx + php-fpm u Zabbix-u.

Jedna od primena ovakvog monitoringa je izbor bržeg hostinga za svoj sajt. Na primer, pre nekog vremena bilo mi je potrebno da promenim hosting. Ali kako saznati da li će biti brži od trenutnog ili ne? Specifikacije su otprilike iste kod svih. Ja sam jednostavno uzeo probni period, podesio na serveru sve što mi je potrebno, uključujući monitoring web servera, preneo tamo sajt i posmatrao ga 24 sata. Već na osnovu vremena odziva nginx-a i php-fpm-a shvatio sam da je novi hosting brži:

Poređenje brzine hotingovanja

Napomena: tekst može biti uz pomoć AI uz ljudsku proveru. Odgovoran: Dmytro Lomaka, Kaltenkirchen.