发布日期:2013-03-23 09:44 来源:末信 标签: Nginx 模块 指令
 

模块的指令

模块的指令出现在静态数组ngx_command_t。这里有一个例子,说明它们是如何被定义的,来自我写的一个小模块: static ngx_command_t ngx_http_circle_gif_commands[] = {

{ ngx_string("circle_gif"), NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS, ngx_http_circle_gif, NGX_HTTP_LOC_CONF_OFFSET, 0, NULL },

{ ngx_string("circle_gif_min_radius"), NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|

NGX_CONF_TAKE1, ngx_conf_set_num_slot, NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_circle_gif_loc_conf_t, min_radius), NULL }, ... ngx_null_command

};这是ngx_command_t的函数原型(也就是我们定义的那些结构体),出自

core/ngx_conf_file.h :

struct ngx_command_t { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd,

void *conf); ngx_uint_t conf; ngx_uint_t offset; void *post;

};

参数多了点,但每个参数都是有用的:

name是指令的字符串(也就是包含指令名称),不包含空格(有空格的话就是命令的参数了)。数据类型是ngx_str_t,经常用来进行字符串实例化(比如:ngx_str("proxy_pass"))。

注意:ngx_str_t结构体由包含有字符串的data成员和表示字符串长度的len成员组成。Nginx用这个数据类型来存放字符串。

type是标识的集合,表明这个指令在哪里出现是合法的、指令的参数个数。应用中,标识一般是下面多个值的位或:

• NGX_HTTP_MAIN_CONF: 指令出现在全局配置部分是合法的
• NGX_HTTP_SRV_CONF:指令在主机配置部分出现是合法的
• NGX_HTTP_LOC_CONF: 指令在位置配置部分出现是合法的
• NGX_HTTP_UPS_CONF: 指令在上游服务器配置部分出现是合法的
• NGX_CONF_NOARGS: 指令没有参数
• NGX_CONF_TAKE1: 指令读入一个参数
• NGX_CONF_TAKE2: 指令读入两个参数
• ...
• NGX_CONF_TAKE7: 指令读入七个参数
• NGX_CONF_FLAG: 指令读入一个布尔型数据
• NGX_CONF_1MORE: 指令至少读入1个参数
• NGX_CONF_2MORE:指令至少读入2个参数
这里有很多另外的选项: core/ngx_conf_file.h 。

结构体成员 set是一个函数指针,用来设定模块的配置;典型地,这个函数会转化读入指令传进来的参数,然后将合适的值保存到配置结构体。这个设定函数有三个参数:

指向 ngx_conf_t结构体的指针,包含从配置文件中指令传过来的参数。
指向当前ngx_command_t结构体的指针
指向自定义模块配置结构体的指针
这个设定函数在指令被遇到的时候就会调用。在自定义的配置结构体中,Nginx提供了多个函数用来保存特定类型的数据,这些函数包含有:

• ngx_conf_set_flag_slot: 将 "on"或"off"转化为
• ngx_conf_set_str_slot: 将字符串保存为 ngx_str_t类型
• ngx_conf_set_num_slot: 解析一个数字并保存为int型
• ngx_conf_set_size_slot: 解析一个数据大小(如:"8k", "1m")并保存为 size_t 类型
还有另外一些,很容易查到(看, core/ngx_conf_file.h )。模块也可以把它们自己函数的引用放在这里,但这样内嵌的类型不是很好。

那这些内嵌函数怎么知道要把值保。存在哪里呢?ngx_command_t接下来的两个成员 conf和offset正好可用conf告诉 Nginx把这个值是放在全局配置部分、
主机配置部分还是位置配置部分(用 NGX_HTTP_MAIN_CONF_OFFSET, NGX_HTTP_SRV_CONF_OFFSET或 NGX_HTTP_LOC_CONF_OFFSET)。然后offset确定到底是保存在结构体的哪个位置。
最后,post指向模块在读配置的时候需要的一些零碎变量。一般它是NULL。
这个ngx_command_t数组在读入ngx_null_command后停止。

相关评论

专题信息
    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。