6.3 HTTP过滤模块的开发步骤

HTTP过滤模块的开发步骤与第3章中所述的普通HTTP模块的开发步骤基本一致,这里再简要地概括一下,即如下8个步骤:

1)确定源代码文件名称。通常,HTTP过滤模块的功能都比较单一,因此,一般1个C源文件就可以实现1个HTTP过滤模块。由于需要将源文件加入到Makefile中,因此这时就要确定好源文件名称。当然,用多个C源文件甚至C++源文件实现1个HTTP过滤模块也是可以的,可参考3.3节和3.9节,这里不再赘述。

2)在源代码所在目录创建config脚本文件,当执行configure时将该目录添加进去。config文件的编写方法与3.3.1节中开发普通HTTP模块时介绍的编写方法基本一致,唯一需要改变的是,把HTTP_MODULES变量改为HTTP_FILTER_MODULES变量,这样才会把我们的模块作为HTTP过滤模块,并把它放置到正确的位置(图6-1所示的第三方过滤模块位置)上。

在执行configure命令时,其编译方法与3.3.2节中介绍的是一样的。在执行configure—add-module=PATH时,PATH就是HTTP过滤模块源文件所在的路径。当多个源代码文件实现1个HTTP过滤模块时,需在NGX_ADDON_SRCS变量中添加其他源代码文件。

3)定义过滤模块。实例化ngx_module_t类型的模块结构,这与3.4节介绍的内容类似,同时可以参考3.5节中的例子。因为HTTP过滤模块也是HTTP模块,所以在定义ngx_module_t结构时,其中的type成员也是NGX_HTTP_MODULE。这一步骤与定义普通的HTTP模块是相同的。

4)处理感兴趣的配置项。依照第4章中介绍的方法,可通过设置ngx_module_t结构中的ngx_command_t数组来处理感兴趣的配置项。

5)实现初始化方法。初始化方法就是把本模块中处理HTTP头部的ngx_http_output_header_filter_pt方法与处理HTTP包体的ngx_http_output_body_filter_pt方法插入到过滤模块链表的首部,参见6.2.1节中的例子。

6)实现处理HTTP头部的方法。实现ngx_http_output_header_filter_pt原型的方法,用于处理HTTP头部,如下所示:


typedef ngx_int_t(ngx_http_output_header_filter_pt)(ngx_http_request_tr);


一定要在模块初始化方法中将其添加到过滤模块链表中。

7)实现处理HTTP包体的方法。实现ngx_http_output_body_filter_pt原型的方法,用于处理HTTP包体,如下所示:


typedef ngx_int_t(ngx_http_output_body_filter_pt)(ngx_http_request_tr,ngx_chain_t*chain);


一定要在模块初始化方法中将其添加到过滤模块链表中。

8)编译安装后,修改nginx.conf文件并启动自定义过滤模块。通常,出于灵活性考虑,在配置文件中都会有配置项决定是否启动模块。因此,执行make编译以及make install安装后,再修改nginx.conf文件中的配置项,自定义过滤模块的功能。