nginx的優秀除了體如今程序結構以及代碼風格上,nginx的源碼組織也一樣簡潔明瞭,目錄結構層次結構清晰,值得咱們去學習。nginx的源碼目錄與nginx的模塊化以及功能的劃分是緊密結合,這也使得咱們能夠很方便地找到相關功能的代碼。html
下面是nginx源碼的目錄結構: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的支持 └── os 主要是對各類不一樣體系統結構所提供的系統函數的封裝,對外提供統一的系統調用接口
對於上面src文件夾,輸出結果顯示有 6 個目錄文件,如下是這些目錄文件的功能:c++
下面主要針對重要的三個目錄進行簡單的介紹:core 目錄、http 目錄、event 目錄。正則表達式
一、core 核心模塊結構服務器
core 目錄中的源碼定義了 Nginx 服務器最基本的數據結構以及最基本的核心模塊(核心模塊爲其餘模塊提供了公共調用的基本功能)。首先看下該核心模塊的源碼結構:網絡
實現對各模塊的總體控制,是 Nginx 程序 main 函數 ├── nginx.c ├── nginx.h 如下是基本數據結構及其操做 ├── ngx_array.c ├── ngx_array.h ├── ngx_hash.c ├── ngx_hash.h ├── ngx_list.c ├── ngx_list.h ├── ngx_queue.c ├── ngx_queue.h ├── ngx_radix_tree.c ├── ngx_radix_tree.h ├── ngx_rbtree.c ├── ngx_rbtree.h ├── ngx_output_chain.c ├── ngx_buf.c ├── ngx_buf.h 整個Nginx 模塊構架基本配置管理 ├── ngx_conf_file.c ├── ngx_conf_file.h ├── ngx_config.h 網絡鏈接管理 ├── ngx_connection.c ├── ngx_connection.h 定義一些頭文件與結構別名 ├── ngx_core.h ├── ngx_cpuinfo.c CRC 校驗表信息 ├── ngx_crc32.c ├── ngx_crc32.h ├── ngx_crc.h 實現對系統運行過程參數、資源的通用管理 ├── ngx_cycle.c ├── ngx_cycle.h 實現文件讀寫相關的功能 ├── ngx_file.c ├── ngx_file.h socket 網絡套接字功能 ├── ngx_inet.c ├── ngx_inet.h 實現日誌輸出、管理的相關功能 ├── ngx_log.c ├── ngx_log.h ├── ngx_syslog.c ├── ngx_syslog.h hash字符串操做 ├── ngx_md5.c ├── ngx_md5.h ├── ngx_murmurhash.c ├── ngx_murmurhash.h 內存管理相關文件 ├── ngx_open_file_cache.c ├── ngx_open_file_cache.h ├── ngx_palloc.c ├── ngx_palloc.h ├── ngx_shmtx.c ├── ngx_shmtx.h ├── ngx_slab.c ├── ngx_slab.h PCRE 上層封裝 ├── ngx_parse.c ├── ngx_parse.h 反向代理的協議信息 ├── ngx_proxy_protocol.c ├── ngx_proxy_protocol.h 實現支持正則表達式 ├── ngx_regex.c ├── ngx_regex.h 字符串處理功能 ├── ngx_string.c ├── ngx_string.h 時間獲取與管理功能 ├── ngx_times.c └── ngx_times.h 其餘文件 ├── ngx_resolver.c ├── ngx_resolver.h ├── ngx_sha1.h ├── ngx_spinlock.c ├── ngx_crypt.c ├── ngx_crypt.h
二、event 事件驅動模型結構數據結構
event 目錄裏面包含一種子目錄 module 以及一些文件,除了 module 子目錄,其餘文件提供了事件驅動模型相關數據結構的定義、初始化、事件接收、傳遞、管理功能以及事件驅動模型調用功能。module 子目錄裏面的源碼實現了Nginx 支持的事件驅動模型:AIO、epoll、kqueue、select、/dev/poll、poll 等事件驅動模型;socket
.
├── modules │ ├── ngx_aio_module.c AIO 事件驅動模型 │ ├── ngx_devpoll_module.c dev/poll 事件驅動模型 │ ├── ngx_epoll_module.c epoll 事件驅動模型 │ ├── ngx_eventport_module.c 事件驅動模型端口 │ ├── ngx_kqueue_module.c kqueue 事件驅動模型 │ ├── ngx_poll_module.c poll 事件驅動模型 │ ├── ngx_rtsig_module.c rtsing 事件驅動模型 │ ├── ngx_select_module.c Linux 平臺下的 select 事件驅動模型 │ └── ngx_win32_select_module.c Win32 平臺下的 select 事件驅動模型 ├── ngx_event_accept.c ├── ngx_event_busy_lock.c ├── ngx_event_busy_lock.h ├── ngx_event.c ├── ngx_event_connect.c ├── ngx_event_connect.h ├── ngx_event.h ├── ngx_event_mutex.c ├── ngx_event_openssl.c ├── ngx_event_openssl.h ├── ngx_event_openssl_stapling.c ├── ngx_event_pipe.c ├── ngx_event_pipe.h ├── ngx_event_posted.c ├── ngx_event_posted.h ├── ngx_event_timer.c └── ngx_event_timer.h 1 directory, 26 files
三、http 模塊結構模塊化
http 目錄和 event 目錄同樣,通用包含了模塊實現源碼的 module 目錄文件以及一些結構定義、初始化、網絡鏈接創建、管理、關閉,以及數據報解析、服務器組管理等功能的源碼文件。module 目錄文件實現了HTTP 模塊的功能。函數
.
├── modules ├── ngx_http_busy_lock.c ├── ngx_http_busy_lock.h ├── ngx_http.c ├── ngx_http_cache.h ├── ngx_http_config.h ├── ngx_http_copy_filter_module.c ├── ngx_http_core_module.c ├── ngx_http_core_module.h ├── ngx_http_file_cache.c ├── ngx_http.h ├── ngx_http_header_filter_module.c ├── ngx_http_parse.c ├── ngx_http_parse_time.c ├── ngx_http_postpone_filter_module.c ├── ngx_http_request_body.c ├── ngx_http_request.c ├── ngx_http_request.h ├── ngx_http_script.c ├── ngx_http_script.h ├── ngx_http_spdy.c ├── ngx_http_spdy_filter_module.c ├── ngx_http_spdy.h ├── ngx_http_spdy_module.c ├── ngx_http_spdy_module.h ├── ngx_http_special_response.c ├── ngx_http_upstream.c ├── ngx_http_upstream.h ├── ngx_http_upstream_round_robin.c ├── ngx_http_upstream_round_robin.h ├── ngx_http_variables.c ├── ngx_http_variables.h └── ngx_http_write_filter_module.c 1 directory, 32 files
四、Nginx 源碼的模塊化結構
根據各模塊的功能,可把 Nginx 源碼劃分爲如下幾種功能,以下圖所示:
本文參考自:
https://www.kancloud.cn/digest/understandingnginx/202599
http://tengine.taobao.org/book/chapter_09.html