как правильно зарегистрировать фильтр заголовков nginx? - PullRequest
2 голосов
/ 05 октября 2010

Я пишу модуль 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 * * * 100 * 100 * * * 100 * 100 * * * * * * * * 100 * 100 * * * * * * * * * * * 100 * 100 * * * * * * * * * * * * * * * * * * * * * * * 100 * * * * * * * 100 * 100 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * '* * * * * * * 100 * 100 * * * * * * * * 100 * 100 * * * * * * * * 100 * 100 * * * * * * * * 100 * 100 * * * * * * * * * * * * * * * * * * * * * * * *' 100 ''как будто он предназначен для самого последнего вызова, так почему же постконфигурация моего модуля называется первой?

Из того, что я вижу, порядок модулей установлен в objs / ngx_modules.c

Я смог решить проблему, переставив там модули вручную, так что мой модуль появился после ngx_http_header_filter_module, но это выглядит как уродливый хак, а также затрудняет автоматизацию процесса сборки, так как ./configure каждый раз перезаписывает этот файл.1011 *

1 Ответ

6 голосов
/ 07 октября 2010

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

Я добавил свой модуль в неправильный список. Модуль 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 и устранило проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...