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

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

過濾模塊簡介

執(zhí)行時間和內容

過濾(filter)模塊是過濾響應頭和內容的模塊,可以對回復的頭和內容進行處理。它的處理時間在獲取回復內容之后,向用戶發(fā)送響應之前。它的處理過程分為兩個階段,過濾 HTTP 回復的頭部和主體,在這兩個階段可以分別對頭部和主體進行修改。

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

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

就是分別對頭部和主體進行過濾的函數(shù)。所有模塊的響應內容要返回給客戶端,都必須調用這兩個接口。

執(zhí)行順序

過濾模塊的調用是有順序的,它的順序在編譯的時候就決定了??刂凭幾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ù),只要調用一下 ngx_http_next_header_filter 這個局部變量。而整個過濾模塊鏈的入口,需要調用 ngx_http_top_header_filter 這個全局變量。ngx_http_top_body_filter 的行為與 header fitler 類似。

響應頭和響應體過濾函數(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 可以方便的加入第三方的過濾模塊。在過濾模塊的目錄里,首先需要加入 config 文件,文件的內容如下:

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 這個變量與一般的內容處理模塊不同。