Saturday, 16 May 2009

nginx: черновик нового статуса

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

Работа закончена. Итоги тут.

Эта запись будет использоваться как список что уже сделано и что предстоит сделать, давайте попробуем.

Планы
  • API для добавления счетчиков в статус из своих модулей.
  • текстовый интерфейс отображения статуса.
  • настройка окон для хранения и отображения статуса.
  • внести в статус счетчики запросов по location/server.
  • внести в статус счетчики запросов по кодам ответов для location/server.
  • фильтрация location/server или их кодов из статистики.

любые предложения по счетчикам принимаются. Замечания о изменение дизайна представления информации тоже.

Возможные планы

эти пункты, скорее всего не будут реализованы. Но все может случится ☺

  • html интерфейс отображения статуса
  • xml интерфейс отображения статуса
  • json интерфейс отображения статуса
Черновики

Накладывать, лучше на версию 0.7.57

Описание директив:

syntax: status_window период
default: status_window 300
context: в оснвоной части конфига

Директива устанавливает максимально период хранения посекундной информации о событиях. Чем дольше храним — тем больше требуется памяти.

syntax: status_txt период [период …]
default: отсуствует
context: location

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

syntax: status_capture код [код …]
default: отсуствует
context: location

Директива устанавливает коды ответа сервера, которые будут помещаться в статус.

Пример использования

Для конфига

server {    
    listen   8080 default;

    location = / {
        status_capture 200 204;
        return 204;
    }

    location / {
        status_capture 204;
        return 204;
    }

    location /status {
        status_capture 200;
        status_txt 0 5 15 300;
    }

    location ~ .html {
        return 204;
    }

}

server {    
    listen   8080;
    server_name catap.ru;

    location = / {
        return 204;
    }

    location / {
        return 204;
    }
}

Будет генерироваться статус вида:

Server nginx/0.7.57 satellite
Last config reload: 1243094190 (23/May/2009 19:56:30 +0400)
Uptime: 515 (0d 0h 8m 35s)

Active connections: 1 
server accepts handled requests
 2696485 2696485 2696539 
Reading: 0 Writing: 1 Waiting: 0 

Request for host default, momentary: 2696539(4140)
 locations info:
  Location = /: 2696480(4139)
   codes list:
    200 OK: 0(0)
    204 No Content: 2696480(4139)
  Location /: 2(0)
   codes list:
    204 No Content: 2(0)
  Location /status: 57(1)
   codes list:
    200 OK: 56(0)
  Location ~ .html: 0(0)
Request for host catap.ru, momentary: 0(0)
 locations info:
  Location = /: 0(0)
  Location /: 0(0)

Request for host default, for last 5 seconds: 22926(4585)
 locations info:
  Location = /: 22925(4585)
   codes list:
    200 OK: 0(0)
    204 No Content: 22925(4585)
  Location /: 0(0)
   codes list:
    204 No Content: 0(0)
  Location /status: 1(0)
   codes list:
    200 OK: 0(0)
  Location ~ .html: 0(0)
Request for host catap.ru, for last 5 seconds: 0(0)
 locations info:
  Location = /: 0(0)
  Location /: 0(0)

Request for host default, for last 15 seconds: 74485(4965)
 locations info:
  Location = /: 74484(4965)
   codes list:
    200 OK: 0(0)
    204 No Content: 74484(4965)
  Location /: 0(0)
   codes list:
    204 No Content: 0(0)
  Location /status: 1(0)
   codes list:
    200 OK: 0(0)
  Location ~ .html: 0(0)
Request for host catap.ru, for last 15 seconds: 0(0)
 locations info:
  Location = /: 0(0)
  Location /: 0(0)

Request for host default, for last 300 seconds: 1584722(5282)
 locations info:
  Location = /: 1584693(5282)
   codes list:
    200 OK: 0(0)
    204 No Content: 1584693(5282)
  Location /: 0(0)
   codes list:
    204 No Content: 0(0)
  Location /status: 29(0)
   codes list:
    200 OK: 28(0)
  Location ~ .html: 0(0)
Request for host catap.ru, for last 300 seconds: 0(0)
 locations info:
  Location = /: 0(0)
  Location /: 0(0)

p.s. — этот пост будет обновляться по мере продвижения работы

Write on: 18:41 | 31 comment | | tags: , , , , | permalink |
Add post to:   Delicious Reddit Slashdot Digg Technorati Google


Add comment

Comments

Ivan Fedorov 16.05.2009 19:49

ммм… а ап чём это вообще??? :)

reply
Kirill A. Korinskiy 16.05.2009 20:49

Берешь nginx c сайта sysoev.ru, накладываешь на него этот патч. Добавляешь location в конфиг, заходишь на него браузером и понимаешь что это :)

reply
Andrew 16.05.2009 22:50

Наверное стоит добавить инструкцию по сборке;)

Я делал так: сырцы nginx лежат в папке nginx-0.7.22 в хомяке. В хомяк качаю патч, накатываю так: cat ngx_status-0.0.1.patch | patch -d nginx-0.7.22 -p1

Собираю nginx с вот такими параметрами:

—prefix=/usr/local/nginx —with-http_addition_module —with-http_dav_module —with-http_perl_module —with-http_realip_module —with-http_stub_status_module —with-http_sub_module

Добавляю в конфиг

location /status { status_txt on; access_log off; allow all; }

/usr/local/nginx/sbin/nginx -t 2009/05/16 18:42:25 [emerg] 61435#0: unknown directive “status_txt” in /usr/local/nginx/conf/nginx.conf:71 2009/05/16 18:42:25 [emerg] 61435#0: the configuration file /usr/local/nginx/conf/nginx.conf test failed

Видимо я что-то не так сделал. Хотя исходники изменились и новый модуль вроде бы добавился.

reply
Kirill A. Korinskiy 16.05.2009 23:07

Предполагал я что накладывать будут на самый последний nginx :)

reply
Andrew 17.05.2009 13:42

Ага, получилось.

Server nginx/0.7.57 a4 Last config reload: 1242552718 (17/May/2009 09:31:58 +0000) Uptime: 229 (0d 0h 3m 49s)

Active connections: 1167 server accepts handled requests 34429 34406 34195 Reading: 207 Writing: 960 Waiting: 0

Request for host default, Location /50x.html: 30880 Request for host default, Location /dl: 575 Request for host default, Location /cl: 31895 Request for host default, Location /: 34177 Request for host default, Location /nginx_status: 6 Request for host default, Location /status: 10 Request for host default: 34195ґ

Последний символ самый как я понимаю должен быть цифрой. Детализация Active connections: 1167 (Кто, какой файл и сколько уже отдано/осталось) самая желаемая фича;)

reply
Andrew 17.05.2009 13:45

Ах да, проверить можно тут http://213.186.116.114/status (нашел самый нагруженный сервер)

reply
Kirill A. Korinskiy 17.05.2009 16:07

А можешь мне конфиг в почту дать?

reply
Andrew 17.05.2009 16:29

Выслал.

reply
Kirill A. Korinskiy 17.05.2009 16:58

Странно, у меня получается вот что. Хотя я делал без perl.

Server nginx/0.7.57 satellite
Last config reload: 1242564720 (17/May/2009 16:52:00 +0400)
Uptime: 17 (0d 0h 0m 17s)

Active connections: 1 
server accepts handled requests
 14 14 14 
Reading: 0 Writing: 1 Waiting: 0 

Request for host default, Location /50x.html: 0
Request for host default, Location /dl: 0
Request for host default, Location /cl: 0
Request for host default, Location /: 2
Request for host default, Location /nginx_status: 0
Request for host default, Location /status: 13
Request for host default: 14
reply
Andrew 17.05.2009 17:29

А что странного?

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

reply
Kirill A. Korinskiy 17.05.2009 21:06

Спасибо. Воспроизвел — скоро будет 0.0.2, в нем и будет исправление

reply
Andrew 18.05.2009 1:31

Да, спасибо, поправлено.

reply
Kirill A. Korinskiy 18.05.2009 16:53

На окна смотрел?

reply
Andrew 18.05.2009 21:54

В смысле, на окна? Не совсем понял что это

Накатил третий патч, появились какие-то артефакты:

<pre><code> Server nginx/0.7.57 a4 Last config reload: 1242668704 (18/May/2009 17:45:04 +0000) Uptime: 90 (0d 0h 1m 30s)

Active connections: 1463 server accepts handled requests 21861 21848 21712 Reading: 135 Writing: 1328 Waiting: 0

Request for host default Location = /50x.html: 19908 Request for host default Location /dlf: 669 Request for host default Location /clp: 20624 Request for host default Location /s: 21690 Request for host default Location /nginx_statuse: 1 Request for host default Location /status : 15 Request for host default: 21712 </code></pre>

reply
Andrew 18.05.2009 21:55

Как сюда вставить текст с нормальными переносами?

reply
Kirill A. Korinskiy 19.05.2009 1:11

4 пробела перед строкой :) Там над полем есть ссылка на синтаксис.

reply
Kirill A. Korinskiy 17.05.2009 16:13

Задумывается детализация статистики по location (сколько к ней было обращений и сколько, и каких кодов ответа ушло к клиентам).

reply
Andrew 17.05.2009 16:30

А статистика в реальном времени относительно того, какие обращения идут сейчас, есть в планах?

И еще вопрос, возможна ли детализация на уровне uri обращения, а не location?

reply
Kirill A. Korinskiy 17.05.2009 16:51

Ага, есть такие планы. Будет две настройки — максимальное окно для хранение статистики посекундно и за сколько секунд показывать. Т.е. можно будет хранить за 15 минут + общую, и показывать: всю, 5s, 30s, 1m, 5m, 10m, 15m :)

На уровне uri — надо думать.

reply
Andrew 22.05.2009 12:41

4й патч не работает. Пишет что невалидный конфиг (без указания причины). Накатил назад 3й - работает.

/usr/local/nginx/sbin/nginx -t configuration file /usr/local/nginx/conf/nginx.conf test failed

reply

Comment form for «nginx: черновик нового статуса»

Required. 30 chars of fewer.

Required.

Kirill A. Korinskiy 22.05.2009 17:06

В 0.0.4 изменился формат директивы. Перечитайт пост.

reply
Станислав 16.05.2009 21:27

Хочется YAML или JSON интерфейс.

Ушел тестить

reply
Kirill A. Korinskiy 16.05.2009 22:26

записал в todo, спасибо

reply
asd 16.05.2009 22:47

Кирилл, ты фильтруй пожелания всё-таки. А то будет как тогда.

reply
Kirill A. Korinskiy 16.05.2009 23:07

То что я туда записываю, не означает что я это буду делать в ближайшее время. json интереснее чем xml — но тут надо очень много думать.

reply
Станислав 17.05.2009 3:33

Работает.

В имени файла все таки лучше версию nginx’а упомянуть, чтобы не путаться.

ЗЫ: Жду чего-нибудь более структурированного, чем голый текст, чтобы написать плагин для cacti, например.

reply
Kirill A. Korinskiy 17.05.2009 16:15

На самом деле голый текст очень хорошо структурирован. После конца работы над функционалом статуса, я займусь html мордой, что бы можно было людям смотреть удобно и красиво :)

Всякие xml, json и прочие — может и надо, но я не уверен что стоит это делать да и сил хватит :)

reply
CoolCold 18.05.2009 21:56

вот такой статус будет лучше:

Total requests for host default, momentary: 2452341(6504)
locations info:
 =/ : 2452329(6503)
 codes list:
  200:  
  204:  
  404:
 / : 0(0)
 /status : 12(1)
 ~ .html : 0(0)

Total requests for host default, for last 300 seconds:
locations info:
 =/ : 123141(4503)
 codes list:
  200:  
  204:  
  404:
 / : 0(0)
 /status : 12(1)
 ~ .html : 0(0)
reply
Винокуров Илья 19.05.2009 11:57

Посмотрел пример http://213.186.116.114/status. И появилось несколько мыслей:

  • Нужно сделать на catap.ru страницу-пример с последней версией патча.
  • При просмотре статистики я видел огромные числа и не понимал за какое время они набежали. По-моему очень хорошо отображать текущую и максимальную нагрузку в хитах в секунду(минуту).
  • В статусе хорошо бы расшифровывать цифирь: Мне не понятно что означают числа в круглых скобках [Request for host default Location = /: 2452329(6503), 34635(6927), 103406(6893), 2116317(7054)]. Да и не понятно почему числа приведены через запятую.
  • Content-Type text/plain нормально отображает только IE. FF и Ch запускают для отображения Блокнот :(
reply
Kirill A. Korinskiy 19.05.2009 12:31

Я статусы обычно читаю curl ссылка | less :)

Пример будет, но не черновика а итогового модуля. Т.е. когда я его закончу.

reply