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
Serwer nginx potrafi udostępniać część niezbędnych nam informacji o swoim stanie. Aby to zrobić, należy go odpowiednio przygotować. Otwieramy konfigurację serwera i dodajemy następującą konstrukcję:
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;
}
Zapisujemy i restartujemy nginx, uprzednio sprawdzając jego konfigurację pod kątem błędów:
# nginx -t # systemctl restart nginx
Sprawdzamy, czy możemy uzyskać potrzebne informacje:
# wget http://localhost/server-status

W bieżącym katalogu powinien pojawić się plik server-status o zawartości zbliżonej do poniższej:
# cat server-status Active connections: 3 server accepts handled requests 156171 156171 318790 Reading: 0 Writing: 1 Waiting: 2
Jeśli u Ciebie jest tak samo, to wszystko jest w porządku, możemy kontynuować. Jeśli coś nie działa, sprawdź konfiguracje i logi. Jest to standardowa funkcjonalność, która powinna konfigurować się i działać bez problemów.
Konfiguracja monitoringu nginx w Zabbix
Będemy parsować otrzymany plik server-status za pomocą skryptu. Do jego działania konieczne jest zainstalowanie kilku pakietów:
# yum -y install curl zabbix-sender
Stwórzmy katalog, w którym będą przechowywane nasze skrypty monitoringu:
# mkdir /etc/zabbix/scripts
I umieśćmy w nim skrypt nginx.sh o następującej zawartości:
#!/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
Nadajemy mu prawa wykonywalności:
# chmod 0645 nginx.sh
Teraz otwieramy konfigurację agenta Zabbix i dodajemy tam parametr użytkownika:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=nginx.ping,/etc/zabbix/scripts/nginx.sh
Restartujemy agenta:
# systemctl restart zabbix-agent
Następnie musimy dodać nowy szablon do monitoringu. Pobieramy go nginx.xml i otwieramy interfejs webowy Zabbix. Przechodzimy do sekcji Configuration -> Templates i klikamy Import:

Wybieramy plik i ponownie klikamy Import:

Prawie wszystko gotowe. Teraz musimy podpiąć dodany szablon do serwera WWW, który monitorujemy. Przejdź do Configuration -> Hosts, wybierz odpowiedni serwer, otwórz zakładkę Templates i podłącz szablon:

Kliknij Update i poczekaj na napływ świeżych danych. Możesz je sprawdzić w sekcji Monitoring -> Latest Data:
Szablon zawiera już kilka triggerów i wykresów. Możesz je samodzielnie sprawdzić i edytować we właściwościach szablonu lub konkretnego hosta. Ja preferuję tworzenie Screens (ekranów) z odpowiednim zestawem wykresów. Tak wygląda u mnie pulpit monitoringu nginx:
To wszystko w zakresie konfiguracji monitoringu nginx – możesz teraz z niego korzystać.
Przygotowanie php-fpm do monitoringu
Będziemy monitorować następujące parametry php-fpm:
| active processes count | Liczba aktywnych procesów |
| connections per sec | Liczba połączeń na sekundę |
| idle processes count | Liczba procesów w stanie bezczynnym |
| latency | Czas odpowiedzi w milisekundach |
| length of listen queue | Rozmiar kolejki oczekujących połączeń |
| max children reached | Ilość razy, kiedy osiągnięto limit procesów |
| max length of listen queue | Maksymalny rozmiar kolejki połączeń |
Kilka słów o tym, po co to jest potrzebne i jak korzystać z uzyskanych danych. Monitorowanie to jest istotne, jeśli masz dynamiczne tworzenie procesów w php-fpm. Na przykład, jeśli wartość max children reached regularnie przekracza jedynkę, zaleca się zwiększenie limitu maksymalnej liczby procesów, jeśli zasoby serwera na to pozwalają. To samo dotyczy parametru length of listen queue. Jeśli jest on większy od zera, tworzy się kolejka żądań, których serwer nie jest w stanie obsłużyć na czas. Należy zwiększyć liczbę procesów, które mogą obsłużyć oczekujące połączenia.
Na parametr latency należy zwrócić uwagę, jeśli regularnie przekracza on 10-20 ms, wtedy należy ustalić, dlaczego serwer odpowiada tak wolno. Pozostałe informacje służą jedynie do statystyk.
Przystępujemy do konfiguracji. Zainstalujmy fcgi:
# yum -y install fcgi
Następnie przygotujmy php-fpm do zbierania statystyk. Do tego celu ponownie skorzystamy z nginx. Edytujemy jego konfigurację, dodając do tej samej sekcji server, co na poprzednim etapie, następującą konstrukcję:
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;
}
Restartujemy nginx:
# systemctl restart nginx
Wprowadzamy niezbędne zmiany w konfiguracji php-fpm – dodajemy jedną linię:
# mcedit /etc/php-fpm.d/www.conf pm.status_path = /status
Restartujemy php-fpm:
# systemctl restart php-fpm
Sprawdzamy, czy pod podanym adresem otrzymujemy statystyki php-fpm:
# wget http://127.0.0.1/status

Sprawdzamy zawartość pliku 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
Jeśli masz mniej więcej to samo, to wszystko jest w porządku, php-fpm udostępnia informacje o swoim stanie.
Konfiguracja monitorowania php-fpm w zabbix
Następnie przygotowujemy dla Zabbiksa skrypt przetwarzający uzyskany stan:
# 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
Ustawiamy go jako wykonywalny:
# chmod 0645 php-fpm.sh
Dodajemy do konfiguracji agenta Zabbiksa kolejny parametr użytkownika:
# mcedit /etc/zabbix/zabbix_agentd.conf
UserParameter=php.fpm.ping,/etc/zabbix/scripts/php-fpm.sh
Restartujemy agenta:
# systemctl restart zabbix-agent
Następnie, podobnie jak w przypadku nginx, przechodzimy do interfejsu webowego i importujemy szablon php-fpm.xml. Dodajemy ten szablon do odpowiedniego serwera i czekamy na aktualizację danych. Sprawdzamy ich przychód w sposób standardowy w sekcji Monitoring -> Latest Data:

Jeśli wszystko jest w porządku, sprawdzamy wykresy i tworzymy wymagany Screen. U wygląda on następująco:
W szablonie skonfigurowane są już 3 wyzwalacze, które uruchamiają się w przypadku:
- wyłączenia usługi php-fpm
- liczby procesów roboczych mniejszej niż 3
- czasu odpowiedzi mniejszego niż 10 ms w ostatnich 10 pomiarach
Drugi wyzwalacz można usunąć lub zmodyfikować, jeśli masz mniejszą minimalną liczbę procesów roboczych.
Podsumowanie
Podsumujmy, co zrobiliśmy:
- Skonfigurowaliśmy serwer nginx tak, aby udostępniał informacje o swoim stanie oraz stanie usługi php-fpm.
- Stworzyliśmy skrypty do przetwarzania informacji z serwera WWW i przekazywania ich do Zabbix.
- Skonfigurowaliśmy w agencie Zabbix za pomocą parametrów użytkownika przesyłanie przetworzonych danych na serwer.
- Stworzyliśmy na serwerze monitorowania niezbędne szablony i przypięliśmy je do obserwowanych serwerów.
- Połączyliśmy obserwowane parametry w ekranie (Screen) dla wygodniejszego obserwowania.
Oznacza to, że wykonaliśmy cały kompleks działań w celu zorganizowania pełnego monitorowania serwera WWW opartego na nginx + php-fpm w Zabbix.
Jednym z zastosowań takiego monitorowania jest wybór szybszego hostingu dla swojej strony. Na przykład, jakiś czas temu musiałem zmienić hosting. Ale jak dowiedzieć się, czy będzie szybszy niż obecny, czy nie. Specyfikacje są mniej więcej takie same u wszystkich. Po prostu wziąłem okres testowy, skonfigurowałem na serwerze wszystko, czego potrzebowałem, w tym monitorowanie serwera WWW, przeniósłem tam stronę i obserwowałem przez dobę. Już na podstawie czasu odpowiedzi nginx i php-fpm stało się jasne, że nowy hosting jest szybszy:




