apache 模块

来源:互联网 发布:网络歌曲你是否爱过我 编辑:程序博客网 时间:2024/05/17 16:13

模块的调用方式

     Apache提供了一些API函数,通过这些函数,apache可以将某一个已经编译好的库文件加载到内存中,并根据模块中指定的调用时机,在适当的时候 进行调用。指定模块的调用时机是通过将某些函数向apache注册,并附带相关的注册信息,如filter模块,则需要指定模块的类型(如: AP_FTYPE_CONTENT_SET;AP_FTYPE_CONNECTION等等),模块加载前的初始化函数,模块名称。 模块注册好后,当满足相关配置条件后,apache会调用相关处理函数进行处理

 

模块的调用时机

      Apache处理请求的进程:监听到一个HTTP请求,创建一个进程,解析数据包,找到用户所请求的资源并发送,处理结束。     在模块化处理后,Apache内部有多个模块函数的调用链表,我们注册的处理函数就在这些链表中。在请求处理的不同阶段,调用不同链表中的模块函数。不同类型的模块函数,所能接收到的数据也是不同的。 常用的模块注册函数: ap_hook_pre_connection 当连接被建立,开始收数据之前,函数被调用。

 ap_hook_post_read_request 当apache收到一个请求数据包之后,所注册的模块处理函数被调用

 ap_hook_header_parser 用户检查http头的又一次机会。

 ap_hook_auth_checker 对用户进行监权

 ap_hook_handler。 模块处理函数

 httpd.conf中的配置: SetHandler mytrantest(该字段将做为一个入参传入handle函数)

 

Filter模块的使用方式

   filter分为输入和输出两类;输入filter是在请求被处理前,调用模块中的注册函数;输出filter是在请求被处理后调用模块中的注册函数。输入filter可以过滤或替换用户的请求,输出filter可以更改即将要发送给用户的数据。

   Filter的注册方式: ap_register_output_filter ap_register_input_filter 这两个函数的第一个参数是filter的名称,该名称要被设置到httpd.conf中,注册的函数才会被调用,设置方法如下: AddOutputFilter HEADERFOOTERA .html
    由于apache的模块化处理,使得模块的功能可以任意扩充,模块处理过程中,可以任意修改数据,与其他进程交互。 但使用模块也会使服务器的响应变慢,在模块处理中,拷贝请求数据会消耗较多资源,应尽量少地对请求数据进行拷贝。动态分配的资源需要及时释放。

Input filter 处理请求数据

input filter 有两种方式,其一是只处理请求数据,其二是处理包括请求头在内的所有数据

处理input filter 需要用到bucket 和bucket brigade (bucket 和bucket brigade 是一种内存池机制,一个bucket brigade 里面可以保存多个bucket,处理请求时需要申请bucket 空间,然后将请求数据放在bucket中,然后通过循环处理bucket数据)


ap_table_t  哈希表可以存放key value 键值对,可以通过这个结构获取请求头响应头中的信息,常用接口:

ap_table_get() 获取value

ap_table_set() 设置value

ap_table_add() 添加键值对

request_rec 请求数据的结构体,里面存放请求中的相关数据

ap_filter_t filter  数据结构

apr_bucket

apr_bucket_brigade

原创粉丝点击