学习《apache源代码全景分析》之模块化体系结构摘录
1.Apache1.3系列的模塊結構如下:
?Apache 2.0模塊構成部分如下:
??
2.Apache核心和模塊的交互示意圖:
? ?
? 核心模塊必須與非核心模塊進行交互,目前有兩種交互方式.
? ?(1) 核心模塊通過調用注冊的模塊處理句柄實現與模塊的交互。
? ?(2) 非核心模塊也可以調用各種API服務和修改各種重要的數據結構。
3.掛鉤可以理解就是可以映射為Apache的HTTP請求過程中的某一個階段。
4.module結構是整個模塊化體系結構的核心部分,定義在http_config.h中:
typedef struct module_struct module; struct module_struct {int version;int minor_version;int module_index;const char *name;void *dynamic_load_handle;struct module_struct *next;unsigned long_magic;void (*rewrite_args)(process_rec *process);void *(*create_dir_config)(apr_pool_t *p, char *dir);void *(*merge_dir_config)(apr_pool_t *p, void *base_conf, void *new_conf);void *(*create_server_config)(apr_pool_t *p, server_rec *s);void *(*merge_server_config)(apr_pool_t *p, void *base_conf, void *new_conf);const command_rec *cmds;void (*register_hooks)(apr_pool_t *p); };5.Apache中模塊分為兩種:靜態模塊和動態模塊。
? ap_preloaded_modules[]稱為預裝載模塊數組,定義了所有Apache中默認的靜態編譯的模塊。代碼如下:
module *ap_preloaded_modules[] = {&core_module,&mpm_netware_module,&http_module,&so_module,&mime_module,......NULL };? ?ap_prelinked_modules[]稱為預鏈接模塊數組,定義了所有在Apache中默認并在Apache啟動后處于“激活”狀態的模塊,定義簡化如下:
module *ap_prelinked_module[] = {&core_module,&mpm_netware_module,&http_module,&so_module,&mime_module,......NULL };? ?ap_loaded_modules數組用來保存所有的已經被裝入的模塊,包括默認的和第三方的,激活的和非激活的。
? ?ap_top_modules鏈表用于保存Apache中所有被激活模塊的module機構,包括默認的激活模塊和激活的第三方模塊。
? ?ap_loaded_modules、ap_prelinked_modules、ap_preloaded_modules、ap_top_modules及動態加載模塊之間的相互包含關系如下:
6.模塊靜態加載函數調用層次
? ?
7.Apache在處理配置文件的過程中一旦遇到LoadModule指令,它將遍歷整個模塊鏈表即ap_top_modules,查找能夠處理該指令的模塊及相應的處理句柄。
? 7.1 動態模塊加載
static const char *load_module(cmd_parms *cmd, void *dummy,const char *modname, const char *filename)? ?該函數用來將共享對象載入到服務器的地址空間中。
? ?如果指定的模塊沒有被加載,那么函數將執行加載。一切檢查完畢后,函數將對模塊進行加載,加載分為兩步:
? ?(1) 在module_so模塊中保存當前新載入的模塊信息。
? ?(2) 調用apr_dso_load將文件載入到Apache的地址空間中,同時調用apr_dso_sym獲取動態庫中的module結構,返回的結構保存在modsym中。如果加載的是合法的Apache 2.0模塊,函數將立即調用ap_add_loaded_module將模塊激活,所謂的激活無非就是將模塊放入ap_top_modules鏈表中。
? ? ? 此外,Apache還需要在配置內存池pconf中注冊cleanup函數。這樣,當我們重新啟動或關閉服務器時,cleanup函數將自動調用并將共享模塊卸載。
? ?7.2 模塊卸載
? ? ? ?實際的模塊卸載由ap_remove_loaded_module函數完成。
8. ap_mod_list機構:
typedef struct ap_mod_list_struct ap_mod_list; struct ap_mod_list_struct {struct ap_mod_list_struct *next;module *m;const command_rec *cmd; };? ? ?m指向所有的模塊結構,cmd則指向該模塊內部的某個指令,之所以使用指針,是為了避免復制。這些結構之間形成鏈表,這樣下次查找的時候只需要一次遍歷ap_mod_list鏈表即可,這個哈希表可以用下圖描述:
? ??
9.模塊與掛鉤之間的關系
??
? ?掛鉤通常由Apache核心觸發。當調用某個掛鉤時,Apache核心將逐一遍歷所有的模塊,檢查該模塊是否注冊了該掛鉤,如果注冊了,則調用該掛鉤函數進行相應的處理;如果沒有注冊,則繼續查找下一個模塊,直到最后一個模塊為止。
? 通常掛鉤調用函數形式: ap_run_hookname();
10.啟動和初始化掛鉤
? ? ?包括pre_config、post_config、open_logs及child_init四種,在整個系統中的位置如下圖所示:
? ? ?
?11.連接階段掛鉤
? ? ?包括三種:create_connection、pre_connection及process_connection,如下圖:
? ??
12.Keep-alive循環中的掛鉤
? ? 主要有兩個:create_request和post_read_request.在整個請求處理中的位置如下圖所示:
? ??
13.請求處理掛鉤
? ? ?
? ? 如上圖所示,第一步主要的任務就是解析URI,將其映射為磁盤上的具體文件,對應的掛鉤包括:translate_name、map_to_storage及header_parser;第二步主要是授權認證,判斷用戶是否具有足夠的訪問資源權限,此步驟對應的掛鉤包括access_checker、check_user_id及auth_checker;最后一步對應的是響應內容生成,該步驟對應的掛鉤包括type_checker、fixups、insert_filter及handler四種。
14.為了解決模塊間通信的問題,Apache中提供了幾種方式。
? ?(1) 簡單的通過request_rec結構進行數據傳遞和通信;
? ?(2) 導出可選函數供其余的模塊調用;
? ?(3) 通過提供者API供其余模塊調用。
15.常用模塊
| 緩存模塊 | mod_cache | 可以用于服務器本地的緩存,也可以用于代理服務器的代理緩存 |
| mod_disk_cache | 提供了基于磁盤的存儲管理系統 | |
| mod_mem_cache | 作為mod_cache的輔助模塊工作 | |
| mod_file_cache | 文件描述符緩存支持 | |
| htcacheclean | --- | |
| URL映射模塊 | mod_alias | 提供簡單的從文件系統的不同部分到文檔樹的映射和URL重定向的功能 |
| mod_rewrite | 提供了一個基于正則表達式分析器的重寫引擎來實時重寫URL請求 | |
| mod_userdir | 此模塊允許使用類似http://example.com/~user/的語法來訪問用戶網站目錄 | |
| mod_vhost_alias | 提供大批量虛擬主機的動態配置支持。 | |
| 內容生成模塊 | mod_actions | 此模塊有兩個指令:Action指令讓你可以在對特定MIME類型文件請求的時候運行CGI腳本;Script指令讓你能夠在使用特定請求方法的時候運行CGI腳本。 |
| mod_info | 生成Apaceh配置情況的Web頁面。一旦配置完成,你的服務器信息就可以通過訪問http://your.host.example.com/server-info得到 | |
| mod_status | 本模塊允許服務器管理員方便地檢查服務器當前的運行狀況 | |
| mod_mime | 根據文件擴展名決定應答的行為(處理器/過濾器)和內容(MIME類型/語言/字符集/編碼)。 | |
| mod_negotiation | 從幾個有效文檔中選擇一個最匹配客戶端要求的文檔的過程。 | |
| mod_cgi | 提供對非線程型MPM(prefork)上提供對CGI腳本執行的支持。 | |
| mod_include | 實現了服務器端包含文檔(SSI)的處理 | |
| 安全模塊 | mod_auth_basic | 使用HTTP基本認證,在認證支持模塊的幫助下查找用戶名和密碼,從而進行訪問控制。 |
| mod_auth_digest | 實現了HTTP摘要認證。 | |
| mod_authn_alias | 可以在配置文件中基于實際認證支持者來創建擴展的認證支持者 | |
| mod_authn_anon | 前端認證模塊 | |
| mod_authn_dbd | 為認證前端使用SQL數據庫進行用戶認證提供支持 | |
| mod_authn_dbm | 為認證前端使用dbm密碼文件進行用戶認證提供支持 | |
| mod_authn_file | 為認證前端使用純文本文件進行用戶認證提供支持 | |
| mod_authn_ldap | 允許使用一個LDAP目錄,存儲用戶名和密碼數據庫,并未認證前端(mod_auth_basic)提供基本認證和授權 支持。 | |
| mod_authn_groupfile | 可以根據經過認證的用戶是否屬于特定組,來允許或拒絕訪問受保護的區域 | |
| mod_authn_user | 可以允許或拒絕經過認證的用戶訪問受保護的區域 | |
| mod_access | 提供基于客戶端主機名、IP地址或客戶端請求的其他特性的存取訪問控制。 | |
| 代理模塊 | mod_proxy | 實現了Apache的代理/網關 |
| mod_proxy_http | 提供代理HTTP請求的功能 | |
| mod_proxy_ftp | 提供了代理FTP站點的能力 | |
| mod_proxy_balancer | 為mod_proxy模塊服務 | |
| mod_proxy_content | 需要mod_proxy提供的服務,提供對HTTP的CONNECT方法的支持。 | |
| 其余模塊 | mod_DAV | 實現了分布式創作和版本協議 |
| mod_ssl | 加密的HTTP通信方式。 | |
| mod_isapi | 是一個針對體系結構的模塊。 | |
| mod_deflate | 提供了DEFLATE輸出過濾器 | |
| mod_env | 控制傳送給CGI腳本和SSI頁面的環境變量。 | |
| mod_headers | 提供了一些指令用于控制和修改HTTP請求頭和應答頭 | |
| mod_ldap | 通過后端連接LDAP服務來改善網站性能 |
?
? ? ??
總結
以上是生活随笔為你收集整理的学习《apache源代码全景分析》之模块化体系结构摘录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v8引擎详解
- 下一篇: 学习《apache源代码全景分析》之多任