定義在 src\http\ngx_http_core_module.h?
typedef struct {ngx_array_t servers; /* ngx_http_core_srv_conf_t */ngx_http_phase_engine_t phase_engine;ngx_hash_t headers_in_hash;ngx_hash_t variables_hash;ngx_array_t variables; /* ngx_http_variable_t */ngx_array_t prefix_variables; /* ngx_http_variable_t */ngx_uint_t ncaptures;ngx_uint_t server_names_hash_max_size;ngx_uint_t server_names_hash_bucket_size;ngx_uint_t variables_hash_max_size;ngx_uint_t variables_hash_bucket_size;ngx_hash_keys_arrays_t *variables_keys;ngx_array_t *ports;ngx_http_phase_t phases[NGX_HTTP_LOG_PHASE + 1];
} ngx_http_core_main_conf_t;
**`ngx_http_core_main_conf_t` 結構體是 Nginx HTTP 核心模塊的主配置結構體,負責存儲全局配置信息和運行時數據。**
---
### **1. `servers`(虛擬主機列表)**
- **類型**:`ngx_array_t`(元素類型為 `ngx_http_core_srv_conf_t`)
- **作用**:存儲所有 `server{}` 塊的配置。
- **邏輯**:每個 `server{}` 塊對應一個虛擬主機配置(`ngx_http_core_srv_conf_t`),通過動態數組管理。
- **意義**:Nginx 根據請求的 `Host` 頭或 IP 地址,從 `servers` 中匹配目標虛擬主機。---
### **2. `phase_engine`(階段引擎)**
- **類型**:`ngx_http_phase_engine_t`
- **作用**:管理請求處理的階段引擎。
- **邏輯**:包含各階段的處理函數鏈表(如 `NGX_HTTP_CONTENT_PHASE`),在請求處理時按階段依次調用。
- **意義**:實現 Nginx 的多階段處理流程(如重寫、訪問控制、內容生成),模塊可注冊自己的處理函數到特定階段。---
### **3. `headers_in_hash`(請求頭哈希表)**
- **類型**:`ngx_hash_t`
- **作用**:快速查找 HTTP 請求頭。
- **邏輯**:將常用請求頭(如 `Host`、`User-Agent`)的名稱哈希化,加速請求頭解析。
- **意義**:優化請求頭的查找效率,減少字符串比較開銷。---
### **4. `variables_hash`(變量哈希表)**
- **類型**:`ngx_hash_t`
- **作用**:存儲所有 Nginx 變量(如 `$uri`、`$args`)。
- **邏輯**:變量名通過哈希表快速定位,值在運行時動態解析。
- **意義**:支持高效變量訪問,用于配置中的條件判斷和動態內容生成。---
### **5. `variables` 和 `prefix_variables`(變量列表)**
- **類型**:`ngx_array_t`(元素類型為 `ngx_http_variable_t`)
- **作用**:
? - `variables`:存儲所有顯式定義的變量(如 `set $var "value"`)。
? - `prefix_variables`:存儲前綴變量(如 `$arg_`、`$cookie_`),根據前綴動態生成值。
- **邏輯**:變量在配置解析時注冊到這兩個數組中。
- **意義**:支持變量的動態管理和快速訪問。---
### **6. `ncaptures`(正則捕獲組數量)**
- **類型**:`ngx_uint_t`
- **作用**:記錄正則表達式匹配時的最大捕獲組數量。
- **邏輯**:在解析 `location` 或 `if` 塊中的正則表達式時,更新此值。
- **意義**:確保捕獲組索引(如 `$1`、`2`)的合法性,避免越界訪問。---
### **7. `server_names_hash_*`(虛擬主機哈希參數)**
- **字段**:
? - `server_names_hash_max_size`:哈希表最大容量。
? - `server_names_hash_bucket_size`:哈希表桶大小。
- **作用**:優化虛擬主機名的查找效率。
- **邏輯**:根據 `server_name` 配置生成哈希表,參數由 `server_names_hash_*` 指令設置。
- **意義**:加速基于 `Host` 頭的虛擬主機匹配。---
### **8. `variables_hash_*`(變量哈希參數)**
- **字段**:
? - `variables_hash_max_size`:變量哈希表最大容量。
? - `variables_hash_bucket_size`:變量哈希表桶大小。
- **作用**:優化變量查找的哈希表性能。
- **邏輯**:參數由 `variables_hash_*` 指令配置,影響哈希表的沖突率和內存占用。
- **意義**:平衡內存使用和變量訪問速度。---
### **9. `variables_keys`(變量鍵數組)**
- **類型**:`ngx_hash_keys_arrays_t*`
- **作用**:輔助構建變量哈希表的鍵數組。
- **邏輯**:在配置解析階段收集所有變量名,生成哈希鍵列表。
- **意義**:確保變量哈希表的高效構建和沖突管理。---
### **10. `ports`(監聽端口列表)**
- **類型**:`ngx_array_t*`
- **作用**:存儲所有監聽的端口和地址(如 `listen 80`)。
- **邏輯**:每個元素為 `ngx_http_conf_port_t`,包含端口、地址和對應的 `server{}` 配置。
- **意義**:優化請求路由,快速匹配監聽套接字。---
### **11. `phases`(處理階段數組)**
- **類型**:`ngx_http_phase_t[NGX_HTTP_LOG_PHASE + 1]`
- **作用**:存儲每個處理階段的配置。
- **邏輯**:數組索引為階段類型(如 `NGX_HTTP_CONTENT_PHASE`),每個元素包含該階段的處理函數鏈。
- **意義**:在配置解析時收集各模塊的處理函數,最終由 `phase_engine` 整合為運行時引擎。