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

浏览 4.5k

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

先说说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
粉丝
相关文章
Name nginx_http_upstream_check_module-supportupstreamhealthcheckwith Nginx Synopsis http{ upstreamcluster{ #simpleround-robin server192.168.0.1:80; server192.168.0.2:80; checkinterval=5000rise=1fall=3timeout=4000; #checkinterval=3000rise=2fall=5timeout=1000type=ssl_hello; #checkinterval=3000rise=2fall=5timeout=1000type=http; #check_http_send"
点赞 0
浏览 1.3k
作者:民工哥  原文链接:https://xie.infoq.cn/article/219a1ae8c7e62f3662112e837今天,我们来聊一聊,在企业实际生产环境中经常遇到的一个情况,升级Nginx到新的版本和如何回滚至旧版本。1、环境介绍今天准备的两个nginx版本如下:[root@nginx~]#cd/download/nginx/2、编译安装新旧版本编译安装nginx-1.12.2[root@nginxnginx]#tarzxfnginx-1.12.2.tar.gz编译安装nginx-1.14.2[root@nginx~]#cd/download/nginx/到这里,两个版本的nginx软件已经部署完成。3、启动旧版本nginx[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx-t4、升级到新版本版本升级其实就是针对二进制文件的升级,过程如下:[root@nginx~]#/usr/local/nginx-1.12.2/sbin/nginx-v接下来进行平
点赞 0
浏览 1.8k
原文作者:妙正灰原文链接:基于Nginx的HTTPS性能优化实践转载来源:阿里云开发者社区前言随着相关浏览器对HTTP协议的“不安全”、红色页面警告等严格措施的出台,以及向iOS应用的ATS要求和微信、支付宝小程序强制HTTPS需求,以及在合规方面如等级保护对传输安全性的要求都在推动HTTPS的发展。虽然HTTPS优化了网站访问体验(防劫持)以及让传输更加安全,但是很多网站主赶鸭子上架式的使用了HTTPS后往往都会遇到诸如:页面加载速度变慢、服务器负载过高以及证书过期不及时更新等问题。所以本文就来探讨一下HTTPS的优化实践。选型其实像ApacheHttpd、LigHttpd、Canddy等Web服务软件都可以设置HTTPS,但是在相应的扩展生态和更新率上都不如Nginx。Nginx作为大型互联网网站的Web入口软件有着广泛的支持率,例如阿里系的Tengine、CloudFlare的cloudflare-nginx、又拍云用的OpenResty都是基于Nginx而来的,Nginx是接受过大规模访问验证的。同时大家
点赞 1
浏览 1.7k