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

Установим необходимые компоненты:

sudo apt-get install curl

Активируем модуль информации об apache2 (обычно он активирован изначально):

sudo a2enmod info

Откроем файл конфигурации модуля и укажем IP-адрес zabbix сервера чтобы разрешить ему просмотр информации об apache2 (если apache2 на локальной машине, то доступ обычно разрешен, указанием local или 127.0.0.1):

sudo nano /etc/apache2/mods-enabled/status.conf

В редакторе nano CTRL+X используются для выхода и y/n для сохранения или отмены изменений. Пример указания IP:

<Location /server-status>
    SetHandler server-status
    Require local
    Require ip 192.168.1.5
</Location>

Перезапустим web-сервер чтобы применить изменения:

sudo service apache2 restart

Теперь информация об apache2 доступна через браузер по ссылке http://HOST/server-status

Перейдем к Zabbix. Создадим папку для скриптов если ее нету:

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

В файле конфигурации zabbix сервера укажем путь к этой папке:

sudo nano /etc/zabbix/zabbix_server.conf
ExternalScripts=ПУТЬ

Теперь приведу содержимое самого скрипта:

#!/bin/bash
if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
  exit 1
fi
##### PARAMETERS #####
RESERVED="$1"
METRIC="$2"
URL="$3"
STATSURL="${URL}?auto"
#
CACHE_TTL="55"
CACHE_FILE="/tmp/zabbix.apache2.`echo ${URL} | md5sum | cut -d" " -f1`.cache"
EXEC_TIMEOUT="2"
NOW_TIME=`date '+%s'`
##### RUN #####
if [ -s "${CACHE_FILE}" ]; then
  CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"`
else
  CACHE_TIME=0
fi
DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME}))
#
if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then
  sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME}))
elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then
  echo "" >> "${CACHE_FILE}" # !!!
  DATACACHE=`curl -sS --insecure --max-time ${EXEC_TIMEOUT} "${STATSURL}" 2>&1`
  echo "${DATACACHE}" > "${CACHE_FILE}" # !!!
  echo "URL=${URL}"  >> "${CACHE_FILE}" # !!!
  chmod 640 "${CACHE_FILE}"
fi
#
if [ "${METRIC}" = "accesses" ]; then
  cat "${CACHE_FILE}" | grep -i "accesses" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "kbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "kbytes" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "cpuload" ]; then
  cat "${CACHE_FILE}" | grep -i "cpuload" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "uptime" ]; then
  cat "${CACHE_FILE}" | grep -i "uptime" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgreq" ]; then
  cat "${CACHE_FILE}" | grep -i "ReqPerSec" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgreqbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "BytesPerReq" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "avgbytes" ]; then
  cat "${CACHE_FILE}" | grep -i "BytesPerSec" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "busyworkers" ]; then
  cat "${CACHE_FILE}" | grep -i "BusyWorkers" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "idleworkers" ]; then
  cat "${CACHE_FILE}" | grep -i "idleworkers" | cut -d':' -f2 | head -n1
fi
if [ "${METRIC}" = "totalslots" ]; then
  cat "${CACHE_FILE}" | grep -i "Scoreboard" | cut -d':' -f2 | sed -e 's/ //g' | wc -c | awk '{print $1-1}'
fi
#
exit 0

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

chown root:zabbix /etc/zabbix/scripts/apache2-status.sh
chmod 550 /etc/zabbix/scripts/apache2-status.sh

Пример проверки скрипта:

sudo -u zabbix /etc/zabbix/scripts/apache2-status.sh none accesses http://HOST/server-status

Откроем файл конфигурации zabbix агента в редакторе:

sudo nano /etc/zabbix/zabbix_agentd.conf

И укажем следующие параметры:

UserParameter=apache2[*],/etc/zabbix/scripts/apache2-status.sh "none" "$1" "$2"

Некоторыми командами можно посмотреть количество процессов apache2 и соединений на 80 порт, для этого не нужен скрипт, например можно еще указать:

UserParameter=apache2.count_processes,ps aux | grep apache | wc -l
UserParameter=connections_on_80_port,netstat -na | grep :80 | wc -l

Перезапустим zabbix агент чтобы применить изменения:

sudo /etc/init.d/zabbix-agent restart

Проверим:

zabbix_get -s 127.0.0.1 -k "apache2[accesses,http://HOST/server-status]"

Теперь создадим шаблон и добавим элементы данных, пример создаваемых элементов данных:

apache2[КЛЮЧ,http://HOST/server-status]

Экспортировал готовый шаблон — apache2-status

К наблюдаемому хосту также обязательно добавим макрос:

Макрос: {$APACHE_STATS_URL}
Значение: http://HOST/server-status

Готово.

Количество процессов apache2 можно получать от Zabbix-агента создав на Zabbix-сервере элемент данных с ключом:

proc.num[apache2]

Настройка jabber оповещений в Zabbix

Для настройки jabber оповещений в Zabbix необходимо в веб-интерфейсе открыть «Администрирование» — «Способы оповещений«, создать способ оповещения jabber (либо выбрать существующий).

В способе оповещения указать следующие параметры:
Описание: любое
Тип: Jabber
Идентификатор Jabber: идентификатор (логин)
Пароль: пароль Jabber
Поставить галочку «Активно» и нажать «Сохранить«.

Теперь когда способ оповещения создан, откроем «Администрирование» — «Пользователи«, выберем пользователя, перейдем на вкладку «Оповещения» и добавим:
Тип: Jabber
Отправлять на: логин Jabber
Когда активно: Здесь можно ограничить время приема сообщений, например в рабочие дни 1-5,09:00-18:00
Использовать если важность: Важность триггеров для которых получать сообщения
Состояние: Активировано
Жмем «Добавить» и «Сохранить«.

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

Смотрите также:
Установка и настройка EJabberd в Ubuntu

Настройка Zabbix SNMP Traps

Предположим что мы настроили snmptt по инструкции Настройка SNMP Traps в Ubuntu

Теперь допилим конфигурационный файл /etc/snmp/snmptt.conf.
После FORMAT всегда должно идти ZBXTRAP $aA
Пример:

#пропал линк на порту
EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT ZBXTRAP $aA Link down on interface $1.  Admin state: $2.  Operational state: $3
#появился линк на порту
EVENT linkUp .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal
FORMAT ZBXTRAP $aA Link up on interface $1.  Admin state: $2.  Operational state: $3

Основные параметры /etc/snmp/snmptt.ini:

net_snmp_perl_enable = 1
mibs_environment = ALL
date_time_format = %H:%M:%S %Y/%m/%d
log_enable = 1
log_file = /var/log/snmptt/snmptt.log
unknown_trap_log_enable = 1
unknown_trap_log_file = /var/log/snmptt/snmpttunknown.log

Добавим следующие параметры в конфигурационный файл /etc/zabbix/zabbix_server.conf:

StartSNMPTrapper=1
SNMPTrapperFile=/var/log/snmptt/snmptt.log

Теперь добавим элемент данных через админ панель Zabbix, например в шаблоне:
Имя: (любое)
Тип: (SNMP trap)
Ключ: (snmptrap[выражение] или snmptrap.fallback чтобы ловить все трапы для узла)
Тип информации: (Журнал (лог))

Судя по добавленным элементам данных можно добавить триггеры.

Вот и все.

Создание внешней проверки Zabbix для SQL запроса SELECT

Вчера добавил график, который рисует сумму платежей из MySQL базы биллинга с другого сервера.

Добавлять пришлось через внешние проверки.

В первую очередь был создан скрипт и положен в стандартную директорию скриптов либо другую, указав ее при этом параметром «ExternalScripts=/var/scripts» в конфигурационном файле /etc/zabbix_server.conf. После чего необходимо перезапустить Zabbix сервер командой:

sudo service zabbix-server restart

Содержимое написанного скрипта:

mysql -u ПОЛЬЗОВАТЕЛЬ -pПАРОЛЬ -h 192.168.0.1 -e 'SELECT SUM(money) FROM nika_system.mon WHERE date= CURDATE() - INTERVAL 1 DAY;' -s -N

Скрипт соединяется с базой данный биллинга и суммирует все платежи за предыдущий день, параметры -s и -N удаляют в ответе запроса ненужные данные, благодаря чему мы получаем только цифру с плавающей точкой.

Файл скрипта также необходимо сделать исполняемым, например командой:

chmod a+x /var/scripts/money.sh

В панели управления Zabbix необходимо добавить элемент данных с внешней проверкой указав ключ money.sh, тип данных число с плавающей точкой и временем выполнения например раз в пол дня (это 43200 сек), потом создать график добавив в него созданный элемент данных.

Все.

Настройка Template App MySQL в Zabbix

Буду настраивать на Zabbix 2.2 и Ubuntu 14 LTS.

Для начала подключимся к mysql серверу:

mysql -u root -p

И выполним команды чтобы добавить пользователя от имени которого будем получать информацию:

GRANT USAGE ON *.* TO 'mysqlmonitor'@'localhost' IDENTIFIED BY 'ПАРОЛЬ';
FLUSH PRIVILEGES;
exit

Проверить пользователя можно выполнив команду:
mysql -umysqlmonitor -pПАРОЛЬ -e»status»

Создадим файл с настройками подключения к mysql серверу:
/etc/zabbix/.my.cnf
Добавим в него содержимое:

[mysql]
user=mysqlmonitor
password=ПАРОЛЬ
[mysqladmin]
user=mysqlmonitor
password=ПАРОЛЬ

Скопируем нужный файл userparameter_mysql.conf:

sudo cp /usr/share/doc/zabbix-agent/examples/userparameter_mysql.conf /etc/zabbix/zabbix_agentd.conf.d/userparameter_mysql.conf

Отредактируем его, изменив путь в переменной HOME на путь где находится файл .my.cnf, в нашем случае это HOME=/etc/zabbix.

Хочу заметить что в главном конфигурационном файле /etc/zabbix/zabbix_agentd.conf должна быть прописана строка Include=/etc/zabbix/zabbix_agentd.conf.d/ благодаря которой будут подгружаться все конфигурационные файлы в этой директории.

Перезапустим zabbix агента чтобы изменения вступили в силу:

sudo service zabbix-agent restart

Все, теперь в административной панели zabbix сервера можно добавить к хосту шаблон «Template App MySQL» и любоваться графиками.

Резервное копирование Zabbix

Придумал и набросал пару строк для резервного копирования mysql базы данных и директории с http файлами.

Первым делом делаем копию mysql базы данных zabbix (ключом —ignore-table исключим ненужные таблицы с историей, так как они могу занимать гигабайты) и архивируем ее:

mysqldump --ignore-table=zabbix.history --ignore-table=zabbix.history_uint --ignore-table=zabbix.trends --ignore-table=zabbix.trends_uint -u ПОЛЬЗОВАТЕЛЬ -h localhost -pПАРОЛЬ zabbix | gzip -c > /backups/zabbix_`date +%Y-%m-%d`.sql.gz

Вторым шагом будет архивация http файлов zabbix:

tar -cvjf /backups/`date +%Y-%m-%d`_zabbix.tar.bz2 /usr/share/zabbix/

Вместо директории /backups/ можно монтировать и указать какой нибудь сетевой диск из интернета и на него делать резервные копии.
Обе строки можно добавить в /etc/crontab чтобы копии выполнялись например ежедневно, или добавить их в файл, а в /etc/crontab/ указать путь к этому файлу, вот например каждый день в 3 утра:

0 3 * * * ПОЛЬЗОВАТЕЛЬ СТРОКА > /dev/null 2>&1

(где в качестве пользователя указывается существующий пользователь в системе от имени которого будет выполнятся команда, а в качестве строки указанная выше команда или путь к исполняемому файлу с списком указанных выше команд)
Пример с указанием на файл:

0 3 * * * root /backups/script.sh > /dev/null 2>&1

Смотрите также: Немного о CRON

Установка и настройка Zabbix агента в Ubuntu

В Ubuntu/Debian Zabbix агент устанавливается довольно легко.
Изначально достаточно ввести команду установки:

sudo apt-get install zabbix-agent

И немного изменить конфигурационный файл /etc/zabbix/zabbix_agentd.conf
А именно указать:
LogFileSize=1 (размер файла логов в мегабайтах)
EnableRemoteCommands=1 (разрешить выполнение команд в системе Zabbix сервером)
Server=192.168.1.11 и ServerActive=192.168.1.11 (ip адрес удаленного Zabbix сервера)
Hostname=имя (такое же как hostname системы)
ListenIP=192.168.1.1 (если в системе несколько сетевых интерфейсов с разными ip и необходимо чтобы zabbix агент работал на конкретном из них, а не на всех, то укажем его ip)

Редактировать конфигурационный файл можно например стандартным редактором nano (в котором Ctrl+O и Enter служит для сохранения изменений, а Ctrl+X для выхода).
Пример открытия файла в редакторе:

sudo nano /etc/zabbix/zabbix_agentd.conf

Если на сервере много IP адресов, а zabbix-agent должен работать на одном, а не на всех, то укажем его:

ListenIP=192.168.0.5

Перезапустим Zabbix агента чтобы изменения в конфигурационном файле вступили в силу:

sudo /etc/init.d/zabbix-agent restart

Посмотреть на какиех интерфейсах запущен zabbix-agent можно так:

sudo netstat -tulpn | grep :10050

Проверим запустится ли zabbix-agent после перезапуска системы и при при необходимости активируем автозапуск:

sudo systemctl is-enabled zabbix-agent.service
sudo systemctl enable zabbix-agent.service

Если используется iptables, то добавим два правила (можно также добавить к правилам, например -s 192.168.0.20, если нужно разрешить подключение к агенту только с конкретных IP-адресов):

sudo iptables -A INPUT -p tcp --dport 10050 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 10051 -m state --state NEW,ESTABLISHED -j ACCEPT

Готово.

Смотрите также:
Установка Zabbix в Ubuntu из пакетов дистрибутивов

Как увеличить число последних событий в панели Zabbix

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

Чтобы увеличить число отображаемых последних событий откроем файл ../zabbix/include/defines.inc.php в любом редакторе, например в nano:

sudo nano /usr/share/zabbix/include/defines.inc.php

и примерно на 537 строке найдем следующее:

define('DEFAULT_LATEST_ISSUES_CNT', 20);

Изменим цифру 20 например на 150 и сохраним изменения, после этого в панели Zabbix будет отображаться 150 последних событий.

Кстати в редакторе nano комбинация клавиш Ctrl+W используется для поиска, Ctrl+O и Enter для сохранения, а Ctrl+X для выхода.

Решение ошибки запуска Zabbix сервера и агента

Столкнулся со следующими ошибками запуска zabbix-server и zabbix-agent в Ubuntu:

service zabbix-server start
start: Rejected send message, 1 matched rules; type="method_call", sender=":1.55" (uid=1000 pid=30492 comm="start zabbix-server ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")
service zabbix-agent start
start: Rejected send message, 1 matched rules; type="method_call", sender=":1.51" (uid=1000 pid=30423 comm="start zabbix-agent ") interface="com.ubuntu.Upstart0_6.Job" member="Start" error name="(unset)" requested_reply="0" destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")

Решается данная ошибка выполнением команд от имени root:
sudo service zabbix-server start
sudo service zabbix-agent start

Все.

SQL запросы для Zabbix

Напишу несколько полезных примеров sql запросов для базы данных Zabbix:

Поиск хоста по имени:

SELECT * FROM hosts WHERE host like '%name%';
SELECT * FROM hosts WHERE name like '%name%';

Поиск элементов данных указанного хоста:

SELECT * FROM items WHERE hostid = '10105';

Поиск истории значений для указанного элемента данных:

SELECT * FROM history WHERE itemid = '24526';

Удалим всю историю элемента данных до 01.11.2014 (время указано в Unix формате, конвертеры можно найти через поисковик):

DELETE FROM history WHERE itemid = '24526' AND clock < '1414800000';

Удаление всей истории данных до 01.11.2014:

DELETE FROM history WHERE clock < '1414800000';

Массово менял интервал и динамику изменений в элементы данных шаблонов и хостов я следующими запросами (первый определяет ID шаблона или хоста, второй изменяет интервалы):

SELECT * FROM `hosts` WHERE host="Template ICMP Ping";
UPDATE items SET delay=3600 WHERE hostid=10105 AND delay=600;
UPDATE items SET trends=180 WHERE hostid=10047 AND trends=365;