Crmgo Блог

Zabbix-agent + мониторинг Mysql, Nginx, php-fpm на Centos

Zabbix-agent + мониторинг Mysql, Nginx, php-fpm на 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 + мониторинг Mysql, Nginx, php-fpm на 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

 

Сервер 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:

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

Почти все готово. Теперь нам нужно прицепить добавленный шаблон к web серверу, который мы мониторим. Идем в 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 Сколько раз был достигнут лимит по процеcсам
max length of listen queue Максимальный размер очереди подключений

Пару слов о том, зачем это нужно и как пользоваться полученными данными. Этот мониторинг актуален, если у вас динамическое создание процессов в php-fpm. К примеру, если у вас значение max children reached регулярно больше единицы, то вам рекомендуется увеличить лимит на максимальное количество процессов, если позволяют ресурсы сервера. То же самое относится и к параметру length of listen queue. Если он больше нуля, то создается очередь из запросов, которые не успевают обработать сервер. Необходимо увеличить количество процессов, которые смогут обработать ожидающие подключения.

Обратить внимание нужно на параметр latency, если он регулярно больше 10-20 мс, то нужно разбираться почему так медленно отвечает сервер. Остальная информация просто для статистики.

Приступаем к настройке. Установим 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

Теперь готовим для заббикса скрипт обработки полученного состояния:

# 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

Добавляем в конфиг заббикс агента еще один пользовательский параметр:

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

Перезапускаем агента:

# systemctl restart zabbix-agent

Дальше как и в случае с nginx, идем в веб интерфейс и импортируем шаблон php-fpm.xml. Добавляем этот шаблон необходимому серверу и ждем обновления данных. Проверяем их поступление как обычно в Monitoring -> Latest Data:

данные мониторинга php-fpm

Если все в порядке, то проверяйте графики, создавайте необходимый вам Screen. У меня он выглядит так:

настройка мониторинга php-fpm в zabbix

В шаблоне уже настроены 3 триггера, которые срабатывают при:

  • падении службы php-fpm
  • числе рабочих процессов меньше 3-х
  • времени отклика меньше 10 ms за последние 10 измерений

Второй триггер можно убрать или изменить, если у вас меньше минимальное количество рабочих процессов.

Заключение

Подведем итог того, что мы сделали:

  1. Настроили сервер nginx таким образом, чтобы он отдавал информацию о своем состоянии и состоянии сервиса php-fpm.
  2. Создали скрипты для обработки информации от веб сервера и передачи их заббиксу.
  3. Настроили в заббикс агенте с помощью пользовательских параметров передачу на сервер обработанных данных.
  4. Создали на сервере мониторинга необходимые шаблоны и прикрепили их к наблюдаемым серверам.
  5. Объединили наблюдаемые параметры в Screen для удобного наблюдения.

То есть выполнили весь комплекс действий для организации полноценного мониторинга web сервера на базе nginx + php-fpm в zabbix.

Одно из применений подобного мониторинга — выбор более быстрого хостинга для своего сайта. К примеру, мне некоторое время назад понадобилось сменить хостинг. Но как узнать, будет ли он быстрее текущего или нет. Характеристики примерно у всех одинаковые. Я просто взял тестовый период, настроил на сервере все, что мне нужно, в том числе мониторинг веб сервера, перенес туда сайт и понаблюдал сутки. Уже по времени отклика nginx и php-fpm мне стало понятно, что новый хостинг быстрее:

Сравнение скорости хотсинга

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.