新聞中心
過濾模塊簡介
執(zhí)行時間和內(nèi)容
過濾(filter)模塊是過濾響應(yīng)頭和內(nèi)容的模塊,可以對回復(fù)的頭和內(nèi)容進行處理。它的處理時間在獲取回復(fù)內(nèi)容之后,向用戶發(fā)送響應(yīng)之前。它的處理過程分為兩個階段,過濾 HTTP 回復(fù)的頭部和主體,在這兩個階段可以分別對頭部和主體進行修改。

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)公司推出涇縣免費做網(wǎng)站回饋大家。
在代碼中有類似的函數(shù):
ngx_http_top_header_filter(r);
ngx_http_top_body_filter(r, in);就是分別對頭部和主體進行過濾的函數(shù)。所有模塊的響應(yīng)內(nèi)容要返回給客戶端,都必須調(diào)用這兩個接口。
執(zhí)行順序
過濾模塊的調(diào)用是有順序的,它的順序在編譯的時候就決定了??刂凭幾g的腳本位于 auto/modules 中,當你編譯完 Nginx 以后,可以在 objs 目錄下面看到一個 ngx_modules.c 的文件。打開這個文件,有類似的代碼:
ngx_module_t *ngx_modules[] = {
...
&ngx_http_write_filter_module,
&ngx_http_header_filter_module,
&ngx_http_chunked_filter_module,
&ngx_http_range_header_filter_module,
&ngx_http_gzip_filter_module,
&ngx_http_postpone_filter_module,
&ngx_http_ssi_filter_module,
&ngx_http_charset_filter_module,
&ngx_http_userid_filter_module,
&ngx_http_headers_filter_module,
&ngx_http_copy_filter_module,
&ngx_http_range_body_filter_module,
&ngx_http_not_modified_filter_module,
NULL
};從 write_filter 到 not_modified_filter,模塊的執(zhí)行順序是反向的。也就是說最早執(zhí)行的是 not_modified_filter,然后各個模塊依次執(zhí)行。一般情況下,第三方過濾模塊的 config 文件會將模塊名追加到變量 HTTP_AUX_FILTER_MODULES 中,此時該模塊只能加入到 copy_filter 和 headers_filter 模塊之間執(zhí)行。
Nginx 執(zhí)行的時候是怎么按照次序依次來執(zhí)行各個過濾模塊呢?它采用了一種很隱晦的方法,即通過局部的全局變量。比如,在每個 filter 模塊,很可能看到如下代碼:
static ngx_http_output_header_filter_pt ngx_http_next_header_filter;
static ngx_http_output_body_filter_pt ngx_http_next_body_filter;
...
ngx_http_next_header_filter = ngx_http_top_header_filter;
ngx_http_top_header_filter = ngx_http_example_header_filter;
ngx_http_next_body_filter = ngx_http_top_body_filter;
ngx_http_top_body_filter = ngx_http_example_body_filter;ngx_http_top_header_filter 是一個全局變量。當編譯進一個 filter 模塊的時候,就被賦值為當前 filter 模塊的處理函數(shù)。而 ngx_http_next_header_filter 是一個局部全局變量,它保存了編譯前上一個 filter 模塊的處理函數(shù)。所以整體看來,就像用全局變量組成的一條單向鏈表。
每個模塊想執(zhí)行下一個過濾函數(shù),只要調(diào)用一下 ngx_http_next_header_filter 這個局部變量。而整個過濾模塊鏈的入口,需要調(diào)用 ngx_http_top_header_filter 這個全局變量。ngx_http_top_body_filter 的行為與 header fitler 類似。
響應(yīng)頭和響應(yīng)體過濾函數(shù)的執(zhí)行順序如下所示:
這圖只表示了 head_filter 和 body_filter 之間的執(zhí)行順序,在 header_filter 和 body_filter 處理函數(shù)之間,在 body_filter 處理函數(shù)之間,可能還有其他執(zhí)行代碼。
模塊編譯
Nginx 可以方便的加入第三方的過濾模塊。在過濾模塊的目錄里,首先需要加入 config 文件,文件的內(nèi)容如下:
ngx_addon_name=ngx_http_example_filter_module
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES ngx_http_example_filter_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_example_filter_module.c"說明把這個名為 ngx_http_example_filter_module 的過濾模塊加入,ngx_http_example_filter_module.c 是該模塊的源代碼。
注意 HTTP_AUX_FILTER_MODULES 這個變量與一般的內(nèi)容處理模塊不同。
名稱欄目:創(chuàng)新互聯(lián)nginx教程:Nginx過濾模塊簡介
分享URL:http://www.fisionsoft.com.cn/article/cojhigd.html


咨詢
建站咨詢
