The location configuration bug?

AlexeyK itsmegawtf at gmail.com
Tue Oct 9 18:09:14 MSD 2007


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


2007/10/9, Denis Erygin <erygin at corp.mail.ru>:
>
>
> Добрый день,
>
> Обнаружил следующие "странности" при обработке конфигурации "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
>
>
>
>
>
>


More information about the nginx-ru mailing list