Добрый день,
Обнаружил следующие "странности" при обработке конфигурации "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