文档介绍:l00117893Nginx代码的目录和结构nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:├─auto自动编译安装相关目录│├─cc针对各种编译器进行相应的编译配置目录,c等│├─lib程序依赖的各种库,包括md5,openssl,pcre等│├─os针对不同操作系统所做的编译配置目录│└─types├─conf相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等├─contrib├─└─src源码目录├─core核心源码目录,包括定义常用数据结构、体系结构实现等├─event封装的事件系统源码目录├─httphttp服务器实现目录├─mail邮件代码服务器实现目录├─misc该目录当前版本只包含googleperftools包└─osnginx对各操作系统下的函数进行封装以及实现核心调用的目录。基本数据结构简单的数据类型在core/,大部分都映射到c语言自身的数据类型。typedefintptr_t    ngx_int_t;typedefuintptr_t   ngx_uint_t;typedefintptr_t    ngx_flag_t;其中ngx_int_t,nginx_flag_t,都映射为intptr_t;ngx_uint_t映射为uintptr_t。这两个类型在/usr/include/:/*Typesfor`void*'pointers. */#if__WORDSIZE==64#ifndef__intptr_t_definedtypedeflongint        intptr_t;# define__intptr_t_defined#endiftypedefunsignedlongint   uintptr_t;#else#ifndef__intptr_t_definedtypedefint          intptr_t;# define__intptr_t_defined#endiftypedefunsignedint      uintptr_t;#endif所以基本的操作和整形/指针类型的操作类似。字符串的数据类型nginx对c语言的字符串类型进行了简单的封装, core/ 里面包含这些封装的内容。其中定义了ngx_str_t,ngx_keyval_t,ngx_variable_value_t这几个基础类型的定义如下:typedefstruct{  size_t   len;  u_char  *data;}ngx_str_t;typedefstruct{  ngx_str_t key;  ngx_str_t value;}ngx_keyval_t;typedefstruct{  unsigned  len:28;  unsigned  valid:1;  unsigned  no_cacheable:1;  unsigned  not_found:1;  unsigned  escape:1;  u_char  *data;}ngx_variable_value_t;可以看出ngx_str_t在原有的uchar* 的基础上加入的字符串长度的附加信息,初始化使用ngx_string宏进行,他的定义为:#definengx_string(str)  {sizeof(str)-1,(u_char*)str}内存分配相关系统功能封装内存相关的操作主要在os/unix/ngx_alloc.{h,c}和core/ngx_palloc.{h,c}下。其中os/unix/ngx_alloc.{h,c}封装了最基本的内存分配函数,是对c原有的malloc/free/memalign等原有的函数的封装,对应的函数为:ngx_alloc使用malloc分配内存空间ngx_calloc使用malloc分配内存空间,并且将空间内容初始化为0ngx_memalign返回基于一个指定的alignment大小的数值为对齐基数的空间ngx_free对内存的释放操作Nginx的内存池为了方便系统模块对内存的使用,方便内存的管理,nginx自己实现了进程池的机制来进行内存的分配和释放,首先nginx会在特定的生命周期帮你统一建立内存池,当需要进行内存分配的时候统一通过内存池中的内存进行分配,最后nginx会在适当的时候释放内存池的资源,开发者只要在需要的时候对内存进行申请即可,不用过多考虑内存的释放等问题,大大提高了开发的效率。内存池的主要结构为://