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语言中,字符串一般都是以'\0'结尾,但是这里data指向的并不一定会以'\0'结尾,所以通过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成员的意义:
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模块处理进行介绍。