学习《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服务来改善网站性能

      

猜你喜欢

转载自blog.csdn.net/zhangge3663/article/details/83343838