Crmgo Blog

Zabbix-agent + monitorování MySQL, Nginx, php-fpm na Centos

Zabbix-agent + monitorování MySQL, Nginx, php-fpm na 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 + monitorování MySQL, Nginx, php-fpm na 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

 

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

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

import šablony do Zabbixu

Vyberte soubor a znovu klikněte na Import:

výběr šablony pro 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:

připojení šablony k serveru

Klikněte na Update a počkejte na příchod nových dat. Můžete je zkontrolovat v sekci Monitoring -> Latest Data:

zobrazení příchozích informací

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

monitoring nginx v Zabbixu

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:

Monitorování 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;
}
Upozorňuji vás na to, že ve své konfiguraci používám připojení k php-fpm přes unixový soket. Za to odpovídá konfigurační parametr fastcgi_pass. Pokud používáte tcp/ip port, obvykle 127.0.0.1:9000, musíte místo soketu zadat tento port, tedy takto: fastcgi_pass 127.0.0.1:9000

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

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

data monitoringu php-fpm

Pokud je vše v pořádku, zkontrolujte grafy a vytvořte si potřebný Screen. Můj vypadá takto:

nastavení monitoringu php-fpm v zabbix

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

  1. Nastavili jsme server nginx tak, aby poskytoval informace o svém stavu a stavu služby php-fpm.
  2. Vytvořili jsme skripty pro zpracování informací z webového serveru a jejich předání do Zabbixu.
  3. Nastavili jsme v agentovi Zabbixu pomocí uživatelských parametrů předávání zpracovaných dat na server.
  4. Vytvořili jsme na monitorovacím serveru potřebné šablony a připojili je k sledovaným serverům.
  5. 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ší:

Porovnání rychlosti hot swappingu

Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.