本节内容:
nginx高效学习方法
Nginx做为一个高性能的web服务器,相对于apache等服务器来说它的代码量并不是非常庞大,反而非常精简。看过nginx源码的人都知道,nginx将“一切皆为模块”和“所有问题都可以通过加层的方式来解决”这两句话体现得淋漓尽致。
nginx所有功能都由一个一个模块叠加而成,这对快速定位问题非常有用。在计算机行业中有这么一句话,计算机中的所有问题都可以通过增加中间层的方式来解决;比如linux物理内存太少不够用,就通过增加虚拟内存这一层来解决;再比如内存访问磁盘的速度太低,就通过增加调整缓存这一层来解决等等。
nginx也是一样通过增加中间层来解决问题,nginx的大体上分为三层,第一层由核心模块、事件模块,日志模块组成,主要处理配置解析、TCP网络事件等;第二层由http框架模块、mail框架模块等组成,在第一层的基础上处理用户的请求,解析用户请求行、请求头(http协议);第三层由业务模块组成,通过获取第二层解析的用户请求信息进行业务处理。用来做nginx 正向代理、nginx 反向代理用来代理后端文件或作nginx缓存,都相当不错的。
nginx是一个非常优秀的开源软件,学习它可以提高我们编码的能力。相信每个人都能学会nginx,只是时间问题而已,但如何发最少的时间高效的学会nginx呢?本人学习nginx已有大半个月,虽没有完全看完nginx源代码,但也看懂近十个模块的源代码。
分享下学习nginx的一些方法,供大家参考。
第一步、下载nginx源代码,在linux上编译安装
能看懂configure文件的尽量学习一下,看不懂的就算了,编译完后是知道在objs目录下有一个ngx_modules.c文件,这文件里存有nginx模块加载运行的顺序。
第二步、用sourceInsight建立一个nginx源码工程
第三、四步中会用到
第三步、找一本nginx方面的电子书,按照书的流程看一遍
入门级书中一般都会介绍一些nginx常用的配置项、nginx常用的数据结构、以及如何编写nginx模块等等,这些都得学会。看书是有技巧的,在看书时遇到书中对某结构体或者某函数的描述时就将描述信息写在源代码中对相应的结构体或函数边,后续看代码时就不需要再这里找那里找了。
推荐《实战Nginx:取代Apache的高性能Web服务器》,有兴趣的朋友可以参阅下。
第四步、阅读源代码
书看完了,并不代表就学会了,有些细节还得通过看源代码才能知道。
阅读源代码不能无目的的去看,得按照ngx_modules.c文件中模块的编译 顺序一个模块一个模块的去看,模块之间总会有些依赖关系的,前一个模块所做的工作往往后面的模块要用到,不按模块顺序看是要付出很大代价的。
由于在第三步中对一些重要的结构成员已经有描述了,此时看起代码来就不那么困难了。
源代码至少得看两遍,第一遍将每个模块的源码看一遍,知道该模块处理了那些配置项,完成了什么功能;
第二遍得从连接的角度去看,如当nginx收到用户请求时经过那些模块,这些模块对它做了那些处理等。
参考资料:
http://nginx.org/en/docs/ //官方文档,有每个模块处理的配置项
http://www.pagefault.info/?p=188 //nginx的启动过程分析