Nginx(Engine X)是一款高性能的HTTP、反向代理与负载均衡均衡服务器,同时也支持IMAP/POP3/SMPT代理服务器。Nginx的原作者是俄罗斯人Igor,他将源代码以类BSD许可证的形式发布。Nginx发布以来,因为其稳定性,丰富的功能集成,示例配置文件和低系统资源消耗而闻名。目前国内各大门户网站及相关应用越来越多的部署了Nginx,如sina,网易,淘宝,腾讯等。因此,越来越多WEB服务器应用开发者、WEB高性能研究者以及WEB应用安全研究者都投入了对Nginx的研究。甚至很多人开始语言因为Nginx的高性能、低资源消耗级稳定性的优势,有逐步抢夺Apache对WEB服务器市场占有量的趋势。
下图是各大WEB服务器自1995至2011年的市场占有率情况:
图 SEQ 图 \* ARABIC 1 各大WEB服务器市场占有率情况
1.2 必备基础知识
由于Nginx的代码主要由C语言,部分嵌入式汇编及脚本语言组成。因此,分析Nginx源代码,必须具备扎实的C语言基础,最好能能够读懂嵌入式汇编语言,对shell脚本语言也需要有一定的掌握。
作为一个高性能的WEB服务器,分析Nginx的源代码,你还需要具备HTTP协议的基础知识,另外需要掌握一定的网络知识,尤其是socket编程,对TCP/IP协议有一定的了解。本情景分析主要是分析Linux的版本,因此,你还需要掌握Linux编程的相关知识(强烈推荐阅读《UNIX环境高级编程》一书)。另外,最好对系统及软件程序架构有一定的了解,这样可以更深入的理解Nginx的模块化构成。
1.3 Nginx的目录结构本情景分析以当前Nginx的最新版本1.1.7为参考,其他版本其主要的原理和核心代码差异不大。
以下是Nginx源代码的目录树结构:
图 SEQ 图 \* ARABIC 2 Nginx源码目录树
Src为核心源代码目录,其中主要的几个目录及包含的源代码简介如下:
core : 该目录存放核心基础模块的代码,也是Nginx服务的入口
http : HTTP协议处理模块的代码,Nginx作为WEB服务器和代理服务器运行时的核心模块
mail : Mail处理模块的代码,Nginx作为pop3/imap/smtp代理服务器运行时的核心模块
event : Nginx 自身对事件处理逻辑的封装
os : Nginx对各个平台抽象逻辑的封装
misc : nginx 的一些utils,定义了test和profiler的一些外围模块的逻辑
其他几个目录:
auto:系统执行./configure时,所依赖的一些自动化脚本。
conf:Nginx相关运行时调用的配置文件模版
objs:编译生成的目标文件存放目录
man:帮助文档
html:默认的访问文件存放目录
1.4 基础数据类型在Nginx源码中,定义了很多数据类型,对原始的基础数据类型进行了封装。其中,一些基础的数据类型,在平时的编程中很少用到,这里特别说明一下。
在core/ngx_config.h 目录里面定义了以下几个基本的数据类型的映射:
typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;
typedef intptr_t ngx_flag_t;
在linux系统中,这几个数据类型在/usr/include/stdint.h的定义为:
/* Types for `void *' pointers. */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned long int uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int intptr_t;
# define __intptr_t_defined
# endif
typedef unsigned int uintptr_t;
#endif
其他的数据类型,均以以上几个基础数据类型为参考,进行其他复杂的数据结构的封装定义。
由于Nginx在编程时,很多地方都自己封装了一套数据结构,带有自身的特色,这里就不一一进行说明,在后续的情景分析中,再将逐步进行深入分析。