Zabbix + Nginx

Базовый мониторинг Nginx при помощи Zabbix довольно просто настроить. Для этого необходимо, настроить nginx чтобы он отдавал свою статистику, настроить zabbix_agent чтобы он её читал и настроить zabbix сервер что бы он её принимал сохранял и отображал.

И так приступим:

Настройка сервера который мониторится

Настройка nginx

server {
    listen 127.0.0.1:80;
    server_name localhost;
    location /server-status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

Nginx должен быть собран с поддержкой stub_status модуля. Перезагружаем nginx и проверяем.

fetch http://localhost/server-status

Должны получить что-то вроде в файле с именем server-status в текущей папке

Active connections: 117 
server accepts handled requests
 35695 35695 156046 
Reading: 14 Writing: 1 Waiting: 102

 

Скрипт проверки

Создадим папку /usr/local/etc/zabbix2/scripts (здесь будут лежать скрипты которые будет запускать zabbix_agent что бы получить данные от nginx) в ней создадим сам скрипт /usr/local/etc/zabbix2/script/nginx.sh.

Cкрипт проверки (за основу взят скрипт отсюда https://github.com/zbal/zabbix/blob/master/scripts/zabbix_nginx_check.sh изменен запрос с wget на fetch и bash на sh). Если nginx отдает статистику по ULR отличному от  http://localhost/server-status то необходимо в скрипте изменить NGINX_DEFAULT_URL.

#!/bin/sh
# Zabbix requested parameter
ZBX_REQ_DATA="$1"
ZBX_REQ_DATA_URL="$2"

# Nginx defaults
NGINX_STATUS_DEFAULT_URL="http://localhost:80/server-status"
FETCH_BIN="/usr/bin/fetch"

#
# Error handling:
# - need to be displayable in Zabbix (avoid NOT_SUPPORTED)
# - items need to be of type "float" (allow negative + float)
#
ERROR_NO_ACCESS_FILE="-0.9900"
ERROR_NO_ACCESS="-0.9901"
ERROR_WRONG_PARAM="-0.9902"
ERROR_DATA="-0.9903" # either can not connect / bad host / bad port

# Handle host and port if non-default
if [ ! -z "$ZBX_REQ_DATA_URL" ]; then
  URL="$ZBX_REQ_DATA_URL"
else
  URL="$NGINX_STATUS_DEFAULT_URL"
fi

# save the nginx stats in a variable for future parsing
NGINX_STATS=$($FETCH_BIN -q -o - $URL 2> /dev/null)

# error during retrieve
if [ $? -ne 0 -o -z "$NGINX_STATS" ]; then
  echo $ERROR_DATA
  exit 1
fi

#
# Extract data from nginx stats
#
case $ZBX_REQ_DATA in
  active_connections) echo "$NGINX_STATS" | head -1 | cut -f3 -d' ';;
  accepted_connections) echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f2 -d' ';;
  handled_connections) echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f3 -d' ';;
  handled_requests) echo "$NGINX_STATS" | grep -Ev '[a-zA-Z]' | cut -f4 -d' ';;
  reading) echo "$NGINX_STATS" | tail -1 | cut -f2 -d' ';;
  writing) echo "$NGINX_STATS" | tail -1 | cut -f4 -d' ';;
  waiting) echo "$NGINX_STATS" | tail -1 | cut -f6 -d' ';;
  *) echo $ERROR_WRONG_PARAM; exit 1;;
esac

exit 0

Сделаем скрипт исполняемым

chmod 750 /usr/local/etc/zabbix2/scripts/nginx.sh

Проверим получает ли скрипт какие-то значения:

/usr/local/etc/zabbix2/scripts/nginx.sh active

Должны какое-то число, например (количество активных соединений)

116

Настройка zabbix agent

Создадим файл userparameter_nginx.conf в папке /usr/local/etc/zabbix2/zabbix_agentd.conf.d/

/usr/local/etc/zabbix2/zabbix_agentd.conf.d/userparameter_nginx.conf

(путь к папке с дополнительными настройками может отличатся от указанного. Вообще он задается в ee /usr/local/etc/zabbix2/zabbix_agentd.conf директивой Include, можно в принципе дописать строчку ниже прям в этот файл, но это как-то не по Феншую)

UserParameter=nginx[*],/usr/local/etc/zabbix2/scripts/nginx.sh $1

После изменений обязательно перезагружаем zabbix_agent

/usr/local/etc/rc.d/zabbix_agentd restart

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

Проверяем на сервере например:

zabbix_get -s ZABBIX_AGEBNT_IP -k "nginx[handled_requests]"

Должны в ответ получить какое-то число. Если не выдает число или пишет -0.990. Значит где-то ошиблись в настройках.

Далее необходимо загрузить xml шаблон и применить его к необходимым хостам. Шаблон можно скачать тут.

В шаблоне есть 1 триггер (не запущен nginx) и 2 графика.

Шаблоны и скрипты.