Сбор Статиcтики О Работе Сервера nginx При Помощи rrdtool

Posted by Alexey Kovyrin under Development, Networks · english

Неcколько дней тому назад я установил nginx на одном из своих adult-проектов как reverse proxy server и сервер для раздачи статичечких файлов. Вчера, когда трафик с этого сервера достиг 200Mbit/сек и, наверное, потому, что все админы любят рисовать графики, я решил отобразить статистику работы сервера nginx на графиках чтобы увидеть загрузку не только в мегабитах и системных параметрах загрузки сервера. В результате работы над этими графиками родился скрипт на perl, использующий модель RRDs для создания и управления базой rrd и рисования очень красивых графиков.

Скрипт очень прост в установке и настройке. Вы можете использовать следующий набор шагов для получения симпатичных графиков со статистикой работы вашего nginx-сервера:

  • Добавьте в конфигурационный файл nginx следующий раздел location:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    http {
        ...
        server {
            listen SOME.IP.ADD.RESS;
            ...
            location /nginx_status {
                stub_status on;
                access_log   off;
                allow SOME.IP.ADD.RESS;
                deny all;
            }
            ...
        }
        ...
    }
  • Проверьте свою конфигурацию следующей командой:
    1
    2
    3
    4
    # /your/installation/sbin/nginx -t
    2006/04/29 04:24:36 [info] 31676#0: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
    2006/04/29 04:24:36 [info] 31676#0: the configuration file /opt/nginx/conf/nginx.conf was tested successfully
    #

    Если вы получите сообщение о том, что директива stub_status неизвестна, то проверьте включена ли опция ----with-http_stub_status_module при компиляции nginx.

  • Если проверка конфигурации прошла успешно, перезапустите nginx и проверьте статистику:
    1
    2
    3
    4
    5
    6
    croesus:~# GET http://your-domain.com/nginx_status
    Active connections: 1492
    server accepts handled requests
     2124355 2124355 8278635
    Reading: 6 Writing: 405 Waiting: 1081
    croesus:~#
  • Скачайте скрипт генерации графиков: rrd_nginx.pl и сделайте его исполнимым:
    1
    # chmod +x rrd_nginx.pl
  • Измените настройки в файле rrd_nginx.pl, чтобы дать скрипту знать, куда складывать rrd-базу и картинки со статистикой:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    use RRDs;
    use LWP::UserAgent;

    # определите путь к базам для rrdtool
    my $rrd = '/opt/rrd';
    # определите путь к картинкам
    my $img = '/opt/rrd/html';
    # определите URL для статистики nginx
    my $URL = "http://your-domain.com/nginx_status";
    ...
  • Последний шаг в настройке – добавление следующей команды в файл /etc/crontab и перезапуск демона cron:
    * *     * * *   root    /some/path/rrd_nginx.pl
    

Когда все приготовления будут завершены, Вы получите в каталоге $img следующие графики:

  • Nginx connections statistics:
  • Nginx requests statistics:

Вот и все. Если у Вас есть какие-либо коментарии или пожелания, оставляйте их в разделе коментариев. Если заметка вам понравилась, можете поддержать автора обратив внимание на рекламные объявления на этой странице. ;-) .


Related posts:

  1. Обзор Типичных Конфигураций Для Nginx
  2. Nginx – Маленький, Но Очень Мощный И Эффективный Web-Сервер
  3. Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах
  4. Как клонировать виртуальную машину при использовании VmWare Server
  5. Как получить “не зависящий от провайдера” IP-адрес для домашнего сервера?

16 Responses to this entry

Alex says:

У меня странно работает. Запросы в секунду показывает нормально, а вот с другими – беда.
Сначала показал совсем левые значения из миллионных величин (пр: Total Current: 450.0 m)
В дальнейшем так же 4300.0, что не сходится даже со строкой
print “RQ:$requests; TT:$total; RD:$reading; WR:$writing; WA:$waiting\n”;
которая все показывает правильно…
где собака порылась?
Вот здесь можно посмотреть:
http://foxtrot355.server4you.de/stat.html

Alex says:

Нашел ошибку!
вместо:
“DS:total:ABSOLUTE:120:0:60000″,
“DS:reading:ABSOLUTE:120:0:60000″,
“DS:writing:ABSOLUTE:120:0:60000″,
“DS:waiting:ABSOLUTE:120:0:60000″,
надо:
“DS:total:GAUGE:120:0:60000″,
“DS:reading:GAUGE:120:0:60000″,
“DS:writing:GAUGE:120:0:60000″,
“DS:waiting:GAUGE:120:0:60000″,
Теперь данные будут правильно отображаться

PavelR says:

>У меня странно работает. Запросы в секунду >показывает нормально, а вот с другими – беда.

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

Предлагаю заменить

if (/^\s+(\d+)\s+(\d+)\s+(\d+)/) {
> $requests = $3;
> $connects = $1;
> }

Хранение реализовать аналогично хранению $requests, c типом хранилища ABSOLUTE.
(Добавить в RRDs::create
строку “DS:connects:ABSOLUTE:120:0:100000000″,)

Чтобы получать разницу в количестве обработанных соединений между запусками, предыдущее значение записывается в отдельный файл nginx.cns (аналогично хранению числа запросов в файле nginx.rqs).

Добавляемый код:

+my $connects=0;

….

+# get connects
+if (! -e “$rrd/nginx1.cns”) {
+ $cns = 0;
+} else {
+ open RQS, “;
+ close RQS;
+ $cns = $connects if ($cns $rrd/nginx1.cns”;
+print RQS $connects;
+close RQS;

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

$rqs = $requests if ($rqs

PavelR says:

К сожалению не все в сообщении вставилось как ожидалось, но думаю основную идею донес.

Joe says:

So what does it mean if the graphs are never updating (i.e. stay blank). I’ve checked the .conf, nginx_status page as well as making sure the cron is running but the graphs are never being populated. I’ve tried a few things but can’t seem to get it to work.

user@machine ~> nginx -v
nginx version: nginx/0.5.10
user@machine ~> php -v
PHP 4.3.10-18 (cli) (built: Nov 3 2006 21:56:29)
[snip]

Thanks.

Denis says:

It’s possible to have statistic of traffic transfered via nginx?

PavelR: Can you paste all code ?

links for 2008-02-06 « PaxoBlog says:

[...] Monitoring nginx Server Statistics With rrdtool :: Homo-Adminus Blog by Alexey Kovyrin As the result, I have created perl script, which uses RRDs perl module to create and manage rrd-database and very beautiful graphs. (tags: nginx monitoring perl scripts rrd) [...]

beer2beer » Article » Instalando plugins de memcached y nginx para munin says:

[...] En Debian Etch tuve que instalar la librería Perl libwww-perl y re-compilar nginx con el parámetro –with-http_stub_status_module, para habilitar el módulo ngx_http_stub_status_module. Para usar este módulo hay que añadir unas líneas en el fichero de configuración. Es muy simple, pero no voy a entrar en ello. Podéis leer más en la página del wiki del módulo (el enlace anterior) o en este otro enlace. [...]

halfdan says:

Nice article. I guess I’ll give nginx a try on my new server. Oh and..

PavelR: The links posted above gave me a 403 Forbidden.. would be nice to get the current version of your script.

Snakk says:

I was facing the same problem like you.

————————————————-
app201:/home/nginx/rrd# nginx -v
nginx version: nginx/0.5.37
app201:/home/nginx/rrd# php -v
PHP 5.2.0-8+etch11 (cli) (built: May 10 2008 10:46:24)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
app201:/home/nginx/rrd# rrdtool -v
RRDtool 1.2.15 Copyright 1997-2006 by Tobias Oetiker <tobi@oetiker.ch>
Compiled Dec 14 2006 22:05:35

Usage: rrdtool [options] command command_options

Valid commands: create, update, updatev, graph, dump, restore,
last, first, info, fetch, tune, resize, xport

RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (http://www.gnu.org/copyleft/gpl.html)

For more information read the RRD manpages
————————————————-

I don't assure that this method is right but my graph is OK right now. By replacing these lines

RRDs::update “$rrd/nginx.rrd”,
“-t”, “requests:total:reading:writing:waiting”,
“N:$requests:$total:$reading:$writing:$waiting”;

with

RRDs::update (“$rrd/nginx.rrd”, “N:$requests:$total:$reading:$writing:$waiting”);

Cheers,