ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Сбор статистики о файле



On Thu, 13 Apr 2006, ForJest wrote:

Игорь, я пытаюсь написать модуль для тела ответа, но пока не могу его
активировать.
Т.е. я уже научился компилировать его, включил в конфигурацию и т.п., но
в цепочку судя по логу не попадает.
Остальные дебаг печать попадают нормально.
Пожалуйста посоветуйте - что я делаю неверно?

config файл модуля должен быть примерно таким:
-------------
ngx_addon_name=ngx_http_request_stats_filter_module

HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES 
ngx_http_request_stats_filter_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS 
$ngx_addon_dir/ngx_http_request_stats_filter_module.c"
-------------

Я пытаюсь сделать чтобы передавалось имя файла в модуль, и если оно
есть, то активировался этот модуль. Я планирую туда запихать
переменные из rewrite впоследствии.

Ещё вопрос - как правильно включить debug логи? Если просто сделать
error_log debug, то там светися только accept и т.п., мне пришлось
сделать хак небольшой:

log->log_level = NGX_LOG_DEBUG_HTTP | NGX_LOG_DEBUG_EVENT | NGX_LOG_DEBUG_CORE;
Но я вижу
static const char *debug_levels[] = {
   "debug_core", "debug_alloc", "debug_mutex", "debug_event",
   "debug_http", "debug_imap"
};
Но не знаю куда это и как вставить правильно.

По идее, error_log debug достаточно.

On 4/11/06, Igor Sysoev <is@xxxxxxxxxxxxx> wrote:
On Mon, 10 Apr 2006, ForJest wrote:

У меня возникла задача собирать статитстику об отдаваемом файле и
записывать её в отдельный файл/или передавать какому-нибудь демону,
раз, в допустим, 1-2 секунды.
Характеристики:
- Сколько отдано на данный момент байтов
- Скорость последняя отдачи файла
- Скорость усреднённая соединения
и т.п.

Система FreeBSD 5.4, используется ограничение по скорости через x-limit-rate.

Где лучше это вставить/какой модуль ковырять? Я, конечно, со временем
разберусь в коде, но думаю Вы можете существенно сократить время моих
поисков.

Скорее всего, нужно писать фильтр для тела ответа.


Игорь Сысоев
http://sysoev.ru


/*
* Copyright (C) Igor Sysoev
*/


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>

typedef struct {
   ngx_str_t   request_stats_filename;
} ngx_http_request_stats_conf_t;

static ngx_int_t ngx_http_request_stats_filter_init(ngx_cycle_t *cycle);
static void *ngx_http_request_stats_create_conf(ngx_conf_t *cf);

static ngx_command_t  ngx_http_request_stats_commands[] = {

   { ngx_string("request_stats_filename"),
     NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
     ngx_conf_set_str_slot,
     NGX_HTTP_LOC_CONF_OFFSET,
     offsetof(ngx_http_request_stats_conf_t, request_stats_filename),
     NULL },

     ngx_null_command
};

static ngx_http_module_t  ngx_http_request_stats_filter_module_ctx = {
   NULL,                                  /* preconfiguration */
   NULL,                                  /* postconfiguration */

   NULL,                                  /* create main configuration */
   NULL,                                  /* init main configuration */

   NULL,                                  /* create server configuration */
   NULL,                                  /* merge server configuration */

   ngx_http_request_stats_create_conf,         /* create location
configuration */
   NULL                                   /* merge location configuration */
};


ngx_module_t  ngx_http_request_stats_filter_module = {
   NGX_MODULE_V1,
   &ngx_http_request_stats_filter_module_ctx,  /* module context */
   ngx_http_request_stats_commands,            /* module directives */
   NGX_HTTP_MODULE,                       /* module type */
   NULL,                                  /* init master */
   ngx_http_request_stats_filter_init,         /* init module */
   NULL,                                  /* init process */
   NULL,                                  /* init thread */
   NULL,                                  /* exit thread */
   NULL,                                  /* exit process */
   NULL,                                  /* exit master */
   NGX_MODULE_V1_PADDING
};

static ngx_http_output_body_filter_pt    ngx_http_next_body_filter;

static ngx_int_t
ngx_http_request_stats_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
                  "request stats %d", ngx_time());
    return ngx_http_next_body_filter(r, in);
}

static ngx_int_t
ngx_http_request_stats_filter_init(ngx_cycle_t *cycle)
{
   ngx_http_next_body_filter = ngx_http_top_body_filter;
   ngx_http_top_body_filter = ngx_http_request_stats_body_filter;
   return NGX_OK;
}

static void *
ngx_http_request_stats_create_conf(ngx_conf_t *cf)
{
   ngx_http_request_stats_conf_t  *conf;

   conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_request_stats_conf_t));
   if (conf == NULL) {
       return NGX_CONF_ERROR;
   }
   return conf;
}




Игорь Сысоев
http://sysoev.ru



 




Copyright © Lexa Software, 1996-2009.