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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章