Мониторинг 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
Введение
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
- Установка CentOS 7.
- Настройка CentOS 7.
- Установка и настройка zabbix сервера.
То же самое на Debian 9, если предпочитаете его:
- Установка Debian 9.
- Базовая настройка Debian 9.
- Установка и настройка zabbix на debian.
Я буду в своем примере настраивать все на CentOS 7, но в данном случае дистрибутив не имеет принципиального значения, все так же настраивается и на других linux системах с учетом их особенностей в установке пакетов и путей для конфигов и программ.
Мы будем использовать в качестве источника информации штатные возможности nginx и php-fpm, а обрабатывать данные с помощью sh скриптов и передавать их на сервер через zabbix_sender и agent. Я подразумеваю, что web сервер вы уже настроили и имеете некое представление о работа его компонентов, поэтому некоторые вещи я не разжевываю, а просто говорю, что делать.
Подготовка 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
В текущей папке должен появиться файл 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/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:
Выбираем файл и снова нажимаем Import:
Почти все готово. Теперь нам нужно прицепить добавленный шаблон к web серверу, который мы мониторим. Идем в Configuration -> Hosts, выбираем нужный сервер, открываем вкладку Templates и подключаем шаблон:
Жмем Update и дожидаемся поступления свежих данных. Проверить их можно в Monitoring -> Latest Data:
В шаблоне уже есть несколько триггеров и графиков. Можете их сами посмотреть и отредактировать в свойствах шаблона или отдельного хоста. Я предпочитаю создавать Screens с нужным набором графиков. Вот так выглядит табло мониторинга nginx у меня:
На этом настройка мониторинга nginx закончена, можно пользоваться.
Подготовка 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;
}
Перезапускаем 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
Смотрим содержимое файла 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/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:
Если все в порядке, то проверяйте графики, создавайте необходимый вам Screen. У меня он выглядит так:
В шаблоне уже настроены 3 триггера, которые срабатывают при:
- падении службы php-fpm
- числе рабочих процессов меньше 3-х
- времени отклика меньше 10 ms за последние 10 измерений
Второй триггер можно убрать или изменить, если у вас меньше минимальное количество рабочих процессов.
Заключение
Подведем итог того, что мы сделали:
- Настроили сервер nginx таким образом, чтобы он отдавал информацию о своем состоянии и состоянии сервиса php-fpm.
- Создали скрипты для обработки информации от веб сервера и передачи их заббиксу.
- Настроили в заббикс агенте с помощью пользовательских параметров передачу на сервер обработанных данных.
- Создали на сервере мониторинга необходимые шаблоны и прикрепили их к наблюдаемым серверам.
- Объединили наблюдаемые параметры в Screen для удобного наблюдения.
То есть выполнили весь комплекс действий для организации полноценного мониторинга web сервера на базе nginx + php-fpm в zabbix.
Одно из применений подобного мониторинга — выбор более быстрого хостинга для своего сайта. К примеру, мне некоторое время назад понадобилось сменить хостинг. Но как узнать, будет ли он быстрее текущего или нет. Характеристики примерно у всех одинаковые. Я просто взял тестовый период, настроил на сервере все, что мне нужно, в том числе мониторинг веб сервера, перенес туда сайт и понаблюдал сутки. Уже по времени отклика nginx и php-fpm мне стало понятно, что новый хостинг быстрее:
Время отклика сайта в целом тоже снизилось. Я однозначно понял, что надо переезжать и не ошибся.
- Мониторинг web сайта в Zabbix
- Настройка шлюза на CentOS 7
- Мониторинг MySQL репликации в Zabbix
- Настройка прокси сервера на CentOS 7 (squid+AD+sams2)
- Защита админки wordpress с помощью fail2ban
- Мониторинг доступности службы linux с помощью Zabbix
- Пошаговая настройка роутера на Debian
- Базовая настройка сервера Debian после установки
- Установка и настройка vsftpd на CentOS 7
- Как установить или обновить php 7 на CentOS 7