Nginx开发第三方模块实例
Ø 序言
Nginx是一个极具扩展性的服务器,这显著体现在对第三方模块的支持,开发者能够将自己开发的模块,按照nginx既有的规则,完美地融合进http框架中,以实现开发者定制功能的作用。
这篇文章主要用于结合如何开发一个简单的第三方模块,目标人群为想了解nginx开发第三方模块的同学,文章内容主要包括三个部分,如何将HTTP模块嵌入nginx和如何开发第三方模块以及一个例子。
Ø 如何将HTTP模块嵌入nginx
Nginx目前来说提供了二种方式,config文件+configure 脚本,手动方式,后面手动方式是更加复杂的,且容易出错,在常规的nginx开发中,基本上都是用config文件+configure脚本方式比较多。接下来分别介绍这两种方式。
1) Config文件+configure脚本
l Config文件
这个是指提供config文件,并且在文件里面给出三个配置项,就可以达到效果。这三个配置项是指:
A. Ngx_addon_name:就是自己要开发的这个模块名字。
B. Nginx模块名:这有点像设置环境变量啥的,首先要知道自己开发啥模块,nginx对应的模块有,$HTTP_MODULES(常规的http模块), $HTTP_FILTER_MODULES(HTTP过滤模块),$HTTP_HEAD_FILTER_MODULES(HTTP 头部过滤模块), $CORE_MODULES(nginx的核心模块),$EVENT_MODULES(nginx的事件模块)等,然后在后面添加你所要添加的模块名字,以空格隔开,比如这次我们开发添加的模块:
HTTP_MODULES = “$HTTP_MODULES ngx_http_helloworld_module”
C. NGX_ADDON_SRCS:这个顾名思义,就是指定新添加文件的路径,不过这个都是相对路径,因为在configure的时候就指定了上层路径,比如--add-modules=PATH。
比如我们这次开发要添加的源文件:
NGX_ADDON_SRCS = “$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_helloworld_module.c”
l Configure脚本
这里需要用- -add-module=PATH将第三方模块的路径加入,
比如configure - -add-module=~/ngx_3rd_modules/
那我们能分析下这背后做了什么呢?我们从下面两个部分来展开说明
a) Auto/modules
这个主要是说明将定制的第三方模块添加到生成的ngx_modules.c里面。
a) 指定模块下面的配置文件.
b) 生成模块信息
一、生成模块数组
根据需要开启的模块加载对应的模块,下面是开启http模块后的所需要的模块
二、生成ngx_modules.c文件
b) Auto/make
显而易见,这个就是负责编译相关的模块。
1) 生成第三方源码
2) 生成链接代码,并将目标文件,库文件链接成二进制程序
2) 手动方式
分两步来做,第一,修改obj/ngx_modules.c, 在里面增加对应的第三方模块,第二,修改obj/Makefile,在里面增加第三方模块的编译,这种直接修改的方法不太可取,易出错,一般都是用上面的第二种方法。
Ø 开发第三方模块注意事项
首先,要确定针对那个模块进行开发,nginx的模块是有顺序性的,比如: HTTP_MODULES = “$HTTP_MODULES ngx_http_helloworld_module”
其次,因为nginx是异步非阻塞的,在编制代码时,一定要注意不能阻塞nginx进程.
Ø 示例
见附件/Files/jolleydtan/test.zip
参考:
深入理解nginx.