内容


1.重要文件configure



2.auto子目录



3.configure与auto子目录脚本的关系



4.src是源码存放目录



5.代码部分简要介绍



6.关于Nginx启动



7.nginx有两个重要头文件:ngx_config.h和ngx_core.h。



8.总论:


一、源码整体认识



          源码解压后,根目录有几个子目录和文件,重要的子目录是auto和src,重要的文件是configure



   1.重要文件configure



               configure脚本由作者自己编写,会引用auto目录下面的脚本文件来干活。    



 2.auto子目录



               auto目录下的脚本各司其职,有检查编译器版本的,有检查操作系统版本的,有检查标准库版本的,有检查模块依赖情况的,有关于安装的,有 关于初始化的,有关于多线程检查的等等。



 3.configure与auto子目录脚本的关系



               configure作为一个总驱动,会调用auto中的脚本文件去生成 版本信息头文件、默认被包含的模块的声明代码和Makefile文件。版本信息头文件(ngx_auto_config.h和ngx_auto_headers.h)、默认包含的模块的声明代码(ngx_modules.c)都放置在新创建的objs目录下。



  4.src是源码存放目录,configure创建的objs/src目录是用来存放生成的.o文件。



          



               1)src/core存放着主干部分、基础数据结构和基础设施的源码,main函数在src/core/nginx.c中,这是分析源码的一个很好的起点。



               2)src/event存放着事件驱动模型和相关模块的源码。



               3)src/http存放着http server和相关模块的源码。



               4)src/mail存放着邮件代理和相关模块的源码。



               5)src/misc存放着C++兼容性测试和google perftools模块的源码。



               6)src/os存放着依赖于操作系统实现的源码,nginx启动过程中最重要的master和workers创建代码就在这个目录下,多少让人觉得有点意外。  



  5.代码部分简要介绍



               nginx 的实现中有非常多的结构体,一般命名为ngx_XXX_t,这些结构体分散在许多头文件中,而在src/core/ngx_core.h中把几乎所有的头文件都集合起来,所有的实现文件都会包含这个ngx_core.h头文件,说nginx的各部分源码耦合厉害就是这个原因,但实际上nginx各个部分之间逻辑上是划分的很清晰的,整体上是一种松散的结构。nginx实现了一些精巧的基础数据结构,例如 ngx_string_t,ngx_list_t,ngx_array_t,ngx_pool_t,ngx_buf_t,ngx_queue_t,ngx_rbtree_t,ngx_radix_tree_t 等等,还有一些重要的基础设施,比如log,configure file,time等等,这些数据结构和基础设施频繁的被使用在许多地方,这会让人感觉nginx逻辑上的联系比较紧密,但熟悉了这些基础数据结构的实现代码就会感觉到这些数据结构都是清晰分明的,并没有真正的耦合在一起,只是有些多而已,不过nginx中“家酿”的代码也正是它的一个很明显的亮点。



  6.关于Nginx启动



               Nginx启动过程中,很重要的一步就是加载和初始化模块。  Nginx初始化和启动







 7.nginx有两个重要头文件:ngx_config.h和ngx_core.h。



          src/corex_config.h文件中包含的是和操作系统相关的宏定义和头文件,其中又会包含objsx_auto_headers.h和src/os/unix/ngx__config.h,



          前面提到过,这个头文件是自动脚本检验操作系统后生成的,这个头文件中包含了一些宏定义,这些宏定义说明了存在哪些与特定操作系统有关的头文件,并依此判断出操作系统的种类(linux、freebsd、solaris、darwin等),根据判断出的操作系统种类.



          ngx_config.h包含具体的与操作系统有关的头文件src/os/unix/ngx__config.h,这个头文件中包含几乎所有需要的系统头文件,并包含了objsx_auto_config.h,这是自动脚本生成的另一个头文件,其中包含一些宏定义,这些宏定义说明当前操作系统中存在的特性,根据这些特性又判断出可以支持的nginx内嵌模块情况,比如 rewrite模块需要pcre的支持等。



          src/core/ngx_core.h文件中包含的是nginx中几乎所有实现代码的头文件,包含这个头文件,就可以访问nginx中的所有数据结构和函数接口。几乎所有的模块都包含了ngx_config.h和ngx_core.h。所以,在nginx的任何实现代码中,可以直接使用很多操作系统的接口和nginx实现的接口。



  8.总论:



          纵观整个nginx的代码,可以大致分为三块:



          一块是一些重要的数据结构及其操作接口,代码主要在src/core和src/os/unix目录下;



          第二块是模块的实现,四个种类几十个模块的实现分散在src/core、src/event、srctp、src/mail目录下;



          第三块是启动过程的代码,上一篇也大致列了一下启动调用的函数序列,其代码分布在src/core和src/os/unix目录下。



          0.8.9版本nginx的核心类模块有7个,event类模块有10个,http类模块有47个,mail类模块有7个。另外还有一个模块是没有上下文的,是conf模块,所以准确的说nginx的模块有五种:



corex_conf_file.h:#define NGX_CORE_MODULE 0×45524F43 /* “CORE” */ 
 
 
 

             corex_conf_file.h:#define NGX_CONF_MODULE 0×464E4F43 /* “CONF” */ 
 
 
 

             eventx_event.h:#define NGX_EVENT_MODULE 0×544E5645 /* “EVNT” */ 
 
 
 

             httpx_http_config.h:#define NGX_HTTP_MODULE 0×50545448 /* “HTTP” */ 
 
 
 

             mailx_mail.h:#define NGX_MAIL_MODULE 0×4C49414D /* “MAIL” */