`
liuzhaomin
  • 浏览: 206300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Apache源代码分析——关于模块结构的几个重要概念

阅读更多

转载请注明来源:http://blog.csdn.net/tingya

本文分析了Apache中关于模块的几个重要的概念
///////////////////////////////////////////////////////////////////////////////////////
关于模块的几个重要的全局变量
理解Apache模块的概念之前我们首先必须弄清楚apache中关于模块的几个重要概念和数据结构。
1. DSO(Dynamic Shared Object,动态共享对象)
Apache 服务器的体系结构的最大的特点就是高度模块化,这一点到2.0版本的时候几乎发挥到了极致。除了少数的几个核心文件外,Apache中大部分功能都被模块化。模块化的最大的优势就是用户可以根据自己的实际需要进行裁减和增加。模块的存在有两种方式,一种就是在编译Apache的时候跟核心文件一起编译,这时候的模块我们称之为静态链接编译模块;另一种存在方式就是独立于Apache的核心文件,这种文件何时编译与Apache的核心文件无关,核心文件也不关心其存在。核心文件只有在需要的时候才去找它并将它装入自己的执行空间。这种方式称之为动态状态模块。
DSO的产生当然离不开操作系统的支持。目前的不管UNIX还是Linux大多提供了对动态共享对象或者动态链接库进行加载何卸载的机制。加载的方法通常有两种:其一是在可执行文件启动时候由系统程序ld.so自动加载;其二是在执行程序中手工地通过Unix提供的动态链接库加载接口进行加载。
按照第一种方法,动态链接库比如libfoo.so或者libfoo.so.1.2通常被存储在目录/usr/lib中。使用libfoo.so库的程序只需要在编译程序的时候加上编译选项-lfoo就可以建立到动态链接库的链接。通常
而在第二种方法种,动态链接库可以使用任何的文件名(规范的文件名称为foo.so),而且也不一定要存储在/usr/lib目录中,其可以存储于任何目录中,也不会自动建立指向其所用的可执行程序的链接,而是由可执行文件在运行的时候自己调用类似dlopen之类的接口将动态链接库加载到自己的地址空间,同时也不会为可执行程序解析动态链接库中的符号,包括函数名称、变量名称等等,这些工作必须由可执行程序自行调用dlsym之类的函数进行解析。
。。。。。
Apache 2.0提供了下面的几个命令用于生成DSO共享链接库,简要说明如下:
1. 编译并安装已发布的Apache模块,比如编译mod_foo.c为mod_foo.so的DSO模块:
$ ./configure --prefix=/path/to/install --enable-foo=shared
$ make install
2. 编译并安装第三方Apache模块, 比如编译mod_foo.c为mod_foo.so的DSO模块:
$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
$ make install
3. 配置Apache以共享后安装的模块:
$ ./configure --enable-so
$ make install
4. 用apxs在Apache源代码树以外编译并安装第三方Apache模块,比如编译mod_foo.c为mod_foo.so的DSO模块:
$ cd /path/to/3rdparty
$ apxs -c mod_foo.c
$ apxs -i -a -n foo mod_foo.la
共享模块编译完毕以后,都必须在httpd.conf中用LoadModule指令使Apache激活该模块。
2. Linux中DSO函数操作
void* dlopen(const char *pathname, int mode);
该函数函数来加载动态库,其中pathname是需要加载的库的路径名称,mode则是加载的方式,可以是三个值:RTLD_LAZY用来表示认为未定义的符号是来自动态链接库的代码;RTLD_NOW则表示要在dlopen返回前确定所有未定义的符号,如果不能完成则失败;而RTLD_GLOBAL则意味着动态链接库中定义的外部符号将可以由随后加载的库所使用。如果函数执行成功,其将返回动态链接库的一个句柄。
一旦对动态库进行了加载,我们则可以通过dlsym函数获取库中的函数调用以及各种定义的符号等等。其函数原型如下:
void* dlsym(void* handle, char* symbol);
其中,handle是加载的动态链接库的句柄,其通常是dlopen函数的操作结果;symbol则是需要得到的动态链接库中的符号名称。如果找不到symbol,函数将返回NULL。
在所有的操作结束后,Linux可以通过dlclose将dlopen先前打开的共享对象从当前进程断开,不过只有动态链接库的使用记数为0的时候该共享对象才会真真被卸载。dlclose的函数原型如下:
int dlclose(void* handle);
一旦使用dlclose关闭了对象,dlsym就再也不能使用它的符号了。
下面的代码简单的演示了dlopen、dlsym、dlclose的三步曲的使用。
void* handle, *handle2;
handle = dlopen("libdisplay.so", RTLD_LAZY);
if (handle != NULL)
{
handle2 = dlsym(handle, "draw");
if (handle2 != NULL){
…… /* use the function */
}
/* When finished, unload the shared library */
dlclose(handle);
}
3. Apache中DSO处理模块
Apache中对动态链接库的处理是通过模块mod_so来完成的,该模块与其余的所有模块相比,没有什么特殊之处,因此从某种角度而言,其就是一个普通的模块。不过由于其作用是用来装载其余的模块,因此该模块不能被动态加载,它只能被静态编译进Apache的核心。这意味着Apache一启动,该模块就必须立即起作用。mod_so模块是Apache中除了core模块之外唯一不能作为DSO模块而存在的模块。想想,如果mod_so模块也要被动态加载,那么谁来加载它呢?
4. Apache中关于模块的几个全局变量
Apache中定义了一些与模块相关的全局变量,它们的作用相似,但存在差异。
■ap_preloaded_modules[]
该数组称之为预装载模块数组,其中定义了所有的Apache中默认的静态编译的模块。尽管这些模块已经被编译进Apache中,但是其不一定能够发挥作用,模块能否发挥作用,取决于该模块是否被“激活”。只有激活的模块才能起作用。在Apache1.3中,可以通过指令AddModule来激活某个模块。
module *ap_preloaded_modules[] = {
&core_module,
&mpm_netware_module,
&http_module,
&so_module,
&mime_module,
……
NULL
};

■ap_prelinked_modules[]
该数组称之为预链接模块数组,该数组定义了所有的Apache中默认的在Apache启动后就处于“激活”状态的模块,其定义简化如下:
module *ap_prelinked_modules[] = {
&core_module,
&mpm_netware_module,
&http_module,
&so_module,
&mime_module,
……
NULL
};
该数组中定义的所有的模块在Apache启动后由于处于“激活”状态,因此可以立即相应核心的请求
这两个全局数组是从以前的Apache版本延续而来的。正如前面所说,在Apache1.3版本中,这两个数组未必完全相同。不过在Apache2.0中,两个数组已经没有差异了,这意味着一个模块一旦被静态编译,其就立即处于激活状态,这也是Apache2.0中删除了AddModule指令的原因。
■ap_loaded_modules数组
尽管Apache对于所有的静态编译的模块都是立即激活它,这并意味着Apache对所有的模块都是这样。如果你某个模块不是默认的,而是第三方模块的话,那么Apache即使将其装入也不一定就立即激活它。ap_loaded_modules数组用来保存所有的已经被装入的模块,包括默认的和第三方的;包括激活的和非激活的。
■ap_top_modules链表
与ap_loaded_modules数组对应,ap_top_modules链表用来保存Apache中所有的被激活的模块,包括默认的激活模块和激活的第三方模块。

关于作者
张中庆,目前主要的研究方向是嵌入式浏览器,移动中间件以及大规模服务器设计。目前正在进行Apache的源代码分析,计划出版《Apache源代码全景分析》上下册。Apache系列文章为本书的草案部分,对Apache感兴趣的朋友可以通过flydish1234 at sina.com.cn与之联系!

如果你觉得本文不错,请点击文后的“推荐本文”链接!!
分享到:
评论

相关推荐

    JSP论文格式化系统_——后台模块的设计与实现(源代码+论文).zip

    项目源代码可能包括以下几个部分: - Controller层:处理HTTP请求,调用Service层方法。 - Service层:实现具体业务逻辑,如论文上传、格式检测、格式转换等。 - DAO层:与数据库交互,进行数据的增删改查操作。 - ...

    「创客真人秀——2017全球人工智能创客马拉松超级挑战赛」比赛项目网页监控部分的源代码.zip

    该压缩包文件名为"「创客真人秀——2017全球人工智能创客马拉松超级挑战赛」比赛项目网页监控部分的源代码.zip",其中包含了「2017全球人工智能创客马拉松超级挑战赛」的一个参赛项目——网页监控部分的源代码。...

    android sdk 2.1 源代码 天涯浪子

    《Android SDK 2.1 源代码深度解析——天涯浪子篇》 在移动操作系统领域,Android以其开源、自由的特性吸引了无数开发者。本文将深入探讨Android SDK 2.1的源代码,帮助读者更好地理解这个平台的核心运作机制。我们...

    apache2.2.17安装

    `mod_fileiri.c`是该模块的C源代码,而`mod_fileiri.so`是编译后的动态链接库文件,会在Apache启动时加载。 要在Apache中启用这个模块,需要在配置文件`httpd.conf`中添加以下行: ``` LoadModule fileiri_module ...

    基于Java的企业内部通信系统源代码

    【标题】"基于Java的企业内部通信系统源代码"揭示了这个项目的核心——使用Java编程语言构建了一套适用于企业内部的通信解决方案。Java是一种广泛应用于企业级应用开发的强大、跨平台的语言,其稳定性和丰富的库支持...

    计算机软件毕业设计_网络考试系统的设计与实现——阅卷子系统_计算机毕业设计源码_计算机毕业设计源代码.rar

    在压缩包内的源代码中,我们可以找到各个模块的实现细节,例如用户认证模块、考试模块、阅卷模块的代码。通过阅读这些代码,学生可以学习到实际项目开发中的编程技巧,理解如何将理论知识应用于实际场景。同时,教师...

    spring-kafka源代码

    在源代码层面,Spring Kafka主要由以下几个模块组成: 1. `org.springframework.kafka.core`:这是Spring Kafka的核心模块,包含Producer和Consumer的配置和实现。 2. `org.springframework.kafka.config`:提供了...

    apache-server-httpd

    总结来说,"apache-server-httpd-2.4.12.tar.gz"是一个包含Apache HTTP Server 2.4.12版本源代码的压缩文件,用户可以下载、编译和安装以搭建自己的Web服务器,享受其强大、灵活且稳定的Web服务功能。

    基于SSM框架的网上体育用品商城项目源代码.rar

    在这个体育用品商城项目中,我们可以看到以下几个关键模块: 1. **用户模块**:包括用户注册、登录、个人信息管理等功能。Spring Security或Apache Shiro可能被用来实现权限控制和会话管理。 2. **商品模块**:...

    PHP实例开发源码——SK美女图片伪静态缓存版 v1.0.zip

    【标题】"PHP实例开发源码——SK美女...通过分析和研究源代码,可以加深对PHP Web开发中性能优化和用户体验提升的理解。同时,它也可能是一个实际部署的解决方案,对于运营一个以图片展示为主的网站具有实际应用价值。

    axis2学习——开发自定义的axis2服务

    标题中的“axis2学习——开发自定义的axis2服务”表明了...综上所述,这篇文章很可能是关于如何使用Apache Axis2框架创建、配置和部署自定义Web服务的教程,涉及到服务开发的基本流程、核心概念以及可能的扩展和优化。

    毕业设计,智能自动数据获取分析系统.zip

    可能包括以下几个关键模块: 1. 数据获取模块:此部分可能利用网络爬虫技术,如Jsoup或HttpURLConnection,从互联网上抓取需要的数据。对于特定数据源,可能还需要解析JSON或XML格式的API接口,这就需要用到如...

    mod_jk-new.rar

    【标题】"mod_jk-new.rar" 涉及的核心知识点是Apache服务器的负载均衡模块——mod_jk,以及其在Apache 2.4.x版本中的应用,特别是针对Apache 2.4.39这个具体版本。这个压缩包包含的是mod_jk.so,这是一个动态链接库...

    网站制作——宏图外贸国际有限公司毕业设计.doc

    本文成功制作了一个小型企业网站管理系统,完成了小型企业网站管理系统所需的几大功能,如动态添加产品信息、公司信息动态展示。公司可以简单方便的运用后台进行管理,对网站进行各项操作,以便企业能及时更新自己的...

    sourcemasker-源码.rar

    【描述】"sourcemasker-源码.rar" 的描述虽然简洁,但暗示了这个压缩包内容的核心——源代码。源码是软件开发的基础,它允许程序员对软件进行定制、调试和优化。RAR 是一种常见的文件压缩格式,用于将多个文件打包成...

    php程序员菜鸟成长手记——php入门教程

    - 开放源代码:免费且可自由修改。 - 跨平台:支持多种操作系统,如Windows、Linux等。 - 易于学习:语法简单,适合初学者快速上手。 - 功能强大:内置丰富的函数库,支持多种数据库接口,可以轻松实现复杂的...

    JSP毕业设计-JSP数据库连接池的研究与实现(源代码+论文).zip

    源代码分析** 在"毕业论文(最终).doc"中,通常会包含项目的设计思路、数据库模型、主要功能模块的实现方法以及性能评估等内容。这部分文档是理解项目实现的关键,可以帮助读者深入理解数据库连接池在实际应用中的...

    svn服务器配置说明

    在配置SVN服务器时,我们通常会涉及以下几个关键步骤: 1. **安装SVN服务器软件**:最常见的SVN服务器软件是Apache Subversion的服务器组件——`Apache HTTP Server (Apache2)`和`VisualSVN Server`。Windows环境下...

Global site tag (gtag.js) - Google Analytics