从源码看nginx中的模块分类

对于nginx,谈的最多的就是各个模块,各个模块提供的指令、功能,所谓的定制化nginx也是进行模块开发。最近项目用的openresty就是主要开发了ngx_lua模块和其他的一些模块,然后将这些模块打包发布。这里主要是看源码和对照nginx官方模块说明来对模块的分类做个说明,不涉及模块的具体实现。

nginx模块官方介绍:http://wiki.nginx.org/Modules,可以看到主要的大模块(一级分类?)有core module、http module、mail module,event module等。nginx中所有的模块都对应于一个相同的结构体:

struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;

ngx_uint_t spare0;
ngx_uint_t spare1;
ngx_uint_t spare2;
ngx_uint_t spare3;

ngx_uint_t version;

void *ctx;
ngx_command_t *commands;
ngx_uint_t type;

ngx_int_t (*init_master)(ngx_log_t *log);

ngx_int_t (*init_module)(ngx_cycle_t *cycle);

ngx_int_t (*init_process)(ngx_cycle_t *cycle);
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
void (*exit_thread)(ngx_cycle_t *cycle);
void (*exit_process)(ngx_cycle_t *cycle);

void (*exit_master)(ngx_cycle_t *cycle);

uintptr_t spare_hook0;
uintptr_t spare_hook1;
uintptr_t spare_hook2;
uintptr_t spare_hook3;
uintptr_t spare_hook4;
uintptr_t spare_hook5;
uintptr_t spare_hook6;
uintptr_t spare_hook7;
};

结构体中的type字段决定了该模块的模块类型:

core module对应的值为NGX_CORE_MODULE

http module对应的值为NGX_HTTP_MODULE

mail module对应的值为NGX_MAIL_MODULE

event module对应的值为NGX_EVENT_MODULE

每个大模块中都有一些具体功能实现的子模块,如ngx_lua模块就是http module中的子模块。

在这里再简单介绍下这个结构体中有关Nginx配置解析中的几个关键字段:

ctx_index:是指这个子模块在一级模块中的编号,如ngx_lua在http_module中的编号

index:是指模块在整个nginx系统中的模块编号,不区分一级和子模块

(PS:模块的编号只是在代码中有用到,不是固定的,和代码编译的时候根据编译的模块数目有关)

ctx:是指这个模块对应的一个context,这个字段主要是用来保存模块名称,以及生成配置结构(用来保存该模块的配置信息)

commands:这个模块实现的指令集合,具体分析放到nginx配置解析那块分析。

后面那些个函数指针,目前没看到有什么用,等看到了再写吧

【第一篇博客写的简单,就先这样吧,本身对nginx源码也是刚开始看^_^】

posted @ 2012-11-24 23:28  imessi  阅读(216)  评论(0)    收藏  举报