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 是我認為非常重要的一點。
戳我看直播原版視訊。