2010-10-04 51 views
1

我正在寫一個nginx模塊。 從尋找其他的例子,我登記我的頭過濾器在我的模塊postconfiguration鉤:如何正確註冊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; 
} 

但處理程序不會被調用。我給自己定的ngx_http_top_header_filter變化在gdb斷點,看來我模塊的postconfig首先被調用,但然後運行它覆蓋ngx_http_top_header_filter的ngx_http_write_filter_module的postconfig W/O存儲的舊值:

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; 
} 

看起來它被設計成是最後一個被調用的,所以我的模塊的postconfig是如何先被調用的?

從我所看到的模塊的順序在OBJ文件設置/ ngx_modules.c

我能夠通過手動重新排序模塊出現使我的模塊來ngx_http_header_filter_module之後,但這種感覺就像來解決這個問題一個醜陋的黑客攻擊,並且也很難自動化構建過程,因爲./configure每次都會覆蓋此文件。

回答

5

好的,所以我想出了自己。在這裏記錄它以防其他人需要它。

我正在將我的模塊添加到錯誤的列表中。 nginx模塊通過一個'config'文件insed模塊的目錄進行配置。我曾在它的下面一行:

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並解決了問題。

相關問題