日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习《apache源代码全景分析》之模块化体系结构摘录

發布時間:2024/1/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习《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源代码全景分析》之模块化体系结构摘录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。