Мониторинг Nginx с помощью MRTG

()

Nginx - веб-сервер и почтовый прокси-сервер, часто используемый в качестве фронтенда на веб-проектах с высокой посещамостью. Периодически возникает необходимость следить за количеством обрабатываемых им запросов чтобы своевременно реагировать на рост нагрузки. Далее будет показано как можно организовать мониторинг Nginx с помощью MRTG.

Для начала включи в nginx вывод статуса. Для этого в конфигурацию одного из виртуальных хостов надо добавить строки:

        # По этому пути будет доступен статус сервера
        location /nginx_status {
                # Включение отображения статуса
                stub_status on;
                # Кому разрешён доступ сюда. Как минимум нашему серверу мониторинга
                allow 10.12.14.16;
                # Заодно сети, в которой сидят наши администраторы (на всякий случай)
                allow 172.17.233.0/25;
                # Всем остальным доступ закрываем
                deny    all;
         }

После этого перезапускаем nginx. Теперь при обращении к локации "/nginx_status" нашего виртуального хоста с одного из разрешённых адресов мы получим примерно вотакую информацию:

Active connections: 272 
server accepts handled requests
 65274467 65274255 150927366 
Reading: 47 Writing: 68 Waiting: 157 

Нас интересуют первое число в третьей строке (число обработанных коннектов) и третье (число запросов). Парсить будем несложным PHP-скриптом:

#!/usr/bin/php
<?php

// Получаем имя хоста
$host = isset($argv[1]) ? $argv[1] : '127.0.0.1';

// Получаем данные
$data = file('http://' . $host . '/nginx_status');
// Парсим данные
$line = trim($data[2]);
$conns = preg_replace('/^(\d+?)\s+?\d+?\s+?\d+?$/', "$1", $line);
$reqs = preg_replace('/^\d+?\s+?\d+?\s+?(\d+?)$/', "$1", $line);

// Отображаем результат
print "$conns\n";
print "$reqs\n";
print time() . "\n";
print "$host\n";

Скрипт нужно сохранить в файл и сделать исполняемым. Заодно нужно проверить путь к интерпритатору PHP в первой строке (он может отличаться в зависимости от системы). ДЛя рисования графика в конфигурацию MRTG нужно добавить примерно такие строки:

Target[nginx]: `/var/www/mrtg/scripts/nginx.php frontend.domain.com`
MaxBytes[nginx]: 1
Title[nginx]: nginx statistics
PageTop[nginx]: <h1>nginx statistics</h1>
AbsMax[nginx]: 1250000
Options[nginx]: integer,nopercent,nobanner,growright,dorelpercent
YLegend[nginx]: per second
ShortLegend[nginx]: per second
Legend1[nginx]: Connections per second
Legend2[nginx]: Requests per second

В итоге будет нарисован вот такой график:

Здесь синяя линия - число обрабатываемых ежесекундно запросов. Зелёная - количество соединений. Жёлтая - отношения числа соединений к числу запросов. Она позволяет косвенно оценить эффективность использования tcp-соединений (чем ниже линия тем лучше).

На этом всё. Приятной работы!

Ключевые слова: nginx, mrtg, мониторинг.

Комментарии:

Ladm 2011-11-27 21:23:10 (#)

MooSe, а что тебя на MRTG посадило? жаль щас нет времени пробовать твои решения...

MooSE 2011-11-27 22:43:02 (#)

Цитата:

MooSe, а что тебя на MRTG посадило? жаль щас нет времени пробовать твои решения...


Так получилось что я для внутренних нужд одного проекта на работе написал небольшую обёртку для MRTG. Сейчас у меня есть шаблоны наблюдаемых параметров и описания хостов. Последние состоят из перечислений наблюдаемых для этого хоста параметров. Ну и ещё кое-какие плюшки.

В итоге MRTG стал гораздо удобнее в использовании чем в дефолтном варианте и превратился в относительно съедобную систему мониторинга.

А тут я публикую небольшие кусочки из того что сделал:)

Anonymous 2014-02-21 21:07:52 (#)

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

MooSE 2014-02-22 00:12:35 (#)

Цитата:

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

А данные точно записываюся? И много ли запросов? Если запросов мало то тупо нечего рисовать.

Anonymous 2014-02-22 09:37:56 (#)

Active connections - 5 - 10 есть всегда

заметил что в базу записывается только последнее число т.е в nginx.log и nginx.old есть записи только токого вида:

1393047301 4724 6837
1393047301 0 0 0 0
1393047001 0 0 0 0
1393047000 0 0 0 0
1393046700 0 0 0 0
1393046400 0 0 0 0
1393046100 0 0 0 0
1393045800 0 0 0 0
1393045500 0 0 0 0
1393045200 0 0 0 0
1393044900 0 0 0 0
1393044600 0 0 0 0
1393044300 0 0 0 0
1393044000 0 0 0 0
.....


1393047001 4713 6825
1393047001 0 0 0 0
1393046701 0 0 0 0
1393046700 0 0 0 0
1393046400 0 0 0 0
1393046100 0 0 0 0
1393045800 0 0 0 0
1393045500 0 0 0 0
1393045200 0 0 0 0
1393044900 0 0 0 0
1393044600 0 0 0 0
1393044300 0 0 0 0
1393044000 0 0 0 0
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE