nginx学习之路(1)

一直都想找一款开源的web server来读,苦于没有时间。今天心血来潮把著名的nginx给checkout出来,打算开始一睹其芳容,希望自己能坚持下来,所以也打算

把学习的点滴过程记录下来成为手记。由于我自己是初学者,所以这些手记或许对更多的初学者会有些参考价值,也希望大牛可以指正我的任何错误,我将不胜感激。

学习一款优秀的开源软件,可以从源码入手,nginx的源码完全由c语言构成,很适合初学者学习。nginx的svn地址为svn://svn.nginx.org/nginx,

checkout以后,可以看到nginx的开发版本管理很符合SVN的思想,branches目录里存放的是稳定版,tags目录里是各发布版,trunk里

最新的开发版本。我打算直接到tags去编译最初的0.1.0版本,从简单学起。

(By the way,我的宿主机环境为Ubuntu 12.04, Linux 3.2.0 X86_64,gcc 4.6.3)

cd tags/release-0.1.0

auto/configure

发现需要PCRE, md5, OpenSSL, Zlib库,先不去研究这些库的作用,安装好这些库,然后再次configure,可以发现生成了makefile

make

make install

注意,在make以后会发现一些错误,首先关掉-Werror参数,然后在源码中进行一些修正,注意就是添加一些#define宏定义,具体需要改哪些地方,大家可以自己摸索,因为对新人来说这也算一个小的task,可以快速熟悉目录结构,我也是花了一上午时间修复了所有的问题。如果说建议的话,大家可以参考release 0.5.0版本,因为后者直接可以编译通过。

编译成功以后,就可以执行nginx了,看到localhost上出现Welcome to nginx!就大功告成了。(有朋友反映编译成功,但是运行以后localhost没有展示欢迎页面。大家可以看看Makefile里的install命令包含一个copy html的语句,这个html在哪呢?实际上在docs目录下,修复之即可)

接下来就可以进行源码的阅读了,既然是第一个版本,其代码量也相对较少,可以大概统计一下代码量

find . -name *.c|xargs wc -l|sort -n

***

42567 total

知道初版的代码量只有4w行,而最新版(我的最新版是1.3.9)的代码量达到127118行,知道为啥要从初版学起了吧?

在正式开始读源码前,最好能有一个宏观的把握,所以先说一下nginx的核心架构,下面的内容参考http://www.aosabook.org/en/nginx.html

传统的web server,如Apache,采用多线程/进程的机制,为每个连接请求维护一个线程/进程,由于每个线程/进程需要独立的运行环境、堆、栈等,而且创建线程/进程也需要开销,所以大量的请求会非常消耗硬件资源,如CPU,Memory。

nginx在设计之初就是要提高性能,合理的利用有限资源满足更大量的请求。所以nginx采用了不同于以往的模型。nginx参考OS里的事件机制,设计出了一种模块化、事件驱动、异步、单线程、非阻塞的架构。

nginx里大量使用到“多路复用”和“事件通知”机制,并且为每个进程分配一定的任务。这些进程数量有限,并且都是单线程,称为worker,它们共同在循环中高效处理connections。每个worker每秒可以处理几千个连接请求。

先到这里,下次从nginx的代码结构继续。



猜你喜欢

转载自blog.csdn.net/owengbs/article/details/8143388