原文作者:洪志道
原文链接:如何高效的学习NGINX - NGINX开源社区
转载来源:NGINX开源社区
本文适合对象:源码开发人员和软件使用人员
先说说NGINX能吸收的营养知识
- http协议和服务器是如何实现的
- 网络编程的知识
- 简直就是c教科书
- 代码阅读能力
- 良好的开发习惯
- 锻炼逻辑能力
- 完全掌握NGINX提升自信心
深入NGINX源码的学习路径
建议尽量只看源码,不看任何其它的资料,但是可以少量参考。
如果你是新手,选最初发布版本 NGINX0.1.0 (2004年发布)。
从代码量比较 NGINX0.1.0: 4w+ vs NGINX1.19.0: 19w+
幸运的是架构几乎没变化。因为模块化是NGINX架构的核心,这个在0.1就支持了。
不幸运的是这也成了一个问题,举个例子,为什么NGINX改配置需要reload呢?
有了模块化之后,涌现了很多的第三方模块,有些质量非常不错,推动了社区的发展。有些质量比较低。
但不管怎么样,这些大量的第三方模块,让NGINX的API不能轻易改动,更不用说架构了。20年前互联网没这么复杂,reload完全不是问题。但是放在现在,长连接业务已经变的很常见,这就成为一个明显的问题了。这里不得不感叹很多厉害人物,在20岁出头就已经有神作了。
选好版本后,带着问题从main开始阅读。我按顺便列了些问题:
- 动手编译hello world模块
- 解释`void ****conf_ctx`
- 怎么响应302
- 为什么能输出html
- 为什么reload配置能刷新
- 为什么upgrade能平滑升级
- 解释超时怎么处理的7. 解释proxy怎么工作的
为方便大家搭建环境,弄了个仓库,有问题可以建立issue,在时间允许上会回复。记得star,让我知道对多少人有帮助。
提示:碰到不会再学习
- 如果不熟悉gdb,没关系。配置文件里配置 daemon off; 会printf即可。
- 如果不熟悉c语言,没关系。先搞懂指针,剩下看源码时碰到不会再学习。
- 如果不熟悉网络编程,也没关系。碰到看不懂再学习。
- 其它类似epoll等一样适用。
- hello world模块用1.19编译。
- NGINX 0.1.0有些bug,作了修复。
如果你觉得跨过新手级别了,看最新版的源码,同样带着问题,但是要写模块。
- 看官方开发指南,这是跟另一朋友一起翻译的,openssl社区的成员,杨洋。
- 多写模块,做到写出来的风格跟源码里的看起来一样。模块自己想,能在工作中解决问题最好了。
- 提高代码能力:
- 抄源码是个方式。
- 找独立的函数,自己实现,然后跟源码里对比。 (问题待整理)
如果哪天你觉得对360无死角了,像社区的一样,看NGINX应该看的都是不足,试试解决这些不足。
如果你是一名使用者,包括运维同学。也想深入NGINX怎么办?
首先,你已经具备nginx的环境,因为你碰到了问题,想深入nginx能在工作中带来帮助。这已经成功一半了。 进入源码吧,比你想象的简单,这跟学习英语一样,用久就习惯了。
举个例子,你想知道map的详细用法:
- 查看官方文档,找到 map 模块,详细阅读。
- 对比源码,看它的逻辑: src/http/modules/ngx_http_map_module.c
为什么看源码有效呢?
首先,完全可以将c代码当作普通的英语描述(俗称伪代码)。其次,你会惊讶于nginx的代码质量,你需要的功能都有专门的一个地方体现。最后,我一直说的,nginx源码非常锻炼人的逻辑能力。
这几年业余时间跟NGINX社区的一起写代码,对nginx/njs/unit都算熟悉,仅供参考。
下篇待续,整体上欣赏NGINX源码的设计。
源码文章只会写一篇,只是为了更快进入源码大门。上面提到的看源码是最好的方式,不想剥夺读者思考的乐趣。
更多资源
想要更及时全面地获取NGINX相关的技术干货、互动问答、系列课程、活动资源?请前往NGINX开源社区:
- 官网:nginx.org.cn
- 微信公众号:https://mp.weixin.qq.com/s/XVE5yvDbmJtpV2alsIFwJg
- 微信群:https://www.nginx.org.cn/static/pc/images/homePage/QR-code.png?v=1621313354
- B站:https://space.bilibili.com/628384319