在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Linux/ 過(guò)濾模塊簡(jiǎn)介
示例: hello handler 模塊
什么是 Nginx
handler 模塊的掛載
Nginx 特點(diǎn)
handler 模塊簡(jiǎn)介
初探 Nginx 架構(gòu)
Nginx 的模塊化體系結(jié)構(gòu)
更多 handler 模塊示例分析
Nginx 基礎(chǔ)概念
upstream 模塊簡(jiǎn)介
Nginx 的請(qǐng)求處理
過(guò)濾模塊簡(jiǎn)介
基本數(shù)據(jù)結(jié)構(gòu)
模塊的基本結(jié)構(gòu)
負(fù)載均衡模塊
過(guò)濾模塊的分析
core 模塊
handler 模塊的基本結(jié)構(gòu)
Nginx 的配置系統(tǒng)
handler 的編寫(xiě)步驟
handler 模塊的編譯和使用
event 模塊

過(guò)濾模塊簡(jiǎn)介

執(zhí)行時(shí)間和內(nèi)容

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

在代碼中有類(lèi)似的函數(shù):

ngx_http_top_header_filter(r);
ngx_http_top_body_filter(r, in);

就是分別對(duì)頭部和主體進(jìn)行過(guò)濾的函數(shù)。所有模塊的響應(yīng)內(nèi)容要返回給客戶(hù)端,都必須調(diào)用這兩個(gè)接口。

執(zhí)行順序

過(guò)濾模塊的調(diào)用是有順序的,它的順序在編譯的時(shí)候就決定了??刂凭幾g的腳本位于 auto/modules 中,當(dāng)你編譯完 Nginx 以后,可以在 objs 目錄下面看到一個(gè) ngx_modules.c 的文件。打開(kāi)這個(gè)文件,有類(lèi)似的代碼:

        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í)行順序是反向的。也就是說(shuō)最早執(zhí)行的是 not_modified_filter,然后各個(gè)模塊依次執(zhí)行。一般情況下,第三方過(guò)濾模塊的 config 文件會(huì)將模塊名追加到變量 HTTP_AUX_FILTER_MODULES 中,此時(shí)該模塊只能加入到 copy_filter 和 headers_filter 模塊之間執(zhí)行。

Nginx 執(zhí)行的時(shí)候是怎么按照次序依次來(lái)執(zhí)行各個(gè)過(guò)濾模塊呢?它采用了一種很隱晦的方法,即通過(guò)局部的全局變量。比如,在每個(gè) 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 是一個(gè)全局變量。當(dāng)編譯進(jìn)一個(gè) filter 模塊的時(shí)候,就被賦值為當(dāng)前 filter 模塊的處理函數(shù)。而 ngx_http_next_header_filter 是一個(gè)局部全局變量,它保存了編譯前上一個(gè) filter 模塊的處理函數(shù)。所以整體看來(lái),就像用全局變量組成的一條單向鏈表。

每個(gè)模塊想執(zhí)行下一個(gè)過(guò)濾函數(shù),只要調(diào)用一下 ngx_http_next_header_filter 這個(gè)局部變量。而整個(gè)過(guò)濾模塊鏈的入口,需要調(diào)用 ngx_http_top_header_filter 這個(gè)全局變量。ngx_http_top_body_filter 的行為與 header fitler 類(lèi)似。

響應(yīng)頭和響應(yīng)體過(guò)濾函數(shù)的執(zhí)行順序如下所示:

http://wiki.jikexueyuan.com/project/nginx/images/chapter-4-1.png" alt="" />

這圖只表示了 head_filter 和 body_filter 之間的執(zhí)行順序,在 header_filter 和 body_filter 處理函數(shù)之間,在 body_filter 處理函數(shù)之間,可能還有其他執(zhí)行代碼。

模塊編譯

Nginx 可以方便的加入第三方的過(guò)濾模塊。在過(guò)濾模塊的目錄里,首先需要加入 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"

說(shuō)明把這個(gè)名為 ngx_http_example_filter_module 的過(guò)濾模塊加入,ngx_http_example_filter_module.c 是該模塊的源代碼。

注意 HTTP_AUX_FILTER_MODULES 這個(gè)變量與一般的內(nèi)容處理模塊不同。