concentrate on c/c++ related technology

plan,refactor,daily-build, self-discipline,

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  37 Posts :: 1 Stories :: 12 Comments :: 0 Trackbacks

常用链接

留言簿(9)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

Nginx开发第三方模块实例

Ø 序言

Nginx是一个极具扩展性的服务器,这显著体现在对第三方模块的支持,开发者能够将自己开发的模块,按照nginx既有的规则,完美地融合进http框架中,以实现开发者定制功能的作用。

这篇文章主要用于结合如何开发一个简单的第三方模块,目标人群为想了解nginx开发第三方模块的同学,文章内容主要包括三个部分,如何将HTTP模块嵌入nginx和如何开发第三方模块以及一个例子。

Ø 如何将HTTP模块嵌入nginx

Nginx目前来说提供了二种方式,config文件+configure 脚本,手动方式,后面手动方式是更加复杂的,且容易出错,在常规的nginx开发中,基本上都是用config文件+configure脚本方式比较多。接下来分别介绍这两种方式。

 

1)      Config文件+configure脚本

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”

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. 

posted on 2016-05-10 08:25 jolley 阅读(1821) 评论(2)  编辑 收藏 引用 所属分类: nginx

Feedback

# re: nginx开发第一个helloworld. 2016-05-19 15:16 dzct
有什么意义?什么使用场景与用途?  回复  更多评论
  

# re: nginx开发第一个helloworld. 2016-05-20 08:12 jolley
@dzct
首先,你要明白nginx用来做啥的?以及为啥要用nginx而不是apache? 这个具体原因你自个儿问度娘或者谷哥好了。
其次,使用场景的话,举个例子,在游戏上面,nginx因为支持tcp负载均衡,所以会比用来做前置服务器,nginx负载策略有很多种(http://nginx.org/en/docs/http/load_balancing.html),
如果你想扩展基于nginx负载均衡的策略,那么你可能就要定制HTTP_MODULES模块作为第三方模块融入到http框架里面,并且在nginx.conf里面进行扩展使用。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理