ПРОЕКТЫ 


  АРХИВ 


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: The location configuration bug?



Хотелось бы просто разобраться,
почему на запрос типа "GET /index.html"
получаем use = debug = 0 при данном конфиге.

в мануале четко сказано как идет
обработка,
Где конкретно?

----- Original Message ----- From: "AlexeyK" <itsmegawtf@xxxxxxxxx>
To: <nginx-ru@xxxxxxxxx>
Sent: Tuesday, October 09, 2007 6:09 PM
Subject: Re: The location configuration bug?


Рискну предположить, что вы считаете, первым всегда обрабатывается
location / { }, но это не так, в мануале четко сказано как идет
обработка, к тому же если ваш третий пункт верен, то дебаг будет
срабатывать исключительно для GET / или подобных запросов, но не
включать в себя GET /backend, т.к. для него существует его собственное
правило в location /backend { }


2007/10/9, Denis Erygin <erygin@xxxxxxxxxxxx>:


Добрый день,

Обнаружил следующие "странности" при обработке конфигурации "location"
уровня
в модуле-фильтре:

worker_processes  1;
daemon off;
master_process off;
* * * *
http {
   * * *
   server {
       * * *
      location / {
        use on;
        debug on;
      }

      location /backend {
         proxy_pass ....;
      }
   }
}

=============================================================

typedef struct {
    ngx_flag_t use;
    ngx_flag_t debug;
} ngx_http_draft_loc_conf_t;

static ngx_command_t  ngx_http_draft_filter_commands[] = {
    { ngx_string("use"),
      NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_draft_loc_conf_t, enable),
      NULL },
    { ngx_string("debug"),
      NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,
      ngx_conf_set_flag_slot,
      NGX_HTTP_LOC_CONF_OFFSET,
      offsetof(ngx_http_draft_loc_conf_t, debug),
      NULL },
    ngx_null_command
};

static ngx_http_module_t  ngx_http_draft_module_ctx = {
    NULL,                                  //
preconfiguration
    ngx_http_draft_filter_init,        // postconfiguration

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

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

    ngx_http_draft_create_loc_conf,         // create
location configuration
    ngx_http_draft_merge_loc_conf           // merge
location configuration
};

static ngx_int_t ngx_http_draft_filter_init ( ngx_conf_t* cf )
{
    ngx_http_next_header_filter = ngx_http_top_header_filter;
    ngx_http_top_header_filter  = ngx_http_draft_header_filter;

    ngx_http_next_body_filter = ngx_http_top_body_filter;
    ngx_http_top_body_filter  = ngx_http_draft_body_filter;

    return NGX_OK;
}

static void* ngx_http_draft_create_loc_conf ( ngx_conf_t* cf )
{
    unsigned i;
    ngx_http_draft_loc_conf_t* conf;

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

    printf("ngx_http_draft_create_loc_conf('%s', %p,
 %d)\n", cf->name, cf->args,  cf->args->nelts);
    char** arr = cf->args->elts; // какой формат элементов массива?
    for (i = 0; i < cf->args->nelts; i++)
    {
       printf("[%p]\n", arr[i]);
    }

    conf->use = NGX_CONF_UNSET;
    conf->debug  = NGX_CONF_UNSET;

    return conf;
}

static char* ngx_http_draft_merge_loc_conf ( ngx_conf_t* cf, void* parent,
void* child )
{
    unsigned int i;
    ngx_http_draft_loc_conf_t* prev = parent;
    ngx_http_draft_loc_conf_t* conf = child;

    ngx_conf_merge_value ( conf->use, prev->use, 0 );
    ngx_conf_merge_value ( conf->debug, prev->debug, 0 );

    printf("ngx_http_draft_merge_loc_conf('%s', %p, %d):
use: %d, debug: %d\n",
    cf->name, cf->args,  cf->args->nelts, conf->use, conf->debug);

    return NGX_CONF_OK;
}

===========================================================================
$ sbin/nginx -t

ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 1)
[0x4]
                      - какой формат?
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 1)
[0x6]
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 2)
[0x8]
[0x80c1b7c]
ngx_http_draft_create_loc_conf('(null)', 0x80b3878, 2)
[0x8]
[0x80c2130]

ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use:
0, debug: 0
ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use:
1, debug: 1
ngx_http_draft_merge_loc_conf('(null)', 0x80b3878, 0): use:
0, debug: 0

2007/10/09 17:41:14 [info] 18647#0: the configuration file conf/nginx.conf
syntax is ok
2007/10/09 17:41:14 [info] 18647#0: the configuration file conf/nginx.conf
was tested successfully

===========================================================================

1) Откуда вызовы до "location / {}" ?
2) Число вызовов "ngx_http_draft_create_loc_conf" и
"ngx_http_draft_merge_loc_conf" несовпадает?
3) Последний вызов "ngx_http_draft_merge_loc_conf" (видимо "location
/backend {}"?) сбрасывает use и debug.

В результате, если получить указатель
ngx_http_draft_loc_conf_t* conf = ngx_http_get_module_loc_conf ( r,
ngx_http_draft_filter_module );
в ngx_http_draft_body_filter( url = "/" ), то получим:

conf->use = conf->debug = 0











 




Copyright © Lexa Software, 1996-2009.