Nginx源碼目錄結構
.
├── auto 自動檢測系統環境以及編譯相關的腳本
│ ├── cc 關于編譯器相關的編譯選項的檢測腳本
│ ├── lib nginx編譯所需要的一些庫的檢測腳本
│ ├── os 與平台相關的一些系統參數與系統調用相關的檢測
│ └── types 與資料類型相關的一些輔助腳本
├── conf 存放預設配置檔案,在make install後,會拷貝到安裝目錄中去
├── contrib 存放一些實用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放預設的網頁檔案,在make install後,會拷貝到安裝目錄中去
├── man nginx的man手冊
└── src 存放nginx的源代碼
├── core nginx的核心源代碼,包括常用資料結構的定義,以及nginx初始化運作的核心代碼如main函數
├── event 對系統事件處理機制的封裝,以及定時器的實作相關代碼
│ └── modules 不同僚件處理方式的子產品化,如select、poll、epoll、kqueue等
├── http nginx作為http伺服器相關的代碼
│ └── modules 包含http的各種功能子產品
├── mail nginx作為郵件代理伺服器相關的代碼
├── misc 一些輔助代碼,測試c++頭的相容性,以及對google_perftools的支援
|—— stream nginx支援傳輸層的 協定:如TCP、UDP協定,UNINX域socket。這個子產品是在nginx1以後版本才有的。
└── os 主要是對各種不同體系統結構所提供的系統函數的封裝,對外提供統一的系統調用接口。
Nginx子產品的類型
關于這個分類,大家各說風雲:
- 1.
搭建 獨立于作業系統的事件處理機制的架構,以及 提供各種具體事件的處理。包括event module:
等。nginx 具體 使用何種事件處理 子產品,這 很大依賴具體的作業系統和編譯選項。ngx_events_module,ngx_event_core_module,ngx_epoll_module
- 2.
此類型子產品也被直接稱為phase handler:
子產品,主要負責處理用戶端請求并産生待響應的内容,比如handler
子產品,負責用戶端的靜态頁面請求處理并将對應的磁盤 檔案準備為響應内容輸出。ngx_http_static_moduler
- 3.
也稱為output filter:
子產品,主要 負責處理輸出的内容,包括修改輸出内容,可以實作對輸出的所有的 html的 頁面添加 預定義的footbar一類的工作,或者對輸出的 圖檔的URL進行替換的 工作。filter
- 4.
upstream子產品實作反向代理,将真正的請求 轉發到伺服器上,并 從後端伺服器上讀取響應,發回用戶端。upstream:
子產品 是一種特殊的upstream
,隻不過響應内容也不是真正由自己産生的,而是從後端伺服器上讀取的。handler
- 5.
負載均衡子產品,實作特定的 算法,在 衆多的後端 伺服器中,選擇一個伺服器出來作為某個請求的轉發伺服器。load-balancer:
配置子產品的設計
配置子產品是所有 子產品的基礎,它實作了最基本的配置項 的解析功能(也就是解析 nginx.conf)
核心子產品的類型是
ngx_core_module
核心 子產品的定義
typedef struct {
ngx_str_t name; //核心子產品名稱
void *(*create_conf)(ngx_cycle_t *cycle); //解析配置項前,Nginx架構會調用create_conf方法
char *(*init_conf)(ngx_cycle_t *cycle, void *conf); //解析配置項後,Nginx架構會調用init_conf方法
} ngx_core_module_t;
Nginx子產品的加載
- 1.Nginx子產品 是 被編譯進入Nginx,并不像Apache那樣去編譯一個so檔案,在配置裡面指定是否加載。
- 2.解析配置檔案時,Nginx的各個子產品都有機會去接手處理某個請求,但是URL請求的子產品隻能有一個 。
- 3.Nginx啟動時架構的處理流程 建議對比這篇部落格一起看Ngnix 的代碼分析