您的位置:首页 > 运维架构 > Nginx

Nginx源码分析与实践---ngx_command_t

2017-03-15 21:17 661 查看
上一节了解到配置项的相关属性是由ngx_command_t这个结构体设置的,下面就来看其源码,分析一下。

.../src/core/ngx_core.h :

typedef struct ngx_command_s     ngx_command_t;
由上可知,以s结尾的和以t结尾的是同一种类型。该头文件下还有许多类似的定义。如:

typedef struct ngx_module_s      ngx_module_t;
typedef struct ngx_conf_s        ngx_conf_t;
typedef struct ngx_cycle_s       ngx_cycle_t;
typedef struct ngx_pool_s        ngx_pool_t;
typedef struct ngx_chain_s       ngx_chain_t;
typedef struct ngx_log_s         ngx_log_t;
typedef struct ngx_open_file_s   ngx_open_file_t;
typedef struct ngx_command_s     ngx_command_t;
typedef struct ngx_file_s        ngx_file_t;
typedef struct ngx_event_s       ngx_event_t;
typedef struct ngx_event_aio_s   ngx_event_aio_t;
typedef struct ngx_connection_s  ngx_connection_t;
.../src/core/ngx_conf_file.h :
struct ngx_command_s {
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;    /* 一般为0  */
};
1.第一个成员:配置指令的名称。

比如:

#自己定义的配置项
location /test {
mytest;
}
则name就是mytest。该成员是ngx_str_t类型,即字符串类型。可以很方便的用ngx_string("mytest")函数就可以给name成员赋值。

2.第二个成员:配置指令可以出现的位置及后面跟的参数的个数
nginx提供了很多预定义的属性值(一些宏定义),通过逻辑或运算符可组合在一起,形成对这个配置指令的详细的说明。下面列出可在这里使用的预定义属性值及说明。

//无参数
#define NGX_CONF_NOARGS      0x00000001
//1个参数,以下类推
#define NGX_CONF_TAKE1       0x00000002
#define NGX_CONF_TAKE2       0x00000004
#define NGX_CONF_TAKE3       0x00000008
#define NGX_CONF_TAKE4       0x00000010
#define NGX_CONF_TAKE5       0x00000020
#define NGX_CONF_TAKE6       0x00000040
#define NGX_CONF_TAKE7       0x00000080

//参数个数最大为8个,不能超过8个
#define NGX_CONF_MAX_ARGS    8

//1个或2个,以下类推
#define NGX_CONF_TAKE12      (NGX_CONF_TAKE1|NGX_CONF_TAKE2)
#define NGX_CONF_TAKE13      (NGX_CONF_TAKE1|NGX_CONF_TAKE3)

#define NGX_CONF_TAKE23      (NGX_CONF_TAKE2|NGX_CONF_TAKE3)

#define NGX_CONF_TAKE123     (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3)
#define NGX_CONF_TAKE1234    (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3   \
|NGX_CONF_TAKE4)

#define NGX_CONF_ARGS_NUMBER 0x000000ff
//参数可以是又个配置块
#define NGX_CONF_BLOCK       0x00000100
//可以接收on 或 off,最终转成bool值
#define NGX_CONF_FLAG        0x00000200
//接收任意参数

#define NGX_CONF_ANY         0x00000400
//至少1个
#define NGX_CONF_1MORE       0x00000800
#define NGX_CONF_2MORE       0x00001000
//多个,不定
#define NGX_CONF_MULTI       0x00000000  /* compatibility */

//可以出现在最外层
#define NGX_DIRECT_CONF      0x00010000
//出现在main、http、events等
#define NGX_MAIN_CONF        0x01000000
//出现在任意级别
#define NGX_ANY_CONF         0x1F000000
对于我们编写的大多数模块而言,都是在处理http相关的事情,也就是所谓的都是NGX_HTTP_MODULE,对于这样类型的模块,其配置可能出现的位置也是分为直接出现在http里面,以及其他位置。

NGX_HTTP_MAIN_CONF: 可以直接出现在http配置指令里。

NGX_HTTP_SRV_CONF: 可以出现在http里面的server配置指令里。

NGX_HTTP_LOC_CONF: 可以出现在http server块里面的location配置指令里。

NGX_HTTP_UPS_CONF: 可以出现在http里面的upstream配置指令里。

NGX_HTTP_SIF_CONF: 可以出现在http里面的server配置指令里的if语句所在的block中。

NGX_HTTP_LMT_CONF: 可以出现在http里面的limit_except指令的block中。

NGX_HTTP_LIF_CONF: 可以出现在http server块里面的location配置指令里的if语句所在的block中。

3.第三个成员: 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: