Chinaunix首页 | 论坛 | 博客
  • 博客访问: 108931
  • 博文数量: 60
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-09 12:19
文章分类

全部博文(60)

文章存档

2015年(3)

2014年(41)

2013年(16)

我的朋友

分类: LINUX

2013-11-26 08:30:27

1 预备知识 1.1 Nginx简介

NginxEngine X)是一款高性能的HTTP、反向代理与负载均衡均衡服务器,同时也支持IMAP/POP3/SMPT代理服务器。Nginx的原作者是俄罗斯人Igor,他将源代码以类BSD许可证的形式发布。Nginx发布以来,因为其稳定性,丰富的功能集成,示例配置文件和低系统资源消耗而闻名。目前国内各大门户网站及相关应用越来越多的部署了Nginx,如sina,网易,淘宝,腾讯等。因此,越来越多WEB服务器应用开发者、WEB高性能研究者以及WEB应用安全研究者都投入了对Nginx的研究。甚至很多人开始语言因为Nginx的高性能、低资源消耗级稳定性的优势,有逐步抢夺ApacheWEB服务器市场占有量的趋势。

下图是各大WEB服务器自19952011年的市场占有率情况:

 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源代码的目录树结构:

说明: G:.personal.misc.15261619.Image.Image11.%@MVS)A3~2B3{{~3OLLD%Q9.jpg

 SEQ \* ARABIC 2 Nginx源码目录树

 

Src为核心源代码目录,其中主要的几个目录及包含的源代码简介如下:

core : 该目录存放核心基础模块的代码,也是Nginx服务的入口

http : HTTP协议处理模块的代码,Nginx作为WEB服务器和代理服务器运行时的核心模块

mail : Mail处理模块的代码,Nginx作为pop3/imap/smtp代理服务器运行时的核心模块

event : Nginx 自身对事件处理逻辑的封装

os : Nginx对各个平台抽象逻辑的封装

misc : nginx 的一些utils,定义了testprofiler的一些外围模块的逻辑

 

其他几个目录:

auto:系统执行./configure时,所依赖的一些自动化脚本。

confNginx相关运行时调用的配置文件模版

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在编程时,很多地方都自己封装了一套数据结构,带有自身的特色,这里就不一一进行说明,在后续的情景分析中,再将逐步进行深入分析。

阅读(308) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~