Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1504667
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2015-10-19 22:04:00

模块的配置指令,定义在静态数组中,看一下之前写的hello world,继续分析一下基本数据结构

点击(此处)折叠或打开

  1. static ngx_command_t ngx_http_hello_commands[] = {
  2.         {
  3.                 ngx_string("hello"),
  4.                 NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LMT_CONF | NGX_CONF_NOARGS,
  5.                 ngx_http_hello,
  6.                 NGX_HTTP_LOC_CONF_OFFSET,
  7.                 0,
  8.                 NULL
  9.         },
  10.         ngx_null_command
  11. }
ngx_command_t
用于记录模块的配置指令信息,具体如下

点击(此处)折叠或打开

  1. typedef struct ngx_command_s ngx_command_t;

  2. struct ngx_command_s {
  3.     ngx_str_t name;
  4.     ngx_uint_t type;
  5.     char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
  6.     ngx_uint_t conf;
  7.     ngx_uint_t offset;
  8.     void *post;
  9. }
name: 配置指令的名称
type:   配置的类型,即配置指令属性集。不同的属性可以根据需要进行组合

下面看看支持那些属性:
点击(此处)折叠或打开
  1. #define NGX_CONF_NOARGS 0x00000001    // 配置指令不接收任何参数
  2. #define NGX_CONF_TAKE1 0x00000002     // 配置指令接收1个参数
  3. #define NGX_CONF_TAKE2 0x00000004     // 配置指令接收2个参数
  4. #define NGX_CONF_TAKE3 0x00000008     // 配置指令接收3个参数
  5. #define NGX_CONF_TAKE4 0x00000010     // 配置指令接收4个参数
  6. #define NGX_CONF_TAKE5 0x00000020     // 配置指令接收5个参数
  7. #define NGX_CONF_TAKE6 0x00000040     // 配置指令接收6个参数
  8. #define NGX_CONF_TAKE7 0x00000080     // 配置指令接收7个参数,以上参数可以任意组合,形成或的关系

  9. #define NGX_CONF_MAX_ARGS 8           // 配置指令参数个数的最大值,目前最大支持8个

  10. #define NGX_CONF_TAKE12 (NGX_CONF_TAKE1|NGX_CONF_TAKE2)                                    // 配置指令接收1个或者2个参数
  11. #define NGX_CONF_TAKE13 (NGX_CONF_TAKE1|NGX_CONF_TAKE3)                                    // 配置指令接收1个或者3个参数

  12. #define NGX_CONF_TAKE23 (NGX_CONF_TAKE2|NGX_CONF_TAKE3)                                    // 配置指令接收2个或者3个参数

  13. #define NGX_CONF_TAKE123 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3)                    // 配置指令接收1个/2个或者3个参数
  14. #define NGX_CONF_TAKE1234 (NGX_CONF_TAKE1|NGX_CONF_TAKE2|NGX_CONF_TAKE3|NGX_CONF_TAKE4)    // 配置指令接收1个/2个/3个或者4个参数

  15. #define NGX_CONF_ARGS_NUMBER 0x000000ff                                                    // 目前尚未使用,配置掩码
  16. #define NGX_CONF_BLOCK 0x00000100                                                          // 配置指令接收配置信息块,比如 server {....}
  17. #define NGX_CONF_FLAG 0x00000200                                                           // 配置指令接收的是布尔值,比如on/off
  18. #define NGX_CONF_ANY 0x00000400                                                            // 配置指令接收任意的参数
  19. #define NGX_CONF_1MORE 0x00000800                                                          // 配置指令接收至少1个参数
  20. #define NGX_CONF_2MORE 0x00001000                                                          // 配置指令接收至少2个参数
  21. #define NGX_CONF_MULTI 0x00000000 /* compatibility */                                      // 配置指令接收多个参数,即个数不定

  22. #define NGX_DIRECT_CONF 0x00010000                                                         // 配置指令可以出现在配置文件的最外层,比如daemon

  23. #define NGX_MAIN_CONF 0x01000000                                                           // http/mail/events/error_log等
  24. #define NGX_ANY_CONF 0x0F000000                                                            // 配置指令可以出现在任意级别上

点击(此处)折叠或打开

  1. #define NGX_HTTP_MAIN_CONF 0x02000000         // 可以直接出现在http配置指令里
  2. #define NGX_HTTP_SRV_CONF 0x04000000          // 可以出现在http里面的server配置指令里
  3. #define NGX_HTTP_LOC_CONF 0x08000000          // 可以出现在http server里面的location配置指令里
  4. #define NGX_HTTP_UPS_CONF 0x10000000          // 可以出现在http里面的upstream配置指令里
  5. #define NGX_HTTP_SIF_CONF 0x20000000          // 可以出现在http里面的server配置指令里的if语句所在的块中
  6. #define NGX_HTTP_LIF_CONF 0x40000000          // 可以出现在http里面的limit_except配置指令所在的块中
  7. #define NGX_HTTP_LMT_CONF 0x80000000          // 可以出现在http server里面的location配置指令里的if语句所在的块中

set:
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

函数指针,Nginx解析配置时,将读取的值传入该函数进行分解处理。具体配置指令值的处理方式,需要用户自己定义。成功时返回NGX_OK,否则返回NGX_CONF_ERROR或者自定义错误消息。
cf:配置文件中读取到的原始字符串和信息,args数组首元素是指令本身,其后是各个参数
cmd:即现在我们介绍的ngx_command_t结构
conf:存储当前配置的结构体,用户使用时转换成自己定义的结构体,然后赋值

目前已经支持的常见标准类型的读取函数,用于给set赋值,如下:

点击(此处)折叠或打开

  1. ngx_conf_set_flag_slot:    读取NGX_CONF_FLAG类型的参数
  2. ngx_conf_set_str_slot:     读取字符串类型的参数
  3. ngx_conf_set_str_array_slot 读取字符串数组类型的参数
  4. ngx_conf_set_keyval_slot:  读取键值对类型的参数
  5. ngx_conf_set_num_slot:      读取整数类型(有符号整数ngx_int_t)的参数
  6. ngx_conf_set_size_slot:     读取size_t类型的参数,也就是无符号数
  7. ngx_conf_set_off_slot:      读取off_t类型的参数
  8. ngx_conf_set_msec_slot:     读取毫秒值类型的参数
  9. ngx_conf_set_sec_slot:      读取秒值类型的参数
  10. ngx_conf_set_bufs_slot:    读取的参数值是2个,一个是buf的个数,一个是buf的大小
  11. ngx_conf_set_enum_slot:     读取枚举类型的参数,将其转换成整数ngx_uint_t类型
  12. ngx_conf_set_bitmask_slot:  读取参数的值,并将这些参数的值以bit位的形式存储
conf:    指定使用那个内存池,目前NGX_HTTP_MAIN_CONF_OFFSET/xx_SRV_CONF_OFFSET/xx_LOC_CONF_OFFSET/xx_MAIN_CONF_OFFSET
offset:  指定该配置项在对应的存储结构体中的具体位置,比如offset()的偏移计算,当不需要保存或者无法直接定位时,可以设为0
post:    指向配置解析过程中可能用到的数据,不需要时,直接设置为0

ngx_conf_t


用于解析配置文件时,描述每个指令的属性

点击(此处)折叠或打开

  1. typedef struct ngx_conf_s ngx_conf_t;
  2. struct ngx_conf_s {
  3.     char *name;                    // 存放当前解析到的指令
  4.     ngx_array_t *args;             // 该指令及其对应参数的列表,其本身为ngx_str_t的类型,存储的是原始的字符串

  5.     ngx_cycle_t *cycle;            // 启动过程用到的核心结构体,存放core模块的配置
  6.     ngx_pool_t *pool;              // 内存池的数据结构,提供内存的申请操作,后面详细介绍
  7.     ngx_pool_t *temp_pool;         // 解析配置文件的临时内存池,解析完成后会释放
  8.     ngx_conf_file_t *conf_file;    // 存放nginx配置文件相关的信息
  9.     ngx_log_t *log;                // 描述日志文件的相关属性

  10.     void *ctx;                     // 描述该指令的上下文信息
  11.     ngx_uint_t module_type;        // 支持该指令的模块的类型,如core/http/event/mail中的一种
  12.     ngx_uint_t cmd_type;           // 指令的类型

  13.     ngx_conf_handler_pt handler;   // 指令自定义的处理函数
  14.     char *handler_conf;            // 自定义处理函数需要的相关配置
  15. }
阅读(1477) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~