как правильно зарегистрировать фильтр заголовков nginx?

Я пишу модуль 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 каждый раз перезаписывает этот файл.


person Vitaly Kushner    schedule 04.10.2010    source источник


Ответы (1)


ОК, так что я понял это сам. Задокументируйте это здесь, если кому-то еще это понадобится.

Я добавлял свой модуль в неправильный список. Модуль nginx настраивается через файл «config», встроенный в каталог модуля. У меня была следующая строка:

HTTP_MODULES="$HTTP_MODULES ngx_http_my_module_name"

Я искал использование HTTP_MODULES и нашел nginx/auto/modules скрипт, который на самом деле создает ngx_modules.c файл. Оказывается, есть несколько возможных списков модулей, используемых nginx/auto/modules. Мне нужно было добавить свой модуль в список HTTP_AUX_FILTER_MODULES следующим образом:

HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_my_module_name"

Это поместило мой модуль в нужное место сразу после HTTP_HEADERS_FILTER_MODULE и устранило проблему.

person Vitaly Kushner    schedule 07.10.2010