3.3 如何将自己的HTTP模块编译进Nginx

Nginx提供了一种简单的方式将第三方的模块编译到Nginx中。首先把源代码文件全部放到一个目录下,同时在该目录中编写一个文件用于通知Nginx如何编译本模块,这个文件名必须为config。它的格式将在3.3.1节中说明。

这样,只要在configure脚本执行时加入参数—add-module=PATH(PATH就是上面我们给定的源代码、config文件的保存目录),就可以在执行正常编译安装流程时完成Nginx编译工作。

有时,Nginx提供的这种方式可能无法满足我们的需求,其实,在执行完configure脚本后Nginx会生成objs/Makefile和objs/ngx_modules.c文件,完全可以自己去修改这两个文件,这是一种更强大也复杂得多的方法,我们将在3.3.3节中说明如何直接修改它们。

3.3.1 config文件的写法

config文件其实是一个可执行的Shell脚本。如果只想开发一个HTTP模块,那么config文件中需要定义以下3个变量:

❑ngx_addon_name:仅在configure执行时使用,一般设置为模块名称。

❑HTTP_MODULES:保存所有的HTTP模块名称,每个HTTP模块间由空格符相连。在重新设置HTTP_MODULES变量时,不要直接覆盖它,因为configure调用到自定义的config脚本前,已经将各个HTTP模块设置到HTTP_MODULES变量中了,因此,要像如下这样设置:


"$HTTP_MODULES ngx_http_mytest_module"


❑NGX_ADDON_SRCS:用于指定新增模块的源代码,多个待编译的源代码间以空格符相连。注意,在设置NGX_ADDON_SRCS时可以使用$ngx_addon_dir变量,它等价于configure执行时—add-module=PATH的PATH参数。

因此,对于mytest模块,可以这样编写config文件:


ngx_addon_name=ngx_http_mytest_module

HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"

NGX_ADDON_SRCS="$NGX_ADDON_SRCS$ngx_addon_dir/ngx_http_mytest_module.c"


注意 以上3个变量并不是唯一可以在config文件中自定义的部分。如果我们不是开发HTTP模块,而是开发一个HTTP过滤模块,那么就要用HTTP_FILTER_MODULES替代上面的HTTP_MODULES变量。事实上,包括$CORE_MODULES、$EVENT_MODULES、$HTTP_MODULES、$HTTP_FILTER_MODULES、$HTTP_HEADERS_FILTER_MODULE等模块变量都可以重定义,它们分别对应着Nginx的核心模块、事件模块、HTTP模块、HTTP过滤模块、HTTP头部过滤模块。除了NGX_ADDON_SRCS变量,或许还有一个变量我们会用到,即$NGX_ADDON_DEPS变量,它指定了模块依赖的路径,同样可以在config中设置。