原始碼分析是乙個逐步取精的過程,最開始是乙個大概了解的過程,各種認識不會太深刻,但是把這些真實的感受也記錄下來,覺得挺有意思的,可能有些認識是片面或者是不正確的,但可以通過後面更深入細緻的分析過程,不斷的糾正錯誤和深化理解。原始碼分析是乙個過程,經驗是逐步累積起來的,希望文字可以把這種累積的感覺也準確記錄下來。
現在就看看對nginx原始碼的第一印象吧。
原始碼包解壓之後,根目錄下有幾個子目錄和幾個檔案,最重要的子目錄是auto和src,最重要的檔案是configure指令碼,不同於絕大多數的開源**,nginx的configure指令碼是作者手工編寫的,沒有使用autoconf之類的工具去自動生成,configure指令碼會引用auto目錄下面的指令碼檔案來幹活。根據不同的用途,auto目錄下面的指令碼各司其職,有檢查編譯器版本的,有檢查作業系統版本的,有檢查標準庫版本的,有檢查模組依賴情況的,有關於安裝的,有關於初始化的,有關於多執行緒檢查的等等。configure作為乙個總驅動,呼叫這些指令碼去生成版本資訊標頭檔案、預設被包含的模組的宣告**和makefile檔案,版本資訊標頭檔案(ngx_auto_config.h,ngx_auto_headers.h)和預設被包含的模組的宣告**(ngx_modules.c)被放置在新建立的objs目錄下。要注意的是,這幾個生成的檔案和src下面的源**一樣重要,對於理解原始碼是不可忽略的重要部分。
src是原始碼存放的目錄,configure建立的objs/src目錄是用來存放生成的.o檔案的,注意區分一下。
src按照功能特性劃分為幾個部分,對應著是幾個不同的子目錄。
src/core存放著主幹部分、基礎資料結構和基礎設施的原始碼,main函式在src/core/nginx.c中,這是分析原始碼的乙個很好的起點。
src/event存放著事件驅動模型和相關模組的原始碼。
src/http存放著http server和相關模組的原始碼。
src/mail存放著郵件**和相關模組的原始碼。
src/misc存放著c++相容性測試和google perftools模組的原始碼。
src/os存放著依賴於作業系統實現的原始碼,nginx啟動過程中最重要的master和workers建立**就在這個目錄下,多少讓人覺得有點意外。
nginx的實現中有非常多的結構體,一般命名為ngx_***_t,這些結構體分散在許多標頭檔案中,而在src/core/ngx_core.h中把幾乎所有的標頭檔案都集合起來,所有的實現檔案都會包含這個ngx_core.h標頭檔案,說nginx的各部分原始碼耦合厲害就是這個原因,但實際上nginx各個部分之間邏輯上是劃分的很清晰的,整體上是一種鬆散的結構。nginx實現了一些精巧的基礎資料結構,例如ngx_string_t,ngx_list_t,ngx_array_t,ngx_pool_t,ngx_buf_t,ngx_queue_t,ngx_rbtree_t,ngx_radix_tree_t等等,還有一些重要的基礎設施,比如log,configure file,time等等,這些資料結構和基礎設施頻繁的被使用在許多地方,這會讓人感覺nginx邏輯上的聯絡比較緊密,但熟悉了這些基礎資料結構的實現**就會感覺到這些資料結構都是清晰分明的,並沒有真正的耦合在一起,只是有些多而已,不過nginx中「家釀」的**也正是它的乙個很明顯的亮點。
nginx是高度模組化的,可以根據自己的需要定製模組,也可以自己根據一定的標準開發需要的模組,已經定製的模組會在objs/ngx_modules.c中宣告,這個檔案是由configure生成的。
nginx啟動過程中,很重要的一步就是載入和初始化模組,這是在ngx_init_cycle中完成的,ngx_init_cycle會呼叫模組的hook介面(init_module)對模組初始化,ngx_init_cycle還會呼叫ngx_open_listening_sockets初始化socket,如果是多程序方式啟動,就會呼叫ngx_master_process_cycle完成最後的啟動動作,ngx_master_process_cycle呼叫ngx_start_worker_processes生成多個工作子程序,ngx_start_worker_processes呼叫ngx_worker_process_cycle建立工作內容,如果程序有多個子執行緒,這裡也會初始化執行緒和建立執行緒工作內容,初始化完成之後,ngx_worker_process_cycle會進入處理迴圈,呼叫ngx_process_events_and_timers,該函式呼叫ngx_process_events監聽事件,並把事件投遞到事件佇列ngx_posted_events中,最終會在ngx_event_thread_process_posted中處理事件。
事件機制是nginx中很關鍵的乙個部分,linux下使用了epool,freebsd下使用了kqueue管理事件。
nginx 原始碼分析
近期準備研究一下nginx原始碼,此處記錄一下。計畫 1 了解evan miller 的文章 2 了解nginx的組織架構 3 了解nginx的基本資料結構 4 熟悉nginx的主要module及執行機制,主要是core http event os 5 簡單的module開發及測試 一 準備 為了方...
nginx原始碼分析 從原始碼看nginx框架總結
nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...
Notepad 原始碼概覽
自 資料夾 cursors 是滑鼠手勢 icons 是一些圖示 misc 包括一些工具,比如crc,異常的實現,程序的封裝等等 scitillacomponent 是乙個重要的資料夾,裡面包含了對scitilla控制項的封裝,是我參考使用scitilla的主要地方,不過裡面的檔案的確很多 tinyx...