赞
踩
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服务来改善网站性能 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。