通过上节的例子,我们发现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库
名称 用途
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请求解析插件。

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

  1. 服务器架设笔记——多模块和全局数据

    随着项目工程的发展,多模块设计和性能优化是在所难免的.本文我将基于一些现实中可能遇到的需求,讲解如何在Apache的Httpd插件体系中实现这些功能.(转载请指明出于breaksoftware的csd ...

  2. linux 安全模块开发基础知识

    linux 安全模块开发 一.内核编译与调试 1. 编译内核 进入到下载好的Linux内核文件中,将配置文件中的选项清空 make allnoconfig make menuconfig 进入配置文件 ...

  3. 服务器架设笔记——使用Apache插件解析简单请求

    一般来说,对于一个请求,服务器都会对其进行解析,以确定请求的合法性以及行进的路径.于是本节将讲解如何获取请求的数据.(转载请指明出于breaksoftware的csdn博客) 我们使用<服务器架 ...

  4. 服务器架设笔记——打通MySQL和Apache

    在<服务器架设笔记--使用Apache插件解析简单请求>一文中,我们已经可以获取请求内容.这只是万里长征的第一步.因为一般来说,客户端向服务器发起请求,服务器会有着复杂的业务处理逻辑.举个 ...

  5. (硅谷课堂项目)Java开发笔记4:前端基础知识(二)

    文章目录 (硅谷课堂项目)Java开发笔记4:前端基础知识(二) 一.NPM 1.NPM简介 1.1.什么是NPM 1.2.NPM工具的安装位置 2.使用npm管理项目 2.1.创建文件夹npm 2. ...

  6. iOS开发基础知识--碎片41

    iOS开发基础知识--碎片41 1:UIWebView加载本地的HTML NSString *path = [[NSBundle mainBundle] bundlePath]; NSURL *bas ...

  7. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  8. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动端IM)的数据流交换方式都是Http短连接+TCP或UDP长连接来实现.Http短连接主要用于从服务器读取各种持久化信息 ...

  9. IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以"人"为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是 ...

最新文章

  1. 深入剖析SolrCloud(一)
  2. 基于轻量型Web服务器Raspkate的RESTful API的实现
  3. 10大反直觉的数学结论
  4. jquery中方法扩展 ($.fn $.extend) 学习笔记
  5. 添加roster好友 命令
  6. js 中使用map的两种方式
  7. SPSS调节效应检验(图文+数据集)【SPSS 045期】
  8. 【MFC开发(7)】编辑框控件Edit Control
  9. 虚拟化平台就在你身边-ARM架构虚拟化扩展, 以及SMMU对虚拟化等解决方案的重要性(白皮书 2010)
  10. python帮室友避险——爬虫加可视化
  11. 电脑计算机无法找到脚本文件夹,电脑开机老是提醒无法找到脚本文件的处理方法...
  12. 2023年北京邮电大学计算机考研信息汇总
  13. “ERROR: Could not install packages due to an OSError: [WinError 5] 拒绝访问” 问题解决办法
  14. dellr420部署os_dell r720服务器OS部署
  15. 怎么删除计算机c盘应用,怎样删除电脑c盘中的垃圾
  16. thinkpad笔记本电脑怎么关闭触摸板
  17. 拇指射箭服务器维护,拇指射箭1小游戏:这个拇指射箭3D游戏有点意思,拇指枪王对决...
  18. djangoday18
  19. 启信宝受益所有人界面_希望您的项目成功吗? 然后确保其他人也可以从您的想法中受益。...
  20. 学习笔记|PSO粒子群算法(1)

热门文章

  1. 数字图像处理:(1)图像梯度以及算子应用
  2. 深度学习、AI构图、智能裁图、显著性检测、美感质量评价
  3. 基于YOLO的手部检测和计数实现(课程设计,训练和测试)(1)
  4. java从入门到精通_想要开始学java?你要的java从入门到精通布列如下!
  5. 实时的激光雷达点云压缩
  6. 【只需简单三个步骤】ACE系统前后端不分离情况下如何增加一个JSP嵌入页面
  7. Rocksdb 的 BlobDB key-value 分离存储插件
  8. partprobe源码分析
  9. # NVIDIA Jetson系列系统镜像备份烧录指南
  10. c#总结最近的几项重要代码