首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >服务器架设笔记——Apache模块开发基础知识

服务器架设笔记——Apache模块开发基础知识

作者头像
方亮
发布2019-01-16 14:29:31
9830
发布2019-01-16 14:29:31
举报
文章被收录于专栏:方亮方亮

        通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API。虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统。(转载请指明出于breaksoftware的csdn博客)

        为了实现最基础的URL解析等功能,我把《Apache模块开发指南》一书粗略了翻看了两遍,以利于迅速了解Apache模块编程的相关知识。至于书中具体的知识点,我并不在此赘述。但是为了便于大家了解之后遇到的各种相关的知识点,我大致罗列几条(摘自《Apache模块开发指南》一书):

  • ap_头文件一般定义了较低层次的API元素,通常(尽管不是总是)被其他头文件包含,而被间接访问。
  • http_头文件定义了应用开发者比较感兴趣的绝大部分关键的API。这些API也可以通过一些模块暴露给脚本语言。
  • util_头文件定义了比ap_更高层次的API,但是这些API很少被应用模块直接调用,不过这个规则对两个文件例外:util_script.h和util_filter.h。其中util_filter.h定义了过滤API。之后我们会讲过滤器时,就会用到它。
  • mod_头文件定义了被可选模块实现的API。使用这些API可能会引发依赖。在之后的章节中我们将会使用到DBD框架导出在mod_dbd.h文件中的API。
  • apr_头文件定义了APR(Apache Portable Runtime)的API。对于Web服务器来说,APR库是外部库,也是基本库,并对任何重要的模块来说都是(直接或者间接)必需的。这系列头非常重要。

        其中http_头文件又有如下重要的头文件:

  • http_config.h:定义了配置API,包括配置数据结构、配置向量、任何相关的访问器。它也定义了它自身的模块数据结构、相关的访问器和处理函数钩子。绝大部分模块都需要这个头文件。
  • http_core.h:定义了各种各样被Apache内核引出的API,比如request_rec对象提供的访问器函数。
  • http_log.h:定义了错误日志API和管道日志。模块需要这个头文件中的错误报告函数和相关的宏。
  • http_protocol.h:包括了一些高层的函数API,用来执行一些重要的操作,包括所有的对客户端的正常I/O,以及处理HTTP协议相关方面,如生成正确的应答报头等。它也导出了一些不在http_request范围内、必需的处理钩子。

        我们在前一文《服务器架设笔记——编译Apache及其插件》中我们提到APR库,其全称是Apache Portable Runtime,即Apache可移植运行时库。还有个叫APR-UTIL库,顾名思义,其应该是基于APR库的封装,提供了一套易于使用APR库的方法。我们之后的编程中,将会经常使用到这些库。限于篇幅,我并不打算在此细细讲解这些库。我也只是罗列下《Apache模块开发指南》中的一些知识,相信大家会在其中找到对自己有用的模块。

名称

用途

apr_allocator

内存分配,内部使用

apr_atomic

原子操作

apr_dso

动态加载链接库

apr_env

读取/设置环境变量

apr_errno

定义错误的值、条件和宏

apr_file_info

文件系统对象和路径的属性

apr_file_io

文件系统输入/输出

apr_global_mutex

全局锁

apr_hash

哈希表

apr_inherit

文件句柄继承辅助

apr_mmap

内存映射

apr_network_io

网络输入/输出(套接字)

apr_proc_mutex

进程锁

apr_random

随机数

apr_shm

共享内存

apr_signal

信号处理

apr_strings

字符串操作

apr_tables

表格和数组函数

apr_thread_cond

线程条件

apr_thread_mutex

线程锁

apr_thread_proc

线程和进程函数

apr_thread_rwlock

读写锁

apr_time

时间/日期函数

apr_usr

用户和组ID服务

        可以见得,APR库主要是对系统的相关操作做了封装,从而实现Portable的能力。

        我们再看下APR-UTIL库部分模块(摘自《Apache模块开发指南》一书):APR-UTIL库

名称

用途

apr_anylock

透明的、任何锁的封装

apr_base64

Base64编码

apr_date

时间字符串解析

apr_dbd

针对SQL数据库的常用API

apr_hooks

钩子实现宏

apr_md4

MD4编码

apr_md5

MD5编码

apr_queue

线程安全的FIFO队列

apr_sha1

SHA1编码

apr_strmatch

字符串模式匹配

apr_uri

URI解析/构造

apr_uuid

用户标识

apr_xlate

字符集转换(I18N)

apr_xml

XML解析

        我们发现APR和APR-UTIL库为我们提供了从内存分配到线程控制等操作系统相关的模块,也为我们提供了字符串和XML以及一些简单的编码算法库。这些模块可以满足我们一般的需求,我们只要将这些API组合好,使用对,便可以编写Apache插件了。

        最后我们要介绍的是APR库的一个基础组件——APR pool。pool就是池,我们在以往的编程中经常会接触到线程池、内存池这样的概念。而APR pool就是APR中各种资源管理的池。作为C/C++程序员,在编程中我们往往需要处理各种内存分配和释放问题——不讨论智能指针这类知识。如果没有深厚的功底和清晰的逻辑,内存泄露就是家常便饭。APR池就是要将程序员这种纠结中解脱出来。所以我们之后在Apache模块编程中,一旦涉及资源申请,就要优先考虑如何去使用这个池。

        有了以上的基础知识,我们便可以再小迈一步。下节我将介绍如何编写一个http请求解析插件。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年02月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档