我是靠谱客的博主 迷路小刺猬,最近开发中收集的这篇文章主要介绍Nginx的HTTP模块介绍-----数据结构部分,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.整型的封装

typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;


2. 字符串的封装

typedef struct{
size_t len;
u_char *data;
} ngx_str_t;

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


3.ngx_list_t数据结构

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 数据结构

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处理大数据的关键数据结构,既应用于内存数据也应用于磁盘数据。

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数据结构

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的HTTP模块介绍-----数据结构部分所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部