1.基本概念
4个基本对象:TCP链接,服务器(Server),http请求,进程(process)
2.数据结构
(1)request_rec:当前http请求表( 双向链表),存储http请求头,状态,资源池等信息
-
struct request_rec {
-
/** 和该请求相关联的池 */
-
apr_pool_t *pool;
-
/** 到客户端的连接 */
-
conn_rec *connection;
-
/** 处理本连接的虚拟主机 */
-
server_rec *server;
-
-
/** 如果有外部重定向,指向请求重定向的指针 */
-
request_rec *next;
-
/** 如果是内部重定向,指向前一个请求的指针 */
-
request_rec *prev;
-
-
......
-
-
}
(2)server_rec:虚拟主机表(单链表),存储服务器名称、服务器定义、资源和限制、日志信息等
-
struct server_rec {
-
/** 本服务器所运行的进程 */
-
process_rec *process;
-
/** 链表中的下一个服务器 */
-
server_rec *next;
-
/** 服务器的名称 */
-
const char *defn_name;
-
/** 服务器在配置文件中定义的行数 */
-
unsigned defn_line_number;
-
/* 契约信息*/
-
/** 管理员的契约信息*/
-
char *server_admin;
-
/** 服务器的主机名 */
-
char *server_hostname;
-
...
-
}
(3)conn_rec:TCP连接表
一个conn_rec对象也对应着一个或者多个request_rec对象.
-
struct conn_rec {
-
/** 和此连接相关的池 */
-
apr_pool_t *pool;
-
/** 此连接进入的服务器 */
-
server_rec *base_server;
-
/** 被 http_vhost.c 使用 */
-
void *vhost_lookup_data;
-
/* 关于连接本身的信息 */
-
/** 本地地址 */
-
apr_sockaddr_t *local_addr;
-
/** 远端地址 */
-
apr_sockaddr_t *remote_addr;
-
/** 客户端的IP地址 */
-
char *remote_ip;
-
/** 如果可以获取,则为客户端的DNS名称;如果没有检查则为NULL;
-
* 如果没有发现,就为“”。
-
* 该字段只是为get_remote_host() 使用。
-
*/
-
char *remote_host;
-
/** 如果做rfc1413的查找则设定。
-
* 该字段只是为get_remote_host() 使用。
-
*/
-
char *remote_logname;
-
/** 我们还在谈话么? */
-
unsigned aborted:1;
-
/**我们将要为另一个请求保持此连接的激活?
-
* @see ap_conn_keepalive_e
-
*/
-
ap_conn_keepalive_e keepalive;
-
/** 我们做过double-reverse DNS? -1 为是/失败,0为没有。
-
* 1为是/成功。
-
*/
-
signed int double_reverse:2;
-
/** 我们使用它多少次? */
-
int keepalives;
-
/** 服务器的IP地址 */
-
char *local_ip;
-
/** 当UseCanonicalName设定为DNS时,为 ap_get_server_name 使用。
-
* (忽略 HostnameLookups的设定) */
-
char *local_host;
-
/** 连接的ID,每个连接都不同 */
-
long id;
-
/** 包含连接的每服务器配置结构的指针的配置向量 */
-
struct ap_conf_vector_t *conn_config;
-
/** *this* 连接的笔记:从一个连接发送笔记到另一个连接。
-
* 必须在本连接的所有请求上保持正确。
-
*/
-
apr_table_t *notes;
-
/**本连接所使用的输入过滤链表 */
-
struct ap_filter_t *input_filters;
-
/**本连接所使用的输出过滤链表 */
-
struct ap_filter_t *output_filters;
-
/** 本连接得分板信息的处理函数 */
-
void *sbh;
-
/** 为所有bucket/brigade创建所使用的bucket 分配器 */
-
struct apr_bucket_alloc_t *bucket_alloc;
-
/** 本连接的当前状态 */
-
conn_state_t *cs;
-
/** 输入过滤器还有悬而未决的数据么? */
-
int data_in_input_filters;
-
};
(4) process_rec:操作系统内核对象(进程),以进程的方式加载动态链接库
-
struct process_rec {
-
/** 全局池,进程退出后清除*/
-
apr_pool_t *pool;
-
/** 配置池. 重启后清除 */
-
apr_pool_t *pconf;
-
/** 程序名 */
-
const char *short_name;
-
/** 命令行参数 */
-
const char * const *argv;
-
/** 命令行参数个数 */
-
int argc;
-
};
参考:《Apache模块开发学习指南》
阅读(1585) | 评论(0) | 转发(0) |