原文作者:洪志道
原文链接:​​如何高效的学习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开始阅读。我按顺便列了些问题:


  1. 动手编译hello world模块
  2. 解释`void ****conf_ctx`
  3. 怎么响应302
  4. 为什么能输出html
  5. 为什么reload配置能刷新
  6. 为什么upgrade能平滑升级
  7. 解释超时怎么处理的7. 解释proxy怎么工作的


为方便大家搭建环境,弄了个​​仓库​​,有问题可以建立issue,在时间允许上会回复。记得star,让我知道对多少人有帮助。


提示:碰到不会再学习


  • 如果不熟悉gdb,没关系。配置文件里配置 daemon off; 会printf即可。
  • 如果不熟悉c语言,没关系。先搞懂指针,剩下看源码时碰到不会再学习。
  • 如果不熟悉网络编程,也没关系。碰到看不懂再学习。
  • 其它类似epoll等一样适用。
  • hello world模块用1.19编译。
  • NGINX 0.1.0有些bug,作了修复。


如果你觉得跨过新手级别了,看最新版的源码,同样带着问题,但是要写模块。

  1. 看​​官方开发指南​​,这是跟另一朋友一起翻译的,openssl社区的成员,杨洋。
  2. 多写模块,做到写出来的风格跟源码里的看起来一样。模块自己想,能在工作中解决问题最好了。
  3. 提高代码能力:
  • 抄源码是个方式。
  • 找独立的函数,自己实现,然后跟源码里对比。 (问题待整理)


如果哪天你觉得对360无死角了,像社区的一样,看NGINX应该看的都是不足,试试解决这些不足。


如果你是一名使用者,包括运维同学。也想深入NGINX怎么办?


首先,你已经具备nginx的环境,因为你碰到了问题,想深入nginx能在工作中带来帮助。这已经成功一半了。 进入源码吧,比你想象的简单,这跟学习英语一样,用久就习惯了。


举个例子,你想知道map的详细用法:


  1. 查看​​官方文档​​,找到 map 模块,详细阅读。
  2. 对比源码,看它的逻辑: 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​