[[Мониторинг параметров Nginx в Zabbix]]

NginxZabbix

Мониторинг параметров Nginx в Zabbix

Веб-сервер Nginx умеет отдавать свои статистические данные и было бы не плохо их мониторить с возможность построения различных наглядных графиков.

www-servers/nginx-1.4.4
net-analyzer/zabbix-2.0.9

Статистические данные

http_stub_status_module - собирает следующие данные:

  • active connections - количество открытых коннектов в данный момент, включая коннекты на backend
  • server accepts - количество принятых подключений
  • server handled - количество обработанных подключений
  • server requests - количество принятых запросов
  • reading - количество запросов в данный момент, заголовки которых читает nginx
  • writing - количество запросов в данный момент, тело которых читает nginx + находящиеся в обработки + идет отдача данных
  • waiting - количество ожидающих (keep-alive) соединений в данный момент. waiting = active - reading - writing
Если accepts и handled не равны, увеличите значение worker_connections

Установка скрипта

Создание папки для скриптов:

mkdir /etc/zabbix/scripts/
chown root:zabbix -R /etc/zabbix/scripts/
chmod 750 /etc/zabbix/scripts/

Создадим сам скрипт:

Листинг

Скрипт предусматривает кеш, что позволяет сократить количество реальных обращений к серверу.
Время действия кеша в секундах должно устанавливается чуть меньше чем период опроса элементов.

Установка прав

chown root:zabbix /etc/zabbix/scripts/nginx-stats.sh
chmod 550 /etc/zabbix/scripts/nginx-stats.sh

Настройка Nginx

Необходимо настроить Nginx для отдачи своей статистики по определенному адресу.

Сам Nginx должен быть скомпилирован с поддержкой модуля статистики (--with- http_stub_status_module)
В Gentoo Gentoo

make.conf

NGINX_MODULES_HTTP="stub_status  ..."

В секции server добавляем следующее:

VirtualHost

server {
 ...

        location = /nginx-stats {
                stub_status on;
                access_log off;
                allow IP.ZABBIX.SEVER.AGENT;
                deny all;
        }
}

Соответственно IP.ZABBIX.SEVER.AGENT заменяем на IP адрес Zabbix Server или Zabbix Agent.

После настройки нужно не забыть перезагрузить конфигурацию Nginx:

/etc/init.d/nginx reload

На стороне сервера следует проверить что нужные данные отдаются. Для этого можно выполнить команду:

curl http://you.site.com/nginx-stats

или с помощью скрипта для zabbix:

sudo -u zabbix /etc/zabbix/scripts/nginx-stats.sh none active http://you.site.com/nginx-stats

Вы должны получить статистические данные от Nginx, если этого не произошло, то конфигурация выполнена не правильно.

Если для проверки скрипт запускался с правами root, то он будет владельцем кэш файла - удалите кеш файл после проверок.

Настройка Zabbix сервера

Вызов скрипта через zabbix-agent

Настройка

/etc/zabbix/zabbix_agentd.conf

...

UserParameter=nginx[*],/etc/zabbix/scripts/nginx-stats.sh "none" "$1" "$2"
Перезапустить

/etc/init.d/zabbix-agentd restart

Проверка

zabbix_get -s HOST -k "nginx[active,http://you.site.com/nginx-stats]"

Для контролируемых данных в Zabbix нужно создать соответствующее элементы с типом "Zabbix агент" и ключом типа:

nginx[key,http://you.site.com/nginx-stats]

где key - контролируемая метрика, http://you.site.com/nginx-stats - адрес nginx статистики.

Используйте макросы что бы определить URL

Готовый Шаблон для мониторинга Nginx (agent) с уже настроенными элементами и графиками.

Вызов скрипта внешней проверкой

Основная концепция: мониторинг nginx производиться с помощью специального скрипта вызываемого внешней проверкой.
На сервере Xabbix в конфиге необходимо определить место размещения скриптов для внешней проверки:

/etc/zabbix/zabbix_server.conf

...
# Location of external scripts
ExternalScripts=/etc/zabbix/scripts

Для контролируемых данных в Zabbix нужно создать соответствующее элементы с типом "Внешняя проверка" и ключом типа:

nginx-stats.sh[key http://you.site.com/nginx-stats] - для 1.8
nginx-stats.sh[none,key,http://you.site.com/nginx-stats] - для 2.X

где key - контролируемая метрика, http://you.site.com/nginx-stats - адрес Nginx статистики.

Используйте макросы что бы определить URL

Готовый Шаблон для мониторинга Nginx (Внешние проверки) с уже настроенными элементами и графиками.



Результат

Напоследок приятное, пример графиков которые в результате можно получить:

Обсуждение

Алексей Малов , 2010/12/29 13:18

Спасибо большое, очень пригодилось!

krushik, 2011/11/12 02:04

Спасибо за скрипт и шаблоны!

В целях повышения эффективности и отказоустойчивости скрипта к таймаутам во время исполнения, рекомендую в шаблоне, который через zabbix-agent, выставить тип данных "Zabbix agent (passive)", а внешние проверки для таких целей вообще не использовать. И график коннектов в агентном шаблоне тоже сделать стэкируемым (сейчас он такой только в шаблоне внешних проверок), тогда на том же графике автоматически получается active connections.

krushik, 2011/11/17 23:25

Поправка: конечно же я имел в виду Zabbix agent (active) :)

exe, 2011/12/14 03:10

Огромное спасибо за шаблон и инструкцию , единственный спорный момент -проверки становятся неактивными в заббикс после неполучения/получения страницы другого формата и не восстанавливаются без ручной активации, для себя изменил скрипт, чтобы по умолчанию выдавал нули.

lexa, 2011/12/14 10:03

Да Zabbix ставит на паузу неудачные проверки, особенно когда только настраиваешь, потом вроде бы исправил, а данные не идут, просто он держит длительный таймаут.
Но идея неплохая, хотя получить нули или полное отсутствие данных - немного разные варианты, но так то понятно, что если идут сплошняком нули - значит что-то не так.

exe, 2011/12/14 16:22

да если кому-то пригодится , вот та часть скрипта http://pastebin.ru/Km0m9gVo

MASiK, 2012/01/11 14:23

Что бы не мучатся с макросами, лучше ключи описывать вот так

{HOST.DNS}/nginx_status

И в поле DNS вписать в настройках узла собственно сам адрес.

lexa, 2012/01/13 09:49

Очень интересный вариант. Правда мне бы он не подошел, не всегда все так идеально совпадает.

evgen, 2012/01/18 14:30

Господа, подскажите, периодически графики req per sec и active connections обрываются на несколько минут, потом опять отрисовываются, значит ли это, что клиент не передает данные/отваливается по таймауту?

lexa, 2012/01/18 15:50

Может быть, посмотрите что в этот момент записано в файле

/tmp/nginxstat- ... .cache 
krushik, 2012/01/18 16:39

Скорее всего так и есть, тогда источник переходит в состояние ZBX_NOTSUPPORTED. Обычно в таких ситуациях причину можно выяснить из zabbix_server.log. От проблемы поможет избавиться перевод айтемов на сторону юзер-параметра агента и выставление типа zabbix agent (active)

evgen, 2012/01/18 18:17

когда клиент сам передает необходимые для отслеживания параметры? Или, насколько я понимаю, увеличить время таймаута.. Посмотрю, спасибо. В логах сервера:

 40865:20120118:141726.205 Item [www.ichiba.ru:nginx[handled]] became not supported: Not supported by Zabbix Agent
 40867:20120118:141926.965 Item [www.ichiba.ru:nginx[handled]] became supported

krushik, 2012/01/18 19:05

Да, тогда агент сам инициирует отправку данных айтема серверу, и на стороне сервера не бывает таймаута

MASiK, 2012/12/24 01:22

Я вот только сейчас в тригераз заметел выражение которое $NGINX_REQ_NUM использует, а в описании не где про этот макрос не написано… Непонимаю что это за макрос такой

bvv2001, 2013/02/26 12:06

А зачем разрешать nginx подключаться к нему удаленно, если все это может сделать скрипт на месте и сам скрипт можно упростить передавая только один параметр "состояние"

UserParameter=nginx[*],/etc/zabbix/bin/nginx_stats.sh $1 http://127.0.0.1/nginx_status

Jim, 2013/03/17 19:50

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

Спасибо вам за это.

Для команд FreeBSD для "md5sum" нет, но можно использовать "md5" и "stat -c" является "stat -f". Кроме того, "bash" и "curl" ротор не параметрического ряда из "FreeBSD base", поэтому он должен быть установлен с "FreeBSD ports" и находится в /usr/lcoal/bin/bash и /usr/local/bin/curl. Пути также различны, как Zabbix внешние скрипты находятся в ${datadir}/zabbix/externalscripts При установке с помощью FreeBSD ports, Обычно /usr/local/etc/zabbix2/zabbix/externalscripts. Конфигурационные файлы, как правило, в /usr/local/etc/zabbix2/ (Zabbix 1.x в настоящее время осуждается в FreeBSD ports).

Для FreeBSD, следующие работает для меня:

/usr/local/etc/zabbix2/zabbix/externalscripts/nginx-stats.sh :

#!/usr/local/bin/bash
### OPTIONS VERIFICATION
if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
 exit 1
fi
##### PARAMETERS #####
RESERVED="$1"
METRIC="$2"
STATSURL="$3"
#
CURL="/usr/local/bin/curl"
TTLCACHE="55"
FILECACHE="/tmp/zabbix.nginx.`echo $STATSURL | md5 | cut -d" " -f1`.cache"
TIMENOW=`date '+%s'`
##### RUN #####
if [ -s "$FILECACHE" ]; then
 TIMECACHE=`stat -f"%Z" "$FILECACHE"`
else
 TIMECACHE=0
fi
if [ "$(($TIMENOW - $TIMECACHE))" -gt "$TTLCACHE" ]; then
 echo "" >> $FILECACHE # !!!
 DATACACHE=`$CURL --insecure -s "$STATSURL"` || exit 1
 echo "$DATACACHE" > $FILECACHE # !!!
fi
if [ "$METRIC" = "active" ]; then
 cat $FILECACHE | grep "Active connections" | cut -d':' -f2
fi
if [ "$METRIC" = "accepts" ]; then
 cat $FILECACHE | sed -n '3p' | cut -d" " -f2
fi
if [ "$METRIC" = "handled" ]; then
 cat $FILECACHE | sed -n '3p' | cut -d" " -f3
fi
if [ "$METRIC" = "requests" ]; then
 cat $FILECACHE | sed -n '3p' | cut -d" " -f4
fi
if [ "$METRIC" = "reading" ]; then
 cat $FILECACHE | grep "Reading" | cut -d':' -f2 | cut -d' ' -f2
fi
if [ "$METRIC" = "writing" ]; then
 cat $FILECACHE | grep "Writing" | cut -d':' -f3 | cut -d' ' -f2
fi
if [ "$METRIC" = "waiting" ]; then
 cat $FILECACHE | grep "Waiting" | cut -d':' -f4 | cut -d' ' -f2
fi
#
exit 0

/usr/local/etc/zabbix2/zabbix_agentd.conf.d/zabbix-nginx.conf :

UserParameter=nginx[*],/usr/local/etc/zabbix2/zabbix/externalscripts/nginx-stats.sh "none" $1 $2

Простите мой русский язык. Я использовал Google Translate. =)

Магомед, 2013/03/26 15:31

Добрый день.. огромная просьба, я уже который день ищу в инете не могу найти скрипт.. Есть zabbix 1.8 установлен на centos все работает нормально.. я хочу чтоб при щелчке мышкой на узел на карте zabbix в сплывающем окне кроме пинга и трасерта выходила еще и запуск телнета именно для того узла на которого щелкнул мышкой, как можно это реализовать? или если есть скрипт для запуска телнет или хотябы cmd открывал..

Константин, 2013/08/09 03:02

А если у меня на одном узле связи, 5 хостов? Как быть? создавать 5 узлов связи чтоли?

Aleksey, 2013/08/09 09:52

каких хостов? виртуальных в nginx'e?

Mike, 2013/08/23 19:24

Кстати да, а если 10 виртуальных хостов? На каждый делать?

Aleksey, 2013/08/28 09:18

хоть 100500, статистика для веб сервера целиком

Sych, 2015/01/22 14:08

nginx-stats.sh[key,http://you.site.com/nginx-stats]

нужно заменить на

nginx-stats.sh[1,key,http://you.site.com/nginx-stats]

тк скрипт принимает 3 параметра и в указаном виде внешняя проверка работать не будет

Aleksey, 2015/01/22 23:08

Ну да, надо уже усправить для >2.0

В 1.8

Первый параметр командной строки это IP адрес или DNS имя, другие параметры заменяются параметрами.

Дмитрий, 2015/05/18 15:28

Я правильно понимаю, что баш скрипт должен быть и на сервере и на агенте?

Aleksey, 2015/05/20 18:59

или или

Николай, 2015/11/06 19:17

Всем привет.
Ситуация по графику нормальная?

1_800.jpg

Aleksey, 2015/11/06 19:23

800 запросов в секунду, многовато конечно. В чем вопрос то

Николай, 2015/11/06 19:52

Смущает что request per sec меньше чем connection accepted per sec. Или я путаю понятия?

Aleksey, 2015/11/06 19:58
Смущает что request per sec меньше чем connection accepted per sec. Или я путаю понятия? 

Вообще-то на вашем графике наоборот

keepalive прогуглите

Николай, 2015/11/06 20:05

Простите, хотел больше написать. Значит Всё в норме.

Николай, 2015/11/06 20:07

Значит это запросы внутри keepalive соединений. Верно?

Николай, 2015/11/08 23:30

Соответственно нагрузка такая:
2_800.jpg

Ваш комментарий. Вики-синтаксис разрешён:
32 +4 = ?
 
howto/zabbix/nginx_monitoring.txt · Последние изменения: 2015/01/22 23:11 — lexa
Gentoo Linux Driven by DokuWiki