思维导图



 



点击查看大图



 



Apache Arrow 架构 apache模块_数据库



 



 介绍



 



做为php开发工程师,要想在技术上有所提高,必须要对C有更深入的了解。PHP工程师接触最多的就是apache服务器,所以今天先拿它练练手。不当之处,大家多多指教。



 



 Apache支持许多特性,大部分通过模块扩展实现。



 



 准备条件



 



安装apache.我安装的版本是 httpd-2.2.22,注意高版本在安装过程中问题比较多,建议安装比较低一些的版本。



 



安装过成根据httpd里面的INSTALL文件进行安装。



 



Apache的安装目录是/opt/modules/httpd



源文件:/home/zhoubaochuan/download/httpd-2.2.22



 



 模块处理过程



 



在apache服务器下运行时,一般来说,它以"mod_模块名"的形式集成。



Apache Arrow 架构 apache模块_php_02



 



1> mod模块接受Apache传递过来的请求



2> 处理这些请求,



3> 将处理后的结果返回给Apache。



 



注意: 对于每一个模块,必须保证文件名是以"mod_"开始的。如mod_test.c。——如果命名格式不对Apache将认为此模块不合法。



 



 



 运行过程



 



Apache的运行分为启动阶段和运行阶段。



 



Apache Arrow 架构 apache模块_Apache_03

 

启动阶段

     >> 将以特权用户root或超级管理员Administrator完成启动。

     >> 整个过程在单线程中。包括配置文件解析(http.conf),模块加载(如mod_test)和系统资源初始化(如日志文件,共享内存段,数据库链接等)

    >> 这个阶段把许多比较慢或者花费比较高的操作都集中在这个阶段完成,以减少后面请求服务的压力。

运行阶段

   >> Apache放弃特权用户级别,使用普通用户,主要基于安全考虑。

   >> 处理http请求,处理过程分为链接,处理,断开。



 



 加载机制



 



 检查是否为Apache模块:



     



通过检查module结构体中的magic字段实现的。而magic字段是通过STANDARD20_MODULE_STUFF体现。



 

Apache Arrow 架构 apache模块_php_04


 


 在这个宏中magic的值为MODULE_MAGIC_COOKIE


Apache Arrow 架构 apache模块_Apache_05

 


 激活模块


Apache Arrow 架构 apache模块_数据库_06


         Apache会调用相关函数ap_add_loaded_module将模块激活(激活:将模块放入相应的链表中(ap_top_modules链表,ap_top_modules链表用来保存Apache中所有被激活的模块。)


 


 Apache的每一个模块都是以module结构体的形式存在。可以细看源码与注释。


Apache Arrow 架构 apache模块_c/c++_07

 


 编码——mod_test模块为例


 


1.先写个Makefile文件(避免每次都打一堆的命令,make一下就都好了——很好用啊!大家试试)

Apache Arrow 架构 apache模块_数据库_08


 2.写实现代码


Apache Arrow 架构 apache模块_数据库_09


 3.编译文件.


Apache Arrow 架构 apache模块_Apache_10


 


 4.开始在apache中应用,配置httpd.conf文件,加入下面一行文字 .


Apache Arrow 架构 apache模块_Apache_11


 


 5.看看效果


Apache Arrow 架构 apache模块_数据库_12


 


 

 总结


 


 这篇文章只是apache模块的局部实现过程,在生产环境中,会有很多的处理过程。包括对请求的处理,认证等等。


 


通过apache模块,我们有的时候可以直接绕过web语言的实现机制,直接通过C语言,把一些简单的数据存入介质中,如文件,数据库,内存,然后做为api接口供其他业务调用。


 


 参考资料:《The Apache Modules Book--Application Development with Apache》