要读大项目的源码,最好还是先把项目文件组织结构弄清楚,这样后面找源码会比较方便,对整体项目的架构也能有一个具体一些的概念。
我下载的nginx源码版本不可考,按日期来看是2015年7月的最新版本。解压包获得源码文件夹,进入根目录发现有几个子目录:auto、conf、contrib、docs、misc、src。从字面上猜测,是自动机或脚本(auto script)、配置文件(configuration)、支持文件(contributions)、文档(document)、杂项(miscellaneous)、源码(source code)。
1、浏览源码文件夹根目录
按照惯例,我选择先看看文档,但是doc子目录里并没有详细的离线文档,只有nginx官网的链接和一些看不懂的小文件。
杂项misc里也只有看不太懂的一个GNUmakefile和一个README文件。
contrib子目录里有一个geo2nginx.pl(geo模块的CSV数据库格式转换perl脚本),一套编码转换文件(包括两个编码映射表和一个编码转换perl脚本),和vim的nginx专用语法高亮配置文件。
conf子目录里有几个编码映射表、变量映射表和一个服务器配置文件。
auto子目录里有包括服务器安装脚本在内的许多脚本,现在看脚本还比较吃力,所以只简单浏览一下。我们发现nginx支持很多主流的操作系统平台:苹果的开源系统darwin、重要的Unix分支freebsd、linux、大多数版本已经开源的又一个Unix分支solaris、用户占有率最高的win32。
src子目录果然都是需要研究的nginx的C源码,下面我们会深入浏览。
2、浏览src子目录
还是来看一下src子目录下有哪些子目录:core、event、http、mail、misc、mysql、os、stream。还是来按照字面意思猜测一下:核心(主函数、数据结构、主要方法)、事件(事件处理机制)、超文本传输协议(http相关)、邮件(邮件相关)、杂项(google perftools相关源码)、mysql数据库、操作系统(Unix和Win32两类系统的系统调用程序源码)、流(意义不明)。看起来./src/core子目录对研究源码来说是一个不错的开始。
图2 nginx源码文件结构图