点赞
评论
收藏
分享
举报
如何高效的学习NGINX
发表于2020-06-06 00:41

浏览 4.3k

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

先说说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源码的设计。
源码文章只会写一篇,只是为了更快进入源码大门。
上面提到的看源码是最好的方式,不想剥夺读者思考的乐趣。


已修改于2023-03-09 02:03
创作不易,留下一份鼓励
洪志道

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(3)

按点赞数排序

按时间排序

666 谢谢
赞同

6

回复举报

发表于2020-06-15 23:31



回复Radio
回复

怎么看,从哪看?能详细点吗

赞同

0

回复举报

发表于2021-07-02 17:58



回复奇[爱心]一
回复

感谢

赞同

0

回复举报

发表于2020-11-05 17:57



回复阿尔巴
回复
关于作者
洪志道
这家伙很懒还未留下介绍~
11
文章
0
问答
54
粉丝
相关文章
1、问题现象:在容器管理上监控到受理中心容器cpu使用率持续大于100%。2、定位步骤:1)ssh到对应主机,执行命令dockerps-a|grep端口,可以获取到容器id。2)进入容器dockerexec-it容器idbash。3)执行top命令,获取耗cpu的线程ID。top-p1,持续观察进程cpu使用率,按shift+h切换成线程cpu使用情况,持续观察可以获取到cpu使用率高的线程pid。4)用计算器或者printf"%x\n"十进制的pid例如 printf"%x\n"640以上命令可以获取十六进制的javacore中的nid,注意十六进制用计算器获得的结果大写字母要转换成小写。5)获取javacore:jstack-l1>a1.log。6)用vi命令在a1.log中查找第四步获取到的十六进制nid,即可定位耗cpu的线程堆栈。例如:7)根据线程堆栈中指示的业务代码进一步分析。3、根据业务代码发现产生了while死循环的可能,进一步分析和修改业务代码。
点赞 6
浏览 1.7k
说说web缓存网上关于WEB缓存的文章很多,今天汇总一下。为什么要用缓存一般针对静态资源如CSS,JS,图片等使用缓存,原因如下:请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度。节省带宽:对于已缓存的文件,可以减少请求带宽甚至无需请求网络。降低服务器压力:在大量用户并发请求的情况下,服务器的性能受到限制,此时将一些静态资源放置在网络的多个节点,可以起到均衡负载的作用,降低服务器的压力。缓存分类缓存分为服务端侧(serverside,比如Nginx、Apache)和客户端侧(clientside,比如webbrowser)。常用的服务端缓存有CDN缓存,客户端缓存就是指浏览器缓存。浏览器缓存机制详解缓存类型浏览器缓存分为强缓存和协商缓存:1 强缓存:浏览器在加载资源时,先根据这个资源的一些httpheader判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个css文件,如果浏览器在加载它所在的网页时,这个css文件的缓存配置命中了强缓存,浏览器
点赞 0
浏览 850
尽管“应用服务器”和“Web 服务器”的字面意思有所不同,但在互联网上,这两种类型的服务器通常为了实现共同的目标而部署在一起,即实现用户对网站内容的请求。Web 服务器和应用服务器的属性并没有标准的定
点赞 0
浏览 611