< meta name="referrer" content="origin">
Home » Linux » Мониторинг web сервера nginx и php-fpm в Zabbix

Мониторинг web сервера nginx и php-fpm в 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

Мы будем парсить полученный файл 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 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/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 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 мне стало понятно, что новый хостинг быстрее:

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

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


Помогла статья? Есть возможность отблагодарить автора

Дополнительные материалы по Zabbix

Рекомендую полезные материалы по Zabbix:
Настройки системы
  • Установка 3.2 на CentOS 7
  • Обновление 3.0 -> 3.2
  • Обновление 2.4 -> 3.0
  • Установка Zabbix Proxy
  • Работа на NGINX
Видео и подробное описание установки и настройки Zabbix 3.2, а также установка агентов на linux и windows и подключение их к мониторингу.
Подробное описание обновления системы мониторинга zabbix версии 3.0 до новой версии 3.2.
Пошаговая процедура обновления сервера мониторинга zabbix 2.4 до 3.0. Подробное описание каждого шага с пояснениями и рекомендациями.
Подробное описание установки и настройки zabbix proxy для организации распределенной системы мониторинга. Все показано на примерах.
Подробное описание установки системы мониторинга Zabbix на веб сервер на базе nginx + php-fpm.
Мониторинг служб и сервисов
 
  • Температура процессора
  • Nginx и php-fpm
  • Mysql репликация
  • Службы Linux
  • Рейд mdadm
  • Транки Asterisk
  • Synology
Мониторинг температуры процессора с помощью zabbix на Windows сервере с использованием пользовательских скриптов.
Настройка полноценного мониторинга web сервера nginx и php-fpm в zabbix с помощью скриптов и пользовательских параметров.
Мониторинг репликации mysql с помощью Zabbix. Подробный разбор методики и тестирование работы.
Описание настройки мониторинга tcp служб с помощью zabbix и его инструмента простых проверок (simple checks)
Настройка мониторинга рейда mdadm с помощью zabbix. Подробное пояснение принципа работы и пошаговая инструкция.
Подробное описание мониторинга регистраций транков (trunk) в asterisk с помощью сервера мониторинга zabbix.
Подробная инструкция со скриншотами по настройке мониторинга по snmp дискового хранилища synology с помощью сервера мониторинга zabbix.
Мониторинг различных значений
  • Мониторинг сайта
  • Мониторинг бэкапов
  • Размер бэкапа
  • Делегирование домена
  • Значения из текстового файла
  • Мониторинг логов
Настройка мониторинга web сайта в zabbix. Параметры для наблюдения - доступность сайта, время отклика, скорость доступа к сайту.
Один из способов мониторинга бэкапов с помощью zabbix через проверку даты последнего изменения файла из архивной копии с помощью vfs.file.time.
Подробное описание настройки мониторинга размера бэкапов в Zabbix с помощью внешних скриптов.
Пример настройки мониторинга за временем делегирования домена с помощью Zabbix и внешнего скрипта. Все скрипты и готовый шаблон представлены.
Описание мониторинга лог файлов в zabbix на примере анализа лога программы apcupsd. Отправка оповещений по событиям из лога.

10 комментариев

  1. Николай

    Вот здесь — http://doam.ru/fcgi_monitoring_with_zabbix/ более элегантное решение для мониторинга php-fpm.

  2. Алексей К.

    Здравствуйте.

    1. Поймал такую ошибку:
    root@dev02:/etc/zabbix/scripts# zabbix_get -s 127.0.0.1 -k nginx.ping
    /etc/zabbix/scripts/nginx.sh: 19: /etc/zabbix/scripts/nginx.sh: Syntax error: redirection unexpected
    Вылечилось заменой shebang с #!bin/sh на #!/bin/bash.

    2. Лучше для пинга использовать не time, а, например, ключик curl -w %{time_total}, чтобы вывести не время запуска команды curl, а реальное время запроса-ответа.

  3. Алексей К.

    Вот такой код в итоге получился.
    Из плюсов:
    1. выше точность замеров пинга. У меня «пинг» упал с ~60мс до 1-6мс.
    2. не требуется запуск time и создание временного файла.

    #!/bin/bash

    PREFIX=’nginx’
    URL=’http://127.0.0.1/server-status’

    CURL=’/usr/bin/curl’
    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 <</dev/null 2>&1
    echo ${s[16]/,/.}
    else
    echo ‘-0.001’
    fi
    exit 1

  4. Алексей К.

    А вот что получилось для php-fpm:
    1. я тоже отказался от использования time
    2. у меня не работало с —assign, так что пришлось заменить —assign на -v
    3. полагаю, что в вашем варианте была спец. защита, если sender вернет ошибку. У меня ее нет.

    #!/bin/sh

    PREFIX=’php.fpm’
    URL=’http://127.0.0.1/status’

    CURL=’/usr/bin/curl’
    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

    OUTPUT=»$(${CURL} —no-keepalive -sm3 ${URL} -w ‘ping: %{time_total}’)»
    echo «${OUTPUT}» | awk -v 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 — >/dev/null 2>&1
    echo «${OUTPUT}» | awk ‘/^ping:/ {print $2}’ | sed ‘s/,/./’
    exit 1

  5. доброго дня! подскажите, пожалуйста, — почему не отрабатывает nginx.ping 🙁
    /usr/bin/curl —no-keepalive -s -m 9 -I http://127.0.0.1/nginx-status/
    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Sat, 18 Feb 2017 14:46:16 GMT
    Content-Type: text/html
    Content-Length: 178
    Connection: keep-alive

    результат отработки скрипта:

    cat /tmp/nginx-ping.tmp

    real 0m0.005s
    user 0m0.002s
    sys 0m0.002s

    wget в тоже время отрабатывает как следует:
    cat nginx-status.2
    Active connections: 79
    server accepts handled requests
    3487693 3487693 45939587
    Reading: 0 Writing: 5 Waiting: 74

  6. Шаблончик имеет небольшой недостаток — использует элемент данных траппер.
    Поэтому, в случае, если данные перестанут достигать zabbix сервера, на графике
    будет рисоваться горизонтальная линия на уровне последних данных, а не отсутствие линии.

    помогает следующий финт ушами: замена элементов данных траппер на агент_активный,
    и установка интервала в 2-3 раза больше интервала отправки данных (в нашем случае nginx.ping).

    тогда в случае потери более 2-3 отсчетов линия перестанет отрисовываться,
    и на графике появится видимый разрыв, соответствующий отсутствию данных.

Добавить комментарий для Алексей К. Отменить ответ

Ваш e-mail не будет опубликован.