如何高效的學習Nginx源碼,汲取養分?

之前學習過stl源碼,在很大程度上倚仗了侯捷《stl源碼剖析》一書的指導和解惑,學習方式是一邊看書一邊看源碼,收穫非常大。但是nginx這邊沒有找到較好較完整的源碼剖析書籍,只有一些零零碎碎的相關博客,硬看源碼感到很吃力,故產生此疑惑,希望能得到大家的建議~


可以看一下我們團隊在編寫的開源書籍,裡面介紹了nginx的實現,可以參考一下:

http://tengine.taobao.org/book/

另外,有問題也可以到我們的郵件列表上問:

http://code.taobao.org/mailman/listinfo/tengine-cn

另外我幾年前還寫過一個介紹的ppt:

http://www.slideshare.net/joshzhu/nginx-internals


除了sudo老師講的那些外,還有一個比較好的資源是agentzh的OpenResty項目。

OpenResty是一個nginx lua擴展,其作者對nginx非常熟悉,也是很多模塊的貢獻者。

去看看這個openresty/lua-nginx-module · GitHub,它的文檔其實能闡述nginx的幾個PHASE是怎麼聯繫在一塊的,當然你要先大概知道ngx的11個PHASE。

OpenResty還有一個很重要的東西,往往其他資料不會涉及:Profiling。比如這個 openresty/stapxx · GitHub。這是相關的使用介紹:OpenResty - a fast web app server by extending nginx

OpenResty的google group是非常友好的一個社區,基本去正確的問問題都能得到很好的回答,agentzh在社區裡面非常熱心,幾乎所有的ngx問題都能得到清晰解釋,當然問之前先搜索下。

看代碼最好能先知道函數調用過程,你可以用systemtap(stapxx就是封裝這個),這比去源代碼里沿著路徑找要方便的多,比如要看ngx在一個req下的調用過程:

// show_one_req.stap
probe process("/home/xxx/.local/openresty/nginx/sbin/nginx").function("ngx_http_*") {
printf("%s -&> %s
", thread_indent(4), probefunc());
}

probe process("/home/xxx/.local/openresty/nginx/sbin/nginx").function("ngx_http_*").return {
printf("%s &<- %s ", thread_indent(-4), probefunc()); }

然後`sudo stap show_one_req.stap -x NGX_WORKER_PID -v`,然後對ngx做一次請求,就能很清晰的看到調用層次,和靜態分析完全不同,這是最真實的執行過程。你也可以probe ngx在啟動時的函數調用,就不舉例了。

知道了調用順序後,剩下的就是ngx的幾個數據結構了,這個可以參考taobao的那本書。

之所以能用systemtap,也是因為ngx的代碼結構都體現在函數名上了,像 `ngx_http_MODULE-NAME` 之類的,非常適合systamtap probe

BTW:

這是agentzh的幾個關於ngx配置指令執行順序的blog: agentzh_新浪博客,可以避免踩坑,ngx配置其實不是一門語言,剛開始可能會誤以為配置項的順序是執行順序。

BTW 2:

這也是一個很好的blog系列:nginx discovery journey


我最近就在閱讀Nginx方面的代碼,推薦2013年4月剛出的&<深入理解Nginx&>和1樓叔度前輩提到的Nginx開發從入門到精通,兩本書的味道不一樣,前者更側重講解代碼邏輯這塊的知識,後者則會更多得結合實踐來分析代碼,特別會給出實際生產環境中用到的具體配置信息.如果把第二本書和第一本書結合起來來看Nginx代碼的話,你會發現第二本書時不時得會給你帶來很多驚喜,兩者之間取長補短


《深入理解Nginx》這本書不適合新手用,菜鳥剛開始要有個示例(完整的包括步驟),不然還是一頭霧水,不知道從哪入手,連寫的代碼保存路徑都不知道,。。。不知道哪位大神有辦法可以逐步入門。。????我就是這個菜鳥。。


我的建議是早期的nginx源代碼看起。現在的nginx源代碼已經超過了16萬行的代碼量,而早期的nginx源代碼僅僅4萬多行。這樣可以對框架的流程更加明確。


很多時候大家都會推薦你去多用點Nginx,先熟悉配置功能,還可以加入腳本語言例如lua perl,進行二次開發,其實看代碼希望大家都用想像力和帶疑問去看,例如Nginx配置文件,如果你自己實現要如何解析?為何不用傳統的文法處理,內存開銷,肯定需要內存池,C寫的字元串 ,整數,哈希,一般來說都自己再封裝,模塊指令執行優先是如何處理?敲一下ps -ef ,為何Nginx會開,主進程,子進程,如何劃分功能,http 狀態有多少個,自動機如何 處理?,自己先構建一個簡單流程,再去看某些思想和作者都是差不多


Visual Studio可以編譯的nginx~ 應該非常有幫助~

GitHub - topcpporg/nginx_vs: 可使用vs直接編譯的nginx


有個nginx源碼注釋

開源代碼解讀 貌似剛弄的,可以看看


建議從需求入手,可以先通過API編寫一些簡單的模塊,由淺至深。開源的東西不好說,個人感覺一般的出版物對於開源的東東信息量不如論壇和Wiki實在。


感覺對比一樓的推薦《深入理解nginx》更好些,一般多看幾遍每次收穫都不一樣,做好服務端開發的覺悟,和linux系統融合才是渾然一體,推薦看《深入理解nginx》,方便以後在linux上開發其他系統,尤其是事件機制帶來的一種解決方案


如果是用來分析源碼的話,就看看《深入理解Nginx》吧,這本書會很細緻的分析各個核心模塊的代碼。可惜暫無電子版,所以只能去買紙質書了,挺貴。另外,再給一個建議,分析源碼的時候也可以適當嘗試去使用一下Nginx,這樣可以加深對於Nginx本身的理解。

當然,@叔度 團隊編寫的開源書籍很早之前我就關注了。事實上,我也是藉助這個入Nginx門的。

相比《深入理解Nginx》而言,這本書更像是@叔度 團隊在工作中的經驗總結,適合細細品味。


個人感覺,還是看陶輝的《深入理解nginx》,然後看代碼,外加debug調試,個別函數的demo編寫之類的,死摳代碼是免不了的,因為掌握知識的過程沒有捷徑。


《深入理解Nginx》這本書強烈推薦,最近在看一些關於架構方面的東西。

雖然我不是做web 開發的,但是裡面很多服務端架構知識都講解的非常深入。

比如事件模塊會講到 Linux 的 epoll 機制如何提高並發量,事件驅動框架的原理,非同步IO的特性等等,甚至還結合了TCP 講解(好像第二版才有)。

其次還有很多高級數據結構,包括鏈表,紅黑樹,動態數組的實現,定時器的實現等等。

當然是需要一些Linux 服務端知識基礎的。不過可以順著裡面的知識點區自行擴展。


最近也有一種衝動想好好看看nginx的源代碼,每人都有不同的學習方式;更談不上有什麼捷徑了,還是靜下心來好好的苦讀代碼吧,一切都是浮雲!


我現在也在看nginx方面東西。感覺章亦春

寫的nginx配置方面資料挺好的,對lua和nginx的結合如魚得水。比較容易入門。叔度的是源碼架構剖析方面的,正在看,對網路編程與代碼優化很有啟發。


推薦閱讀:

為什麼說goto是一種不好的用法?
如何用 C 語言畫一個「聖誕樹」?
如何評價C# 6的這個新特性?
怎樣減輕程序中 if 語句的依賴?
遊戲中的隨機地圖是如何保存的?

TAG:程序員 | 編程 | C編程語言 | Nginx | 源碼閱讀 |