如何高效的学习NGINX
920 次浏览
发表于 2020-06-06 00:41

本文适合对象:源码开发人员和软件使用人员

先说说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开始阅读。我按顺便列了些问题:
0. 动手编译hello world模块
1. 解释`void ****conf_ctx`
2. 怎么响应302
3. 为什么能输出html
4. 为什么reload配置能刷新
5, 为什么upgrade能平滑升级
6. 解释超时怎么处理的7. 解释proxy怎么工作的

为方便大家搭建环境,弄了个仓库,有问题可以建立issue,在时间允许上会回复。https://github.com/hongzhidao/nginx-code-reading
记得star,让我知道对多少人有帮助。

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

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

https://github.com/baishancloud/nginx-development-guide
这是跟另一朋友一起翻译的,openssl社区的成员,杨洋。
2. 多写模块,做到写出来的风格跟源码里的看起来一样。
模块自己想,能在工作中解决问题最好了。
3. 提高代码能力。
a. 抄源码是个方式。 b. 找独立的函数,自己实现,然后跟源码里对比。 

(问题待整理)

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

如果你是一名使用者,包括运维同学。也想深入nginx怎么办?
首先,你已经具备nginx的环境,因为你碰到了问题,想深入nginx能在工作中带来帮助。
这已经成功一半了。 进入源码吧,比你想象的简单,这跟学习英语一样,用久就习惯了。
举个例子,你想知道map的详细用法。
1. 查看官方文档:http://nginx.org/en/docs/ 找到 map 模块,详细阅读。
2. 对比源码,看它的逻辑: src/http/modules/ngx_http_map_module.c
为什么看源码有效呢?
首先,完全可以将c代码当作普通的英语描述(俗称伪代码)
其次,你会惊讶于nginx的代码质量,你需要的功能都有专门的一个地方体现。
最后,我一直说的,nginx源码非常锻炼人的逻辑能力。


这几年业余时间跟NGINX社区的一起写代码,对nginx/njs/unit都算熟悉,仅供参考。
下篇待续,整体上欣赏NGINX源码的设计。
源码文章只会写一篇,只是为了更快进入源码大门。
上面提到的看源码是最好的方式,不想剥夺读者思考的乐趣。


如果您觉得不错,就打赏支持一下吧〜
已有 2 人进行打赏
  • SamW_NGINX
  • 皮皮鲁
发表评论
  • Radio

    666 谢谢

    2020-06-15 23:31
    6
    回复
发表者

洪志道

NGINX社区贡献者

  • 10

    文章

  • 1

    关注

  • 21

    粉丝

活动推荐
版权所有©F5 Networks,Inc.保留所有权利。京ICP备16013763号-5