我是靠谱客的博主 迷路小刺猬,这篇文章主要介绍Nginx的HTTP模块介绍-----数据结构部分,现在分享给大家,希望可以做个参考。

1.整型的封装

复制代码
1
2
typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t;


2. 字符串的封装

复制代码
1
2
3
4
typedef struct{ size_t len; u_char *data; } ngx_str_t;

ngx_str_t只有两个成员,data指向字符串起始地址,len表示字符串的有效长度。C语言中,字符串一般都是以''结尾,但是这里data指向的并不一定会以''结尾,所以通过len,避免越界。


3.ngx_list_t数据结构

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef struct ngx_list_part_s ngx_list_part_t; struct ngx_list_part_s { void *elts; ngx_uint_t nelts; ngx_list_part_t *next; } typedef struct { ngx_list_part_t *last; ngx_list_part_t part; size_t size; ngx_uint_t nalloc; ngx_pool_t *pool; }ngx_list_t;


ngx_list_t 是Nginx封装的链表容器。ngx_list_part_t是一个数组,拥有连续的内存,而ngx_list_t可以看成是元素为数组的链表。


ngx_list_t成员的意义:

1.last:指向链表的最后一个数组元素;

2.part:链表的首个数组元素;

3.size:限制每一个数组元素的大小;

4.nalloc:表示每个ngx_list_part_t数组的元素个数;

5.pool链表中管理内存分配的内存池对象


ngx_list_part_t成员,由上面的介绍,可以看出来,每个ngx_list_part_t的容量由size和nalloc来确定

1.elts:指向数组的起始地址;

2.nelts:表示数组中已经使用了多少个元素;

3.next:下一个ngx_list_part_t的地址


4.ngx_table_elt_t 数据结构

复制代码
1
2
3
4
5
6
7
8
9
10
typedef struct { ngx_uint_t hash; ngx_str_t key; ngx_str_t value; u_char *lowcase_key; }ngx_table_elt_t;


ngx_table_elt_t 有点类似于一个key/value的存储结构,key、value成员里面都存放的是字符串,lowcase_key指向的是全小写的key字符串。ngx_table_elt_t一般用来存放HTTP头部,HTTP头部经常是大小写不敏感的,所以有了全小写的lowcase_key。因为ngx_table_elt_t可以是某个散列表数据结构(ngx_hash_t类型)中的成员,所以hash成员可以在ngx_hash_t更快的找到相同key的ngx_table_elt_t数据。


5.ngx_buf_t 数据结构

缓冲区ngx_buf_t是Nginx处理大数据的关键数据结构,既应用于内存数据也应用于磁盘数据。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
typedef struct ngx_buf_s ngx_buf_t; typedef struct void * ngx_buf_tag_t; struct ngx_buf_s{ //本次处理内存中的数据应该从pos这个位置开始 u_char *pos; //last 表示有效内容到此为止 u_char *last; //处理文件时,与pos,last off_t file_pos; off_t file_last; //如果缓存区用于内存,那么start指向这段内存起始地址,end指向这段内存结束地址 u_char *start; u_char *end; //表示当前缓冲区的类型,由哪个模块使用就指向这个模块ngx_module_t变量的地址 ngx_buf_tag_t tag; //引用的文件 ngx_file_t *file; //影子缓存区,使用缓存区转发上游服务器的响应时才使用shadow ngx_buf_t *shadow; //标志位,为1时,表示数据在内存中,且可以修改 unsigned temporary:1; //标志位,为1时,表示数据在内存中,且不可以修改 unsigned memory:1; //标志位,为1时,表示这段内存是用mmap系统调用映射过来的 unsigned mmap:1; //标志位,为1时,表示可回收 unsigned reclcled:1; //标志位,为1时,表示这段缓存区处理的是文件而不是内存 unsigned in_file:1; //标志位,为1时,表示需要执行flush操作 unsigned flush:1; //标志位,对于这块缓冲区时,是否使用同步方式,Nginx中的操作几乎都是异步的,这是Nginx支持高并发的关键 unsigned sync:1; //标志位,表示是否是最后一块缓冲区,因为ngx_buf_t可以由ngx_chain_t链表串联起来, //为1时,表示是最后一块待处理的缓冲区 unsigned last_buf:1; //标志位,表示是否是ngx_chain_t中的最后一块缓冲区 unsigned last_in_chain:1; //标志位,表示是否是最后一个影子缓冲区,与shadow域配合使用 unsigned last_shadow:1; //标志位,表示当前缓冲区是否属于临时文件 unsigned temp_file:1; };

6.ngx_chain_t数据结构

复制代码
1
2
3
4
5
6
7
8
typedef struct ngx_chain_s ngx_chain_t; struct ngx_chain_s { ngx_buf_t *buf; ngx_chain_t *next; };

buf指向当前的ngx_buf_t缓冲区,next指向下一个ngx_chain_t。


关于HTTP模块先介绍到这,主要是一些数据结构的介绍,后面会再对Nginx HTTP模块处理进行介绍。


最后

以上就是迷路小刺猬最近收集整理的关于Nginx的HTTP模块介绍-----数据结构部分的全部内容,更多相关Nginx内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部