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:

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

Ako je sve u redu, proverite grafikone i kreirajte potreban Screen. Kod mene izgleda ovako:
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:
- Podesili smo nginx server tako da dostavlja informacije o svom stanju i stanju usluge php-fpm.
- Kreirali smo skripte za obradu informacija od web servera i njihovo slanje u Zabbix.
- Podesili smo u Zabbix agentu, pomoću korisničkih parametara, slanje obrađenih podataka na server.
- Kreirali smo potrebne šablone na serveru za monitoring i pridružili ih posmatranim serverima.
- 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:




