当前位置:K88软件开发文章中心网站服务器框架nginx → 文章内容

Nginx 基本数据结构

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:28:43

包含的信息构建的三种类型的 hash 表都会使用此参数。pool: 构建这些 hash 表使用的 pool。temp_pool: 在构建这个类型以及最终的三个 hash 表过程中可能用到临时 pool。该 temp_pool 可以在构建完成以后,被销毁掉。这里只是存放临时的一些内存消耗。keys: 存放所有非通配符 key 的数组。keys_hash: 这是个二维数组,第一个维度代表的是 bucket 的编号,那么 keys_hash[i] 中存放的是所有的 key 算出来的 hash 值对 hsize 取模以后的值为 i 的 key。假设有 3 个 key,分别是 key1,key2 和 key3 假设 hash 值算出来以后对 hsize 取模的值都是 i,那么这三个 key 的值就顺序存放在keys_hash[i][0],keys_hash[i][1], keys_hash[i][2]。该值在调用的过程中用来保存和检测是否有冲突的 key 值,也就是是否有重复。dns_wc_head: 放前向通配符 key 被处理完成以后的值。比如:\*.abc.com 被处理完成以后,变成 “com.abc.” 被存放在此数组中。dns_wc_tail: 存放后向通配符 key 被处理完成以后的值。比如:mail.xxx.\* 被处理完成以后,变成 “mail.xxx.” 被存放在此数组中。dns_wc_head_hash: 该值在调用的过程中用来保存和检测是否有冲突的前向通配符的 key 值,也就是是否有重复。dns_wc_tail_hash: 该值在调用的过程中用来保存和检测是否有冲突的后向通配符的 key 值,也就是是否有重复。在定义一个这个类型的变量,并对字段 pool 和 temp_pool 赋值以后,就可以调用函数 ngx_hash_add_key 把所有的 key 加入到这个结构中了,该函数会自动实现普通 key,带前向通配符的 key 和带后向通配符的 key 的分类和检查,并将这个些值存放到对应的字段中去,然后就可以通过检查这个结构体中的 keys、dns_wc_head、dns_wc_tail 三个数组是否为空,来决定是否构建普通 hash 表,前向通配符 hash 表和后向通配符 hash 表了(在构建这三个类型的 hash 表的时候,可以分别使用 keys、dns_wc_head、dns_wc_tail三个数组)。构建出这三个 hash 表以后,可以组合在一个 ngx_hash_combined_t 对象中,使用 ngx_hash_find_combined 进行查找。或者是仍然保持三个独立的变量对应这三个 hash 表,自己决定何时以及在哪个 hash 表中进行查询。 ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);初始化这个结构,主要是对这个结构中的 ngx_array_t 类型的字段进行初始化,成功返回 NGX_OK。ha: 该结构的对象指针。type: 该字段有 2 个值可选择,即 NGX_HASH_SMALL 和 NGX_HASH_LARGE。用来指明将要建立的 hash 表的类型,如果是 NGX_HASH_SMALL,则有比较小的桶的个数和数组元素大小。NGX_HASH_LARGE 则相反。 ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value, ngx_uint_t flags);一般是循环调用这个函数,把一组键值对加入到这个结构体中。返回 NGX_OK 是加入成功。返回 NGX_BUSY 意味着key值重复。ha: 该结构的对象指针。key: 参数名自解释了。value: 参数名自解释了。flags: 有两个标志位可以设置,NGX_HASH_WILDCARD_KEY 和 NGX_HASH_READONLY_KEY。同时要设置的使用逻辑与操作符就可以了。NGX_HASH_READONLY_KEY 被设置的时候,在计算 hash 值的时候,key 的值不会被转成小写字符,否则会。NGX_HASH_WILDCARD_KEY 被设置的时候,说明 key 里面可能含有通配符,会进行相应的处理。如果两个标志位都不设置,传 0。有关于这个数据结构的使用,可以参考src/http/ngx_http.c中的 ngx_http_server_names 函数。ngx_chain_tNginx 的 filter 模块在处理从别的 filter 模块或者是 handler 模块传递过来的数据(实际上就是需要发送给客户端的 http response)。这个传递过来的数据是以一个链表的形式(ngx_chain_t)。而且数据可能被分多次传递过来。也就是多次调用 filter 的处理函数,以不同的 ngx_chain_t。该结构被定义在src/core/ngx_buf.h|c。下面我们来看一下 ngx_chain_t 的定义。 typedef struct ngx_chain_s ngx_chain_t; struct ngx_chain_s { ngx_buf_t *buf; ngx_chain_t *next; };就 2 个字段,next 指向这个链表的下个节点。buf 指向实际的数据。所以在这个链表上追加节点也是非常容易,只要把末尾元素的 next 指针指向新的节点,把新节点的 next 赋值为 NULL 即可。 ngx_chain_t *ngx_alloc_chain_link(ngx_pool_t *pool);该函数创建一个 ngx_chain_t 的对象,并返回指向对象的指针,失败返回 NULL。 #define ngx_free_chain(pool, cl) \ cl->next = pool->chain; \ pool->chain = cl该宏释放一个 ngx_chain_t 类型的对象。如果要释放整个 chain,则迭代此链表,对每个节点使用此宏即可。注意: 对 ngx_chaint_t 类型的释放,并不是真的释放了内存,而仅仅是把这个对象挂在了这个 pool 对象的一个叫做 chain 的字段对应的 chain 上,以供下次从这个 pool 上分配 ngx_chain_t 类型对象的时候,快速的从这个 pool->chain上 取下链首元素就返回了,当然,如果这个链是空的,才会真的在这个 pool 上使用 ngx_palloc 函数进行分配。 ngx_buf_t这个 ngx_buf_t 就是这个 ngx_chain_t 链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理)。该数据结构位于src/core/ngx_buf.h|c文件中。我们来看一下它的定义。 struct ngx_buf_s { u_char *pos; u_char *last; off_t file_pos; off_t file_last; u_char *start; /* start of buffer */ u_char *end; /* end of buffer */ ngx_buf_tag_t tag; ngx_file_t *file; ngx_buf_t *shadow; /* the buf's content could be changed */ unsigned

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9]  下一页


Nginx 基本数据结构