Решение проблемы

Мониторинг web сервера nginx и php-fpm в Zabbix


Продолжаю развивать полезную и актуальную для администрирования тему создания различных систем мониторинга. В этой заметке мы займемся настройкой мониторинга web сервера nginx и php-fpm в zabbix сервере с помощью самописных скриптов и шаблонов. Полученная таким образом информация может пригодиться, к примеру, при оценке качества хостинга, или для прогнозирования максимально возможной нагрузки.

Содержание:

  • 1 Введение
  • 2 Подготовка nginx к мониторингу
  • 3 Настройка в zabbix мониторинга nginx
  • 4 Подготовка php-fpm к мониторингу
  • 5 Настройка в zabbix мониторинга php-fpm
  • 6 Заключение
  • 7 Дополнительные материалы по Zabbix

Введение

Мониторинг web сервера nginx и php-fpm в Zabbix

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 7.
  2. Настройка CentOS 7.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 9, если предпочитаете его:

  1. Установка Debian 9.
  2. Базовая настройка Debian 9.
  3. Установка и настройка zabbix на debian.

Я буду в своем примере настраивать все на CentOS 7, но в данном случае дистрибутив не имеет принципиального значения, все так же настраивается и на других linux системах с учетом их особенностей в установке пакетов и путей для конфигов и программ.

Мы будем использовать в качестве источника информации штатные возможности nginx и php-fpm, а обрабатывать данные с помощью sh скриптов и передавать их на сервер через zabbix_sender и agent. Я подразумеваю, что web сервер вы уже настроили и имеете некое представление о работа его компонентов, поэтому некоторые вещи я не разжевываю, а просто говорю, что делать.

Подготовка nginx к мониторингу

Я планирую мониторить следующие параметры:

Параметры мониторинга nginx
accepts per second Число принятых соединений в секунду
active connections Текущие активные соединения
handled per second Число обработанных соединений в секунду
latency Время ответа сервера в миллисекундах
memory allocated Занимаемая память
process count Число запущенных процессов
reading state connection count Текущее число соединений, в которых nginx в настоящий момент читает заголовок запроса
requests per second Число запросов в секунду
waiting state connection count Текущее число бездействующих соединений в ожидании запроса
writing state connection count Текущее число соединений, в которых nginx в настоящий момент отвечает

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

Мониторинг web сервера nginx и php-fpm в Zabbix

Мы будем парсить полученный файл server-status с помощью скрипта. Для его работы необходимо установить пару пакетов:

#  yum -y install curl zabbix-sender

Создадим папку, где будут лежать наши скрипты для мониторинга:

# mkdir /etc/zabbix/scripts

И положим туда скрипт nginx.sh следующего содержания:

#!/bin/bash

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 0740 nginx.sh

# chown zabbix:zabbix 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

Мониторинг web сервера nginx и php-fpm в Zabbix

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

# mcedit /etc/zabbix/scripts/php-fpm.sh
#!/bin/bash

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 0740 php-fpm.sh

# chown zabbix:zabbix 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 мне стало понятно, что новый хостинг быстрее:

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

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


СМОТРИ ТАКЖЕ