Суббота, 16 Май 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. — этот пост будет обновляться по мере продвижения работы
Комментарии
ммм… а ап чём это вообще??? :)
Берешь nginx c сайта sysoev.ru, накладываешь на него этот патч. Добавляешь location в конфиг, заходишь на него браузером и понимаешь что это :)
Наверное стоит добавить инструкцию по сборке;)
Я делал так: сырцы 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
Видимо я что-то не так сделал. Хотя исходники изменились и новый модуль вроде бы добавился.
Предполагал я что накладывать будут на самый последний nginx :)
Ага, получилось.
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 (Кто, какой файл и сколько уже отдано/осталось) самая желаемая фича;)
Ах да, проверить можно тут http://213.186.116.114/status (нашел самый нагруженный сервер)
А можешь мне конфиг в почту дать?
Выслал.
Странно, у меня получается вот что. Хотя я делал без perl.
А что странного?
У меня странная только последняя цифры, она портится, когда там большие числа получаются. Т.е. сделай какой-то ab или типа того, доведи до десятков тысяч число запросов и увидишь, наверное.
Спасибо. Воспроизвел — скоро будет 0.0.2, в нем и будет исправление
Тести :)
Да, спасибо, поправлено.
На окна смотрел?
В смысле, на окна? Не совсем понял что это
Накатил третий патч, появились какие-то артефакты:
<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>
Как сюда вставить текст с нормальными переносами?
4 пробела перед строкой :) Там над полем есть ссылка на синтаксис.
Задумывается детализация статистики по location (сколько к ней было обращений и сколько, и каких кодов ответа ушло к клиентам).
А статистика в реальном времени относительно того, какие обращения идут сейчас, есть в планах?
И еще вопрос, возможна ли детализация на уровне uri обращения, а не location?
Ага, есть такие планы. Будет две настройки — максимальное окно для хранение статистики посекундно и за сколько секунд показывать. Т.е. можно будет хранить за 15 минут + общую, и показывать: всю, 5s, 30s, 1m, 5m, 10m, 15m :)
На уровне uri — надо думать.
4й патч не работает. Пишет что невалидный конфиг (без указания причины). Накатил назад 3й - работает.
/usr/local/nginx/sbin/nginx -t configuration file /usr/local/nginx/conf/nginx.conf test failed
В 0.0.4 изменился формат директивы. Перечитайт пост.
Хочется YAML или JSON интерфейс.
Ушел тестить
Форма комментирования для «nginx: черновик нового статуса»
записал в todo, спасибо
Кирилл, ты фильтруй пожелания всё-таки. А то будет как тогда.
То что я туда записываю, не означает что я это буду делать в ближайшее время. json интереснее чем xml — но тут надо очень много думать.
Работает.
В имени файла все таки лучше версию nginx’а упомянуть, чтобы не путаться.
ЗЫ: Жду чего-нибудь более структурированного, чем голый текст, чтобы написать плагин для cacti, например.
На самом деле голый текст очень хорошо структурирован. После конца работы над функционалом статуса, я займусь html мордой, что бы можно было людям смотреть удобно и красиво :)
Всякие xml, json и прочие — может и надо, но я не уверен что стоит это делать да и сил хватит :)
вот такой статус будет лучше:
Посмотрел пример http://213.186.116.114/status. И появилось несколько мыслей:
Я статусы обычно читаю curl ссылка | less :)
Пример будет, но не черновика а итогового модуля. Т.е. когда я его закончу.