2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

Nginx 学习书单整理

  • 2019-01-29
  • 本文字数:2742 字

    阅读完需:约 9 分钟

Nginx 学习书单整理

大家好,我是陶辉,之前在华为、阿里、腾讯、思科等公司工作过,现在是杭州智链达公司的联合创始人兼 CTO。我从 09 年开始接触 Nginx,至今已经有 10 年了,对 Nginx 有一些自己独特的见解,分享自己学习 Nginx 的经历与经验,及梳理重难点等等。


以下是“Nginx 到底该怎么学?”的主题纲要。


作为工程师的我们,为什么要学 Nginx?

第一点:Nginx 对整个架构的帮助是非常大的。

2007 年,我从华为来到了腾讯的 QQ 空间,在数据开发组工作。当时 QQ 空间小组也就是十来个人,大概有一亿多用户,同时在线大约在三百万用户,承载在 Apache 和 C++开发的服务器上。因为当时腾讯有蛮低的 ARPO 值(每用户平均收入),每个用户贡献的收入是很少的,所以我们需要每台服务器尽量能够带来更多的价值,能服务更多的用户,就需要在 Apache 上做大量的优化。比如说把它的多进程改成多线程,很多初始化能一次解决的就不要初始化多次、调用多次等等。


但是不管你怎么样做,总有点隔靴搔痒的感觉,你根本没办法做大幅度的优化,因为它的结构已经决定了这些问题的出现。


2009 年我到了思科之后,也遇到了同样问题,但我开始接触 Nginx,发现用 Nginx 改造服务器之后,它大概有 10 倍这样数量级的性能提升。但对于 Apache,你对架构本身没有办法做很大的变动了。这就是我通过实际经历想表达的第一点。

第二点:不能重复造轮子。

什么叫不能重复造轮子?


大概 2014 年,我在阿里 VBC 网络的时候,用因特尔的 DBDT 技术解决方案,做了一个叫 SDN 软件自定义网络。当时我突然发现,你做一些比如网络设备相关东西的时候,它的技术迭代非常慢,而且技术相对保守一些。


这个到底是为什么呐?我现在想明白了,就是我们在互联网背景下,技术是模块依赖的,比如我用 Nginx 来开发,Nginx 的模块都是开放的,我可以基于别人的模块做进一步的开发。别人在 不断迭代模块的之后,我可以享受到优化的好处,这就是所谓的“站在巨人的肩膀上”。


这也就是我想讲的:千万不要重复造轮子。如果 Nginx 能解决,或者说任何一个成熟的框架能解决问题的时候,不要再花时间自己做了。

第三点:还有好的架构。

什么叫好的架构?


我是 2012 年 10 月份去的阿里云,做了架构师。ECS 当时是两个月迭代一次版本,我们团队全年通宵了 23 次,花了两年时间,把线上的五万台服务器重构成一个新的架构,大概是一个月就可以做迭代。


好的架构真的很重要。Nginx 就是个好的架构。


好架构,就是你要有预见性。比如 TCP 协议,它在 1995 年的时候就创立出来了,到现在都没有大改,依旧服务了各种各样的场景。Nginx 也是一样,从 2014 年推出来后基本没多大变化。但它的模块化,是纵向的划分的架构,最底层是事件驱动,基于 EP 的事件驱动,再上面是 HTTP 框架,再上面是 HTTP 模块,再上面是 OpenResty 的 lua。再看横向的划分,比如说我们要做一些 WAF 防火墙的限制,又比如基于 IP 做白名单、黑名单,那它的模块划分很清楚,还比如其他的模块,像 linit 或者 Request 只负责限速,不会自己去获取到用户的真实 IP 再去限速等等。


所以,我说 Nginx 是一个好的架构,而我们学习 Nginx,也可以获取到非常好的架构思维。

我是怎么学 Nginx?

其实,我觉得大家比我幸运很多,现在可以找到很多 Nginx 的学习资料。但在我一开始学 Nginx 的时候,也就是 2009 年吧,网上可查的资料非常少,连英文资料还都只有一本书。我大概只看了一个 10 页教你怎么开发的文档,就开始跟着源码学了。


因为 09 年的时候我大概有五到六年的工作经验,已经形成了一套自己的知识体系,所以对着源码学习相对比较容易。Winter 老师在直播的时候也提到了,知识体系这个点,说我们不断地在学习新的知识点,会觉得很困难,这时候你一定要建立自己的知识体系架构。那知识体系架构最重要的是逻辑性、完备性。所谓的逻辑性,就是把一个新的知识点罗列到之前的知识树状结构中的能力。在《Nginx核心知识100讲》的课程中,你跟着我学,也能梳理出树状结构的知识框架。后续新的知识点,哪怕不是 Nginx,只要是 Web 服务器类的,你都可以归到这知识框架中。


在我看来,学习就是道与术的关系。

学习 Nginx 有哪些好书推荐?

我认为有三个知识点一定要学:


1、第一个知识就是 HTTP 学习,《HTTP 权威指南》是一本很好的书;


2、第二个是 TCP 协议一定要学习,因为 Nginx 在处理的是性能,所以我们一定要了解 TCP 协议。有一本书叫《TCP/IP 详解卷一:协议》,其实它有三卷,第二卷、第三卷比较长,大家如果没有时间就不要看了。但大家一定要看卷一,重点是看 TCP 协议,大概也就是八、九章的样子。


3、第三个是一定要了解 Linux 的内核。大定不要一听到内核就觉得好恐怖啊,推荐一本书叫《深入理解 Linux 内核》,这本书对于前端同学来说,就比较恐怖了,学起来会非常的吃力,甚至一些后端同学第一次学也会感到吃力。


我再推荐一本书,叫做《Lniux 内核设计与实现》,讲的是比较浅,但一定要从第一章开始看,从进程、内存开始讲。你大概看完一半的时候,就会对一套体系非常的熟悉了。


其实,如果你真的要学 Nginx 的话,我首要推荐的是一个英文网站:Nginx.org


虽然不是中文,但大家不要怕,因为网站上没有什么大段的内容,就是一个一个分析它的指令,大部分指令还是讲的很到位的。不过有些指令讲得也非常的浅,你也可以结合我的课程《Nginx 核心知识 100 讲》来学习,我会专门扩展去讲解一些指令。


但总而言之,对于 Nginx 学习者来说,吃透这个网站是很重要的。


第二个是 Nginx.com,就是 Nginx PLUS 那个官网,它有一个,那个中间有个叫 Blog,叫博客那栏,那里面有很多很好的文章,像关于 NginxPlus,的就不用管了,因为它是广告,它就像你买那个 Nginx Plusd。但 Nginx 又不开源,这个就比较糟糕,那种的就不用看,但是就是关于它的一些新的特性的,这个一定要好好看一看。


第三个就是我的书《深入理解 Nginx;模块开发与架构解析》。这本书主要讲的是模块开发,因为我当时工作要写模块开发,但市面上没有任何一本书来讲模块开发,于是就有了这本书。我为了讲清楚模块开发,又讲了一些架构的东西,这个是有参考意义的。但我建议大家一定要先看完《HTTP 权威指南》、《Linux 内核设计与实现》,再去看这本书,会更容易轻松一点。


最后就是源码一定要看。



《Nginx核心知识100讲》的第六部分课程中,我会有大概会有 10 节课去讲 OpenResty。结合了之前的 Nginx 基础架构、HTTP 模块、反向代理与负载均衡等学习,掌握 OpenResty 会很简单。OpenResty 的官网上有很多错误的,主要在 Github 上有些指令的错误。但因为你有之前的知识认知,你会发现 Github 上没有讲到的东西,你也会用。


Nginx 的知识架构也就是这四个点:HTTP 框架、进程架构、变量、Openresty。OpenResty 是我认为非常重要的一点。


戳我看直播原版视频。


2019-01-29 14:379464

评论 1 条评论

发布
用户头像
ARPU
2019-01-29 14:59
回复
没有更多了
发现更多内容

Redis 发布订阅,小功能大用处,真没那么废材!

楼下小黑哥

Java redis spring

译文|简明指南:Apache Pulsar 的分层存储

Apache Pulsar

开源 云原生 存储分离 Apache Pulsar 消息中间件

c++杂谈-1

菜鸟小sailor 🐕

c++

船长梁晓玲的猎鹰号真的能赚钱嘛?不分析不知道……

成周

心理学 船长梁晓玲 诈骗

看动画学算法之:排序-count排序

程序那些事

动画 看动画学算法 看动画学数据结构 count排序

一个草根的日常杂碎(9月22日)

刘新吾

生活 随笔 记录

第6周作业

方堃

众盟科技2020智能化白皮书:穿越新商业周期,读懂商业智能化的真义

脑极体

救人于无形的“环境智能”,到底是一种什么智能?

脑极体

甲方日常 20

句子

工作 随笔杂谈 日常 Java 25 周年

网站日志分析最完整实践

MySQL从删库到跑路

一夜爆火,只因阿里内部作为参考的SpringBoot巅峰之作git开源

小Q

Java 架构 面试 微服务 springboot

微前端qiankun从搭建到部署的实践

fengxianqi

大前端 微应用

判断一个请求是否是Ajax异步请求

麦洛

ajax

分布式高并发下Actor模型如此优秀

架构师修行之路

系统设计 reactor 高并发

架构师训练营第 1 期 -week2

习习

架构师训练营 - 第 2 周课后作业(1 期)

阿甘

超越色彩的魅力:读《黑白适界》

北风

艺术 摄影 黑白 摄影征文 画册

高并发下为什么更喜欢进程内缓存

架构师修行之路

缓存 架构设计

架构师训练营 1 期第 2 周:框架设计 - 作业

piercebn

极客大学架构师训练营

Spring系列之新注解配置+Spring集成junit+注解注入

Java spring 微服务 架构师

架构师训练营 - 第 2 周学习总结(1 期)

阿甘

添加字幕哪个视频剪辑软件比较简单?

奈奈的杂社

视频创作 视频剪辑 视频后期 自媒体 后期字幕

第7周作业

Vincent

极客时间 极客大学

第7周的总结

Vincent

极客时间 极客大学

响应式编程到底是什么?

博文视点Broadview

Java 响应式 响应式编程 reactor 并发

第2周

Geek_fabd84

架构师训练营第 1 期 第 1 周作业

李循律

时空碰撞优化系列·二

誓约·追光者

hive Sparksql 计算效率 优化

LeetCode题解:145. 二叉树的后序遍历,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

oeasy 教您玩转 linux 010400 总结 summary

o

Nginx 学习书单整理_语言 & 开发_陶辉_InfoQ精选文章