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
Server nginx umí poskytovat část potřebných informací o svém stavu. Je třeba ho pro to příslušně připravit. Otevřete konfigurační soubor serveru a přidejte do něj následující konfiguraci:
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;
}
Uložte a restartujte nginx, přičemž předtím zkontrolujte jeho konfiguraci na chyby:
# nginx -t # systemctl restart nginx
Ověřte, zda můžeme získat potřebné informace:
# wget http://localhost/server-status

V aktuálním adresáři by se měl objevit soubor server-status s přibližně následujícím obsahem:
# cat server-status Active connections: 3 server accepts handled requests 156171 156171 318790 Reading: 0 Writing: 1 Waiting: 2
Pokud máte totéž, je vše v pořádku a můžete pokračovat dále. Pokud se něco nedaří, zkontrolujte konfigurační soubory a podívejte se do logů. Jedná se o standardní funkci, která by se měla bez problémů nastavit a fungovat.
Nastavení monitoringu nginx v Zabbixu
Pro získaný soubor server-status budeme používat skript pro parsování. Pro jeho běh je třeba nainstalovat několik balíčků:
# yum -y install curl zabbix-sender
Vytvořte adresář, ve kterém budou uloženy naše skripty pro monitoring:
# mkdir /etc/zabbix/scripts
A do něj umístěte skript nginx.sh s následujícím obsahem:
#!/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
Nastavte mu práva ke spuštění:
# chmod 0645 nginx.sh
Nyní otevřete konfigurační soubor agenta Zabbixu a přidejte do něj uživatelský parametr:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.ping,/etc/zabbix/scripts/nginx.sh
Restartujte agenta:
# systemctl restart zabbix-agent
Dále je třeba přidat nový šablonu pro monitoring. Stáhněte si ji nginx.xml a otevřete webové rozhraní Zabbixu. Přejděte do sekce Configuration -> Templates a klikněte na Import:

Vyberte soubor a znovu klikněte na Import:

Téměř vše je hotovo. Nyní musíme připojit přidanou šablonu k webovému serveru, který monitorujeme. Přejděte do Configuration -> Hosts, vyberte příslušný server, otevřete záložku Templates a připojte šablonu:

Klikněte na Update a počkejte na příchod nových dat. Můžete je zkontrolovat v sekci Monitoring -> Latest Data:
Šablona již obsahuje několik triggerů a grafů. Můžete si je prohlédnout a upravit ve vlastnostech šablony nebo jednotlivého hostitele. Já preferuji vytvářet Screens s požadovanou sadou grafů. Takto vypadá můj monitorovací panel pro nginx:
Nastavení monitoringu nginx je tímto dokončeno, můžete jej používat.
Příprava php-fpm na monitoring
Budeme monitorovat následující parametry php-fpm:
| active processes count | Počet aktivních procesů |
| connections per sec | Počet připojení za sekundu |
| idle processes count | Počet nečinných procesů |
| latency | Doba odezvy v milisekundách |
| length of listen queue | Velikost fronty čekajících připojení |
| max children reached | Kolikrát byl dosažen limit procesů |
| max length of listen queue | Maximální velikost fronty připojení |
Pár slov o tom, proč je to potřeba a jak používat získaná data. Toto monitorování je relevantní, pokud máte dynamické vytváření procesů v php-fpm. Například pokud je vaše hodnota max children reached pravidelně větší než jedna, doporučujeme zvýšit limit maximálního počtu procesů, pokud to zdroje serveru umožňují. Stejně to platí i pro parametr length of listen queue. Pokud je větší než nula, vytváří se fronta požadavků, které server nestíhá zpracovat. Je třeba zvýšit počet procesů, které budou schopny zpracovat čekající připojení.
Je třeba věnovat pozornost parametru latency, pokud je pravidelně větší než 10-20 ms, je třeba zjistit, proč server odpovídá tak pomalu. Zbývající informace jsou pouze pro statistiku.
Pojďme na konfiguraci. Nainstalujeme fcgi:
# yum -y install fcgi
Nyní připravíme pfp-fpm pro sběr statistik. K tomu znovu využijeme nginx. Upravíme jeho konfigurační soubor a přidáme do stejné sekce server, jako v předchozím kroku, následující konstrukci:
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;
}
Restartujeme nginx:
# systemctl restart nginx
Provedeme potřebné změny v konfiguračním souboru php-fpm – přidáme jeden řádek:
# mcedit /etc/php-fpm.d/www.conf pm.status_path = /status
Restartujeme php-fpm:
# systemctl restart php-fpm
Ověříme, že na zadané adrese dostaneme statistiku php-fpm:
# wget http://127.0.0.1/status

Podíváme se na obsah souboru 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
Pokud máte přibližně totéž, je vše v pořádku, php-fpm poskytuje informace o svém stavu.
Konfigurace monitorování php-fpm v zabbix
Nyní připravíme pro zabbix skript pro zpracování získaného stavu:
# 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
Uděláme ho spustitelným:
# chmod 0645 php-fpm.sh
Přidáme do konfiguračního souboru agenta zabbix další uživatelský parametr:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=php.fpm.ping,/etc/zabbix/scripts/php-fpm.sh
Restartujeme agenta:
# systemctl restart zabbix-agent
Dále, stejně jako v případě nginx, přejdeme do webového rozhraní a importujeme šablonu php-fpm.xml. Přidáme tuto šablonu příslušnému serveru a počkáme na aktualizaci dat. Jejich příjem ověříme běžným způsobem v sekci Monitoring -> Latest Data:

Pokud je vše v pořádku, zkontrolujte grafy a vytvořte si potřebný Screen. Můj vypadá takto:
Šablona již obsahuje 3 spouštěče (triggery), které se aktivují při:
- poklesu služby php-fpm
- počtu pracovních procesů menším než 3
- době odezvy kratší než 10 ms za posledních 10 měření
Druhý spouštěč lze odstranit nebo upravit, pokud máte nižší minimální počet pracovních procesů.
Závěr
Shrňme si, co jsme provedli:
- Nastavili jsme server nginx tak, aby poskytoval informace o svém stavu a stavu služby php-fpm.
- Vytvořili jsme skripty pro zpracování informací z webového serveru a jejich předání do Zabbixu.
- Nastavili jsme v agentovi Zabbixu pomocí uživatelských parametrů předávání zpracovaných dat na server.
- Vytvořili jsme na monitorovacím serveru potřebné šablony a připojili je k sledovaným serverům.
- Sloučili sledované parametry do obrazovky (Screen) pro pohodlné sledování.
Tím jsme provedli kompletní sadu kroků pro zavedení plnohodnotného monitoringu webového serveru na bázi nginx + php-fpm v Zabbixu.
Jedním z využití takového monitoringu je výběr rychlejšího hostingu pro váš web. Například mi před nějakou dobou bylo nutné změnit hosting. Jak ale zjistit, zda bude rychlejší než ten stávající? Specifikace jsou u všech přibližně stejné. Jednoduše jsem si vzal zkušební období, nastavil na serveru vše, co jsem potřeboval, včetně monitoringu webového serveru, přenesl tam web a sledoval jsem ho po dobu 24 hodin. Již na základě doby odezvy nginx a php-fpm mi bylo jasné, že nový hosting je rychlejší:




