您现在的位置是:首页 > 正文

深度解析ngx_command_t结构

2024-04-01 03:56:35阅读 6
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;
};

解析:

1)ngx_str_t name

其中,name是配置项名称,

2)ngx_uint_t type

其中,type决定这个配置项可以在哪些块(如http、server、location、if、upstream块等) 中出现,以及可以携带的参数类型和个数等。表4-1列出了设置http配置项时type可以取的 值。注意,type可以同时取表4-1中的多个值,各值之间用|符号连接.附录1可见

3)关于set回调方法。

如果处理配置项,我们既可以自己实现一个回调方法来处理配置项,也可以使用Nginx预设的14个解析配置项方法,这会少写许 多代码,附录二

4)ngx_uint_t conf conf

用于指示配置项所处内存的相对偏移位置,仅在type中没有设置 NGX_DIRECT_CONF和NGX_MAIN_CONF时才会生效 

对于HTTP模块,conf是必须要设置 的

conf在HTTP中的取值 意义
NGX_HTTP_MAIN_CONF_OFFSET 使用create_main_conf方法产生的结构体来储存解析的配置参数
NGX_HTTP_SRV_CONF_OFFSET 使用create_srv_conf方法产生的结构体来储存解析的配置参数
NGX_HTTP_LOC_CONF_OFFSET 使用create_loc_conf方法产生的结构体来储存解析的配置参数

为什么HTTP模块一定要设置conf的值呢?因为HTTP框架可以使用预设的14种方法自动 地将解析出的配置项写入HTTP模块代码定义的结构体中,但HTTP模块中可能会定义3个结 构体,分别用于存储main、srv、loc级别的配置项(对应于create_main_conf、 create_srv_conf、create_loc_conf方法创建的结构体),而HTTP框架自动解析时需要知道应把 解析出的配置项值写入哪个结构体中,这将由conf成员完成 因此,对conf的设置是与ngx_http_module_t实现的回调方法(在4.2.1节中介绍)相关的。 如果用于存储这个配置项的数据结构是由create_main_conf回调方法完成的,那么必须把conf 设置为NGX_HTTP_MAIN_CONF_OFFSET。同样,如果这个配置项所属的数据结构是由 create_srv_conf回调方法完成的,那么必须把conf设置为NGX_HTTP_SRV_CONF_OFFSET。 可如果create_loc_conf负责生成存储这个配置项的数据结构,就得将conf设置为 NGX_HTTP_LOC_CONF_OFFSET。

5)ngx_uint_t offset offset

表示当前配置项在整个存储配置项的结构体中的偏移位置(以字节(Byte)为单 位)

例子:

typedef struct { int a; int b; int c; } test_stru;

 如果要处理的配置项是由成员b来存储参数的,那么这时b相对于test_stru的偏移量就是 4;如果要处理的配置项由成员c来存储参数,那么这时c相对于test_stru的偏移量就是8设置offset有什么作用呢?如果使用Nginx预设的解析配置项方法,就必须设置offset,这 样Nginx首先通过conf成员找到应该用哪个结构体来存放,然后通过offset成员找到这个结构 体中的相应成员,以便存放该配置

6)void*post

如果自定义了配置项的回调方法,那么post指针的用途完全由用户来定义。如果不使用 它,那么随意设为NULL即可。如果想将一些数据结构或者方法的指针传过来,那么使用post 也可以。 如果使用Nginx预设的配置项解析方法,就需要根据这些预设方法来决定post的使用方式

附录一

type类型 type取值 意义
处理配置项时获取当前配置块的方式 NGX_DIRECT_CONF 一般由NGx_CORE_MODULE类型的核心模块使用,仅与下面的NGX_MAIN_CONF同时设置,表示模块需要解析不属于任何{}内的全局配置项。它实际上会指定set方法里的第3个参数conf的值,使之指向每个模块解析全局配置项的配置结构体1
NGX_ANY_CONF 无意义
配置项可以出现在那些配置项中 NGX_MAIN_CONF 出现在全局配置中
NGX_EVENT_CONF 出现event中
NGX_MAIL_MAIN_CONF 出现在mail{}中

NGX_HTTP_MAIN_CONF

出现在http{}中
NGX_HTTP_SRV_CONF

出现在server{}中但是server必须在http

NGX_HTTP_LOC_CONF 同理出现location
NGX_HTTP_UPS_CONF 同理出现在upstream
NGX_HTTP_SIF_CONF

出现在server{}中if{}

NGX_HTTP_LIF_CONF 出现在loctaion中if{}
配置项携带参数 NGX_CONF_NOARGS 不带参数
NGX_CONF_TAKE1 一个
NGX_CONF_TAKEn n代表个数 最大是7 可携带n个
NGX_CONF_TAKEabc abc分别代表数字 a|b|c个
配置项参数后的出现形式 NGX_CONF_ARGS_NUMBER 无意义
NGX_CONF_BLOCK 配置项定义了一种新的{}块。例如,http, server ,location等配置,它们的type都必须定义为NGx_CONF_BLOCK
NGX_CONF_ANY 不验证配置项携带的参数个数
NGX_CONF_FLAG 配置项携带的参数只能是1个,并且参数的值只能是 on或者off
NGX_CONF_1MORE 配置项携带的参数个数必须超过1
NGX_CONF_2MORE 配置项携带的参数个数必须超过2个
NGx_CONF_MULTI 表示当前配置项可以出现在任意块中(包括不属于任何块的全局配置),它仅用于配合其他配置项使用。type中未加NGx_CONF_MULTI 时,如果一个配置项出现在type成员未标明的配置块中,那么Nginx会认为该配置项非法,最后将导致Nginx启动失败。但如果type中加入了 NGX_CONF_MULTI,则认为该配置项一定是合法的,然而又会有两种不同的结果:①如果配置项出现在type指示的块中,则会调用set方法解析配置项;②如果配置项没有出现在 type指示的块中,则不对该配置项做任何处理。因此,NGx_CONF_MULTI会使得配置项出现在未知块中时不会出错日前,还沿有官方抉街用讨NGX CONF MULTI

note1

每个进程中都有一个唯一的ngx_cycle_t核心结构体,它有一个成员conf_ctx维护着所有模块的配置结构体,其类型是void****。conf_ctx意义为首先指向一个成员皆为指针的数组, 其中每个成员指针又指向另外一个成员皆为指针的数组,第2个子数组中的成员指针才会指 向各模块生成的配置结构体。这正是为了事件模块、http模块、mail模块而设计的。这有利于不同NGX_CORE_MODULE类型的特定模块解析配置项。然而, NGX_CORE_MODULE类型的核心模块解析配置项时,配置项一定是全局的,不会从属于 任何{}配置块的,它不需要上述这种双数组设计。解析标识为NGX_DIRECT_CONF类型的 配置项时,会把void****类型的conf_ctx强制转换为void**,也就是说,此时,在conf_ctx指向 的指针数组中,每个成员指针不再指向其他数组,直接指向核心模块生成的配置结构体。因 此,NGX_DIRECT_CONF仅由NGX_CORE_MODULE类型的核心模块使用,而且配置项只 应该出现在全局配置 

note2

如果HTTP模块中定义的配置项在nginx.conf配置文件中实际出现的位置和参 数格式与type的意义不符,那么Nginx在启动时会报错。

附录二

预设方法名 意义
ngx_conf_set_flag_slot 如果nginx.conf文件中某个配置项的参数是on或者off(即希望配置项表达打开或者关闭某个功能的意思),而且在Nginx模块的代码中使用ngx_flag_t变量来保存这个配置项的参数,就可以将set回调方法设为ngx_conf_set_flag_slot。当nginx.conf文件中参数是on时,代码中的ngx_flag_t类型变量将设为1,参数为off时则设为0
ngx_conf_set_str_slot 如果配置项后只有1个参数.同时在代码中我们希望用ngx_str_t类型的变量来保存这个配置项的参数,则可以使用ngx_conf_set_str_slot方法
npx_confset_str_array slot 如果这个配置项会出现多次,每个配置项后面都跟着1个参数,而在程序中我们希望仅用一个ngx_array_t动态数组来存储所有的参数,且数组中的每个参数都以ngx_str_t来存储,那么预设的ngx_conf_set_str_array_slot方法可以帮我们做到
ngx_conf_set_keyval_slot 与ngx_conf_set_str_array_slot类似,也是用一个ngx_array_t数组来存储所有同名配置项的参数。只是每个配置项的参数不再只是1个,而必须是两个,且以“配置项名关键字值;”的形式出现在nginx.conf文件中.同时,ngx_conf_set_keyval_slot将把这些配置项转化为数组,其中每个元素都存储着key/value键值对
ngx_conf_set_num_slot 配置项后必须携带1个参数,且只能是数字。存储这个参数的变量必须是整型配置项后必须携带1个参数,表示空间大小,可以是一个数字,这时表示字节数(Byte)。如果数字后跟着k或者K,就表示 Kilobytc,1KB=1024B;如果数字后跟着m或者M,就表示Megabyte,1MB=1024KB。
ngx_conf_set_size_slot ngx_conf_set_size_slot解析后将把配置项后的参数转化成以字节数为单位的数字
ngx_eonf set_off slot 配置项后必须携带1个参数,表示空间上的偏移量。它与设置的参数非常类似,其参数是一个数字时表示 Byte,也可以在后面加单位,但与ngx_conf_set_sizeslot不同的是,数字后面的单位不仅可以是k或者K.m或者M,还可以是g或者G,这时表示 Gigabyte,1GB=1024MB。ngx_conf_set_off slot解析后将把配置项后的参数转化成以字节数为单位的数字
ngx_conf set_msec slot 配置项后必须携带1个参数,表示时间。这个参数可以在数字后面加单位,如果单位为s或者没有任何单位,那么这个数字表示秒;如果单位为m,则表示分钟,1m=60s ;如果单位为h,则表示小时,1h-60m ;如果单位为d,则表示天,1d=24h ;如果单位为w,则表示周,!w=7d;如果单位为M,则表示月,IM=30d;如果单位为y,则表示年,Iy=365d。ngx_conf_set_msec_slot解析后将把配置项后的参数转化成以毫秒为单位的数字
ngx _conf set_sec_slot ngx_conf_set_msec_slot 非常类似,唯一的区别是ngx_conf_set_msec_slot解析后将把配置项后的参数转化成以毫秒为单位的数字,而ngx_conf_set_ sec_slot解析后会把配置项后的参数转化成以秒为单位的数字
ngx_conf_ set_bufs _slot 配置项后必须携带一两个参数、第1个参数是数字,第2个参数表示空间大小。例如,“gzip_buffers 4 8k;”(通常用来表示有多少个ngx_buf_t缓冲区),其中第1个参数不可以携带任何单位,第2个参数不带任何单位时表示 Byte,如果以k或者K作为单位,则表示 Kilobyte,如果以m或者M作为单位,则表示 Megabyte,ngx_conf_set_bufs_slot解析后会把配置项后的两个参数转化成ngx_bufs_t结构体下的两个成员。这个配置项对应于Nginx最喜欢用的多缓冲区的解决方案(如接收连接对端发来的TCP流)
ngx_conf_set_enum_slot 配置项后必须携带1个参数,其取值范围必须是我们设定好的字符串之一(就像C语言中的枚举一样)。首先,我们要用ngx_conf_enum_t结构定义配置项的取值范围,并设定每个值对应的序列号。然后,ngx_conf_set_enum_slot将会把配置项参数转化为对应的序列号
ngx_conf_set_access_slot 这个方法用于设置目录或者文件的读写权限。配置项后可以携带1~3个参数,可以是如下形式: user:rw group:rw all:rw。注意,它的意义与Linux上文件或者目录的权限意义是一致的,但是user/group/all后面的权限只可以设为rw(读/写)或者r(只读),不可以有其他任何形式,如w或者rx等。ngx_conf_set_access_slot将会把这些参数转化为一个整型
ngx_conf_set _path_slot 这个方法用于设置路径,配置项后必须携带1个参数,表示1个有意义的路径。ngx_conf_set_path_slot将会把参数转化为ngx_path_t结构

ngx_conf_set_bitmask_slot

与ngx_conf_set_bitmask_slot类似,配置项后必须携带1个参数,其取值范围必须是设定好的字符串之一。首先,我们要用ngx_conf_bitmask_t结构定义配置项的取值范围,并设定每个值对应的比特位。注意,每个值所对应的比特位都要不同。然后ngx_conf_set_bitmask_slot将会把配置项参数转化为对应的比特位

附录三

post的使用方法 预设配置的解析方法
这个方法用于设置目录或者文件的读写权限。配置项后可以携带1~3个参数,可以是如下形式: user:rw group:rw all:rw。注意,它的意义与Linux上文件或者目录的权限意义是一致的,但是user/group/all后面的权限只可以设为rw(读/写)或者r(只读),不可以有其他任何形式,如w或者rx等。ngx_conf_set_access_slo将会把这些参数转化为一个整型

ngx_conf_set_flag_slot

ngx_conf_set_str_slot

ngx_conf_set_str_array_slot

ngx_conf_set_keyval_slot

ngx_conf_set ngx_num_slot

ngx_conf_set_size_slot

ngx_conf_set_off_slot

ngx_conf_set_msec_slot

ngx conf set sec slot

指向ngx_conf_enum_t数组,表示当前配置项的参数必须设置为ngx_conf_num_t规定的值(类似枚举)。注意,使用ngx_conf_set_enum_slot时必须设置定义1个ngx_conf_enum_t数组,并将post成员指向该数组 ngx_conf_set_enum_solt
指向ngx_conf_bitmask_t数组,表示当前配置项的参数必须设置为ngx_conf_bitmask_t规定的值(类似枚举)。注意,使用ngx_conf_set_bitmask_slot时必须设置定义1个ngx_conf_bitmask _t数组,并将post成员指向该数组
 
ngx_conf_set_bitmask_solt
无意义

ngx_conf_set_bufs_slot

ngx_conf_set_path_slot

ngx_conf_set_access_slot

note3:ngx_conf_post_t

typedef char (ngx_conf_post_handler_pt) (ngx_conf_t cf,void data, void *conf);

typedef struct {
ngx_conf_post_handler_pt post_handler;
} ngx_conf_post_t;

如果需要在解析完配置项后回调某个方法,就要实现 上面的ngx_conf_post_handler_pt,并将包含post_handler的ngx_conf_post_t结构体传给post指 针

网站文章

  • 性能调优11:查询统计

    数据库引擎的工作流程可以归纳为接收请求、执行请求和返回结果。数据库引擎每接收到一个新的查询请求(Query Request),查询优化器就会执行以下工作流程:编译请求:对TSQL语句进行语法解析,编译请求,生成TSQL语句表示的逻辑结构。查询优化:根据TSQL语句的逻辑结构,生成多个预估的执行方案,并根据统计信息,评估每个预估方案的开销,选择开销最低的方案作为最优方案。执...

    2024-04-01 03:55:54
  • Linux Shell 定时删除某几天前文件夹下文件

    脚本 #!/bin/sh echo '清除文件开始'; find /tmp/email -mtime +1 -name "*.*" -exec rm -Rf {} ...

    2024-04-01 03:55:46
  • 前后端分离单点登录

    前后端分离单点登录

    单点登录基于 Apereo CAS实现,不是此次记录的重点。 登陆过程中,需要重定向至CAS Server,前端Vue+axios,需要从单页面跳转至login页面,后端如果使用response.sendRedirect(),返回302,axios并不能拦截到302,浏览器会自动跳转,就会出问题。 解决: 后端判断请求是否是axios(Ajax)请求,如果是,不返回302,约定一个返回码...

    2024-04-01 03:55:38
  • Harbor仓库的管理

    Harbor仓库的管理

    2024-04-01 03:54:58
  • APT(Advanced Persistent Threat高级持续性威胁)——网络安全

    APT(Advanced Persistent Threat高级持续性威胁)——网络安全

    网络安全APT(Advanced Persistent Threat高级持续性威胁)是一种复杂的网络攻击,旨在长期潜伏在目标网络中,有组织的黑客或攻击者利用高级技术手段对目标系统进行持续的渗透和监视,以获取敏感信息、窃取数据或进行其他恶意攻击活动。下面是一些关于网络安全有关APT的介绍:

    2024-04-01 03:54:52
  • Lucene .NET 全文检索

    Lucene .NET 全文检索

    近期做项目中有用到过Lucene,那个模块是由一位前端大神负责的,空闲时间我也做了个关于Lucene做全文检索的Demo,记录下来,方便以后学习。 关于Lucene的原理,网上有长篇大论的文章,有兴趣的话可以去阅读,再次我就直奔主题,在代码中分析其原理。 1、创建索引(此处我用的是盘古分词) 注:在后台代码的第一行上加上 #definenotes这样一行代码,目的是可以用外侧代码的#if,

    2024-04-01 03:54:44
  • mysql捕获 分析和优化sql

    mysql捕获 分析和优化sql

    2024-04-01 03:54:02
  • 基于PO和单例设计模式用python+selenium进行ui自动化框架设计【多测师_王sir】

    基于PO和单例设计模式用python+selenium进行ui自动化框架设计【多测师_王sir】

    一)框架目录的结构二)config包当中的config.ini文件主要是用来存项目的绝对路径,是为了后续跑用例和生成测试报告做准备然后目前的配置文件大都会用yaml,ini,excel,还有.py也就是python文件来进行管理这里用的是ini文件。三)config包当中的globalconfig文件主要是用来生成项目的路径,测试用例,测试报告的路径其中调用了ReadConfigIni这...

    2024-04-01 03:53:56
  • 将字节转换成十六进制字符串

    /* * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0

    2024-04-01 03:53:49
  • 信息学奥赛一本通题库 1007 计算(a+b)×c的值

    计算(a+b)×c的值

    2024-04-01 03:53:42