nginx源码分析-源码结构
二月 27th, 2009
作者:张立冰
出处:http://www.libing.name/2009/02/27/understand-nginx-source-code-directory.html
本文主要简单介绍nginx源码目录结构、程序编译流程、如何构建学习nginx的环境等。
本文以及后续nginx源码分析文章是基于nginx当前(2009-02-27)的稳定版本0.6.35进行的分析,该版本的src目录下共有96615行代码,共记234个源码文件。
注:本系统的文章为本人学习做笔记用,为源码分析,而非模块的编写,可能会存在问题。
1.1 源码目录简述
nginx的源码目录结构层次明确,从自动编译脚本到各级的源码,层次都很清晰,是一个大型服务端软件构建的一个范例。以下是源码目录结构说明:
├─auto 自动编译安装相关目录
│ ├─cc 针对各种编译器进行相应的编译配置目录,包括Gcc、Ccc等
│ ├─lib 程序依赖的各种库,包括md5,openssl,pcre等
│ ├─os 针对不同操作系统所做的编译配置目录
│ └─types
├─conf 相关配置文件等目录,包括nginx的配置文件、fcgi相关的配置等
├─contrib
├─html index.html
└─src 源码目录
├─core 核心源码目录,包括定义常用数据结构、体系结构实现等
├─event 封装的事件系统源码目录
├─http http服务器实现目录
├─mail 邮件代码服务器实现目录
├─misc 该目录当前版本只包含google perftools包
└─os nginx对各操作系统下的函数进行封装以及实现核心调用的目录。1.2 程序编译流程
nginx有许多值得学习的地方,它的编译脚本也不例外。nginx的编译脚本非由autoconf等相关工具生成,都是由作者手工编写的。
列举几个与后续开发相关的目录并做说明:
src/auto/modules 根据configure和编译环境的条件生成相应的模块信息。见:ngx_modules.c
src/auto/sources 定义了不同的模块的生成规则,包括相关的源文件、依赖等,最终编译过程中会生成相应的库文件。
nginx在编译安装的过程中会生成objs目录,其中包括编译过程中生成的库文件,以及相关的配置文件,进入目录会存在以下文件:
ngx_auto_config.h 生成的与程序运行相关的宏
ngx_modules.c 由编译生成的模块相关的定义
src 该目录下有许多生成的库文件,作为最终生成nginx使用
1.3 构建nginx学习环境
分析nginx源码的目的是学习nginx高效的处理能力的体系结构,并能将其思想,甚至于nginx的框架借用于服务端的开发。从可扩展的模块机制、内存管理、事件系统等各个方面都有许多值得学习的地方。
但nginx的源代码的核心包间的关联度较高,其它核心的几个数据结构,包括ngx_connection\ngx_array\ngx_buf\ngx_command等等几乎存在于代码每一个角落,我在第一次看0.1.0的时候(0.1.0是网上能找到的nginx的最早版本),发现很难将它们独立出来去对这些数据结构进行测试和学习,于是总结出自己学习的一些方法如下:
学习和熟悉核心数据结构的方法:
1、先熟悉常用的数据结构的使用,包括以下:
ngx_pool\ngx_connection\ngx_array\ngx_buf\
ngx_command\ngx_log\ngx_event\ngx_cycle\ngx_str等
对于这些数据结构的使用方法的原理基本熟悉,学习的方法就是看他们的实现以及http和mail中的使用,熟能生巧。
2、删除nginx.c中main函数的主体,在1的基础上学习其它内容,这样就不需要过多关注nginx的复杂的编译脚本就能学习到相应的知识。
附带基于nginx-0.1.0框架实现的简单echo服务端,程序读取用户输入内容,然后将该内容输出,定时断开连接。
终端:
-bash-3.2# !te telnet 127.0.0.1 80 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. ops init connection test test connection timedout Connection closed by foreign host.
目录结构:
├─core
├─event
│ └─modules
├─ops
│ ├─ngx_ops.c
│ └─ngx_ops.h
└─os
└─unix如果需要该部分代码的朋友可以留下Email地址。
下一节准备对nginx的启动流程做分析。

三月 3rd, 2009 at 12:06 下午
不错不错,楼主是否可以将你的分析相关文档给我一份
三月 3rd, 2009 at 1:29 下午
才刚刚开始写,呵,有更新的话告诉你!
三月 3rd, 2009 at 2:09 下午
加了博主的gtalk,不在线吗?
三月 8th, 2009 at 10:26 上午
to freeke:
和你一样,gtalk不经常在线……
四月 11th, 2009 at 12:09 上午
对nginx的启动流程分析 写了么?
四月 11th, 2009 at 1:57 下午
TO小兵:近段时间有些忙,没得时间整理文章。
五月 7th, 2009 at 11:27 下午
呵呵,好啊。要坚持写哦。
最近也打算学习nginx的源代码,要常过来取经啊。
五月 8th, 2009 at 11:21 下午
TO jackywdx:
最近公司事情太多,等忙过了会发一些好文章的!
五月 15th, 2009 at 3:38 下午
高手,我现在在学nginx,刚开始入门,麻烦你把基于nginx-0.1.0框架实现的简单echo服务端发到我邮箱好吗?我的邮箱是hushenglan@139.com
五月 15th, 2009 at 6:01 下午
已发送,请查收!
五月 29th, 2009 at 11:38 上午
基本的数据结构的确需要了解..否则做相应的功能完善的模块开发非常费力.
七月 17th, 2009 at 2:45 下午
我也想学学,发给我一份吧,谢谢了!
azhai [at] 126 [dot] com
七月 18th, 2009 at 8:41 下午
已发送!
七月 24th, 2009 at 11:27 上午
以前一直做监控和通讯,一直致力于实时数据库的研究和开发,也做了比较不错的实时内存数据库软件。但是,今年开始接触nginx之类的东西,无线期待,学习。
九月 8th, 2009 at 5:13 下午
weitidong220@163.com
谢谢
九月 8th, 2009 at 5:52 下午
已发送,请查收!
九月 10th, 2009 at 6:37 下午
能不能给我发一份
我的email:jintian.song@163.com
九月 11th, 2009 at 11:05 上午
已发送,请查收!
九月 15th, 2009 at 3:49 下午
能不能也传我一份 echo服务器的源码,看了一段时间的0.1.0,感觉牵扯复杂,想从简单的框架学起
邮箱 hustlan2001@gmail.com
九月 15th, 2009 at 4:01 下午
已邮件发送,请查收!
九月 19th, 2009 at 2:41 下午
也在研究ngnix,能不能给我发一份作参考一下。谢谢
我的email:vicplop@gmail.com
九月 19th, 2009 at 11:28 下午
已发给你邮箱里了,请查收!
九月 22nd, 2009 at 10:17 上午
研究nginx中,能不能发一份0.1.0(没有G到)及echo服务器源码,谢谢
九月 22nd, 2009 at 10:43 上午
楼上的请检查邮箱,已发送到你的邮箱中!
十月 8th, 2009 at 8:41 上午
能不能发给我一份学习参考使用呢?谢谢
我的邮箱 : huangbaihua001@163.com
十月 8th, 2009 at 9:19 上午
已发送至你邮箱!
十月 10th, 2009 at 12:16 上午
能不能给我一份学习呢?
harteg.org#gmail.com
十月 10th, 2009 at 12:36 上午
请检查你的邮箱!
十月 11th, 2009 at 12:33 下午
楼主,能不能给我一份,谢谢!!!
十月 11th, 2009 at 12:35 下午
已发!
十月 19th, 2009 at 5:44 下午
好东西,我也要
noodle1983@126.com
十月 21st, 2009 at 12:20 上午
发到你的邮箱里了,请查收!
十月 23rd, 2009 at 10:56 上午
正在研究web服务器,想渐进的学习
LZ能把0.1.0的代码和那基于nginx-0.1.0框架实现的简单echo服务端也发我一份么,谢谢:)
邮箱:firesonby@gmail.com
十月 23rd, 2009 at 10:57 上午
邮箱写错了,是firesnoby@gmail.com
十月 23rd, 2009 at 11:04 上午
已发送到你的邮箱!
十月 28th, 2009 at 11:16 下午
楼主请发一份源码,多谢
554111295@qq.com
十月 28th, 2009 at 11:29 下午
@jas 请查收邮件!
十月 29th, 2009 at 6:15 下午
楼主,最近在学习nginx,麻烦发一份,多谢了
MAIL:554111295@qq.com
十月 29th, 2009 at 9:05 下午
楼上的同学邮箱查收!
十月 30th, 2009 at 9:06 上午
老大,好像没收到,可能邮箱有问题,帮忙往下面邮箱发个试试,谢谢了
waly89@yahoo.com.cn
十月 30th, 2009 at 9:11 上午
你到新的邮箱再看下!
十一月 5th, 2009 at 8:20 上午
希望你能坚持分析下去,期待后续的文档,已经订阅你的博客
十一月 5th, 2009 at 10:04 上午
只能忙里偷闲写一些,希望后续自己能多写一些。
十一月 26th, 2009 at 10:30 下午
希望能看到你更多的文章
请发一份echo服务器代码,thx
h1r0t1m3r@gmail.com
十一月 27th, 2009 at 10:00 上午
发送到你的邮箱了,请查收!
十二月 5th, 2009 at 11:08 下午
请发一份谢谢.
nicenight@qq.com
将继续关注您的博客
十二月 6th, 2009 at 9:24 下午
@soyoung,请查收!
十二月 7th, 2009 at 9:08 上午
刚刚学习nginx,很高兴能看到这篇文章,希望你能写出更多更好的文章!
请发一份echo服务器代码!Thanks!
chying_ren@163.com
十二月 7th, 2009 at 9:36 上午
@Huaying,请查收!
十二月 10th, 2009 at 10:37 上午
很高兴搜索到这篇文章,请发一份echo server code~ thanks.
thunk666@163.com
十二月 10th, 2009 at 12:05 下午
@thunk,请查收!
十二月 16th, 2009 at 1:07 下午
最近想写一个nginx的filter,把response缓存到memcache里,给我也发一份代码吧,谢谢! flexpg@gmail.com
十二月 16th, 2009 at 4:04 下午
@flexpg,请查收!
十二月 23rd, 2009 at 9:57 上午
linux-sky@163.com 发我一份,谢谢!
十二月 23rd, 2009 at 11:09 上午
@linux-sky,请查收!
十二月 26th, 2009 at 2:17 上午
发一份谢谢!
十二月 26th, 2009 at 3:03 下午
麻烦你发一份给我,谢谢了!
十二月 26th, 2009 at 3:03 下午
邮箱地址是goodtangyb@126.com
一月 16th, 2010 at 12:36 上午
刚开始在研究nginx,
LZ能把0.1.0的代码和那基于nginx-0.1.0框架实现的简单echo服务端也发我一份么,谢谢:)
邮箱:tanglj321@163.com
一月 24th, 2010 at 10:16 上午
@datastream,请查收!
一月 25th, 2010 at 7:17 下午
高人,我刚开始入门nginx,太多的函数指针太头痛了, 能否把基于nginx-0.1.0框架实现的简单echo服务端发到我邮箱 ivonlin_100@yahoo.com.cn 好吗? 如果你有其他的一些对NGINX分析的文章或读书笔记能发给我,太感激不尽。以后要多来取经。。
一月 25th, 2010 at 8:48 下午
@ linjinfu,请查收!
五月 24th, 2010 at 12:43 上午
最近准备研究下nginx,能不能麻烦把0.1.0的代码和那基于nginx-0.1.0框架实现的简单echo服务端也发我一份么,谢谢了:)
六月 8th, 2010 at 3:55 下午
楼主,能否把你对nginx源码分析的相关笔记发我一份,万分感谢!
hustxnwsg@gmail.com
七月 14th, 2010 at 8:05 下午
我从网上找了一份nginx-0.1.0,无法直接编译通过,更改obj/Makefile后可以编译通过但是无法启动,提示端口绑定失败,没有细看,但是估计这份代码问题较多。能不能把你找到的nginx-0.1.0代码和你实现的echo服务给我发一份学习一下,万分感谢。
liujian.ebupt@gmail.com
七月 14th, 2010 at 9:44 下午
已通过邮件发送,请查收。