Nginx源码分析与实践---ngx_command_t
2017-03-15 21:17
661 查看
从上一节了解到配置项的相关属性是由ngx_command_t这个结构体设置的,下面就来看其源码,分析一下。
.../src/core/ngx_core.h :
比如:
2.第二个成员:配置指令可以出现的位置及后面跟的参数的个数
nginx提供了很多预定义的属性值(一些宏定义),通过逻辑或运算符可组合在一起,形成对这个配置指令的详细的说明。下面列出可在这里使用的预定义属性值及说明。
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.第三个成员:
.../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.第三个成员:
相关文章推荐
- nginx源码分析—hash结构ngx_hash_t(v1.0.4)
- Nginx源码分析---hash结构ngx_hash_t(v1.0.4)
- Nginx源码学习-双向链表(ngx_queue_t)实现及实例分析
- Nginx源码分析-ngx_module_s结构体
- nginx源码分析--数据结构 哈希 ngx_hash_t
- Nginx源码分析---内存池结构ngx_pool_t及内存管理
- nginx源码分析-ngx_http_phases说明
- 文章2:Nginx源码分析-ngx_array_t动态数组
- nginx源码分析—数组结构ngx_array_t
- Nginx源码分析-ngx_htttp_footer_filter_module
- Nginx源码分析---链表结构ngx_list_t
- Nginx 源码分析-- ngx_string 的一些简单分析
- nginx源码分析—内存池结构ngx_pool_t及内存管理
- 文章3:Nginx源码分析-ngx_list_t单链表
- nginx源码分析—链表结构ngx_list_t
- Nginx源码分析---队列结构ngx_queue_t
- nginx源码分析—队列结构ngx_queue_t
- Nginx 源码分析-- ngx_array、ngx_list基本数据结构
- nginx源码分析--内存池ngx_poll_t 内存池管理
- nginx源码分析—数组结构ngx_array_t