Я пишу модуль nginx. Глядя на другие примеры, я регистрирую свой фильтр заголовков в хуке постконфигурации моих модулей:
static ngx_int_t
mod_py_postconfig(ngx_conf_t *cf)
{
ngx_http_next_header_filter = ngx_http_top_header_filter;
ngx_http_top_header_filter = mod_py_headers_filter;
return NGX_OK;
}
Но обработчик никогда не вызывается. Я установил точку останова в gdb при изменении ngx_http_top_header_filter, и кажется, что сначала вызывается postconfig моего модуля, но затем запускается postconfig модуля ngx_http_write_filter_module, который переопределяет ngx_http_top_header_filter без сохранения старого значения:
static ngx_int_t
ngx_http_write_filter_init(ngx_conf_t *cf)
{
ngx_http_top_body_filter = ngx_http_write_filter;
return NGX_OK;
}
похоже, что он предназначен для вызова самым последним, так почему постконфигурация моего модуля вызывается первой?
Из того, что я вижу, порядок модулей установлен в objs/ngx_modules.c.
Я смог решить проблему, вручную переупорядочив модули так, чтобы мой модуль шел после ngx_http_header_filter_module, но это похоже на уродливый хак, а также затрудняет автоматизацию процесса сборки, поскольку ./configure каждый раз перезаписывает этот файл.