在ApacheHTTPD服务器中使用DSO完全分析

2009-05-13 01:06:40来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


ApacheHTTP服务器是一个模块化(或说积木式)的程序,管理员可以选择一些模块来增加服务器的某些功能。这些模块,可以在创建服务器程序时静态地编译到httpd服务器的二进制代码中,也可以编译成一些独立于服务器程序的DynamicSharedObjects(DSOs)文件。DSO文件可以在编译服务器程序时创建,也可以在以后利用Apache扩展工具apxs来单独创建。这篇文档,将描述如何使用DSO模块,以及其背后的原理。

实现
ApacheHTTPD对DSO的支持,即对单个模块的动态加载,是基于一个叫mod_so的模块来实现的,此时mod_so必须被静态地编译到HTTP服务器内核中。这是除了core以外唯一不能以dso方式编译的模块。实际操作时,其它的Apache模块可以在编译服务器程序时通过单独指定来将其编译为DSO文件,正如安装文档中讲述的,此时configure的设置参数应为--enable-xxxx=shared(xxxx为模块的名字,如rewrite等)。当一个模块被编译为一个名为mod_foo.so的DSO文件后,就可以在httpd.conf文件中用mod_so的LoadModule命令,告诉服务器在启动或重新启动时将此模块加载。

为了简化创建Apache模块(尤其是第三方模块)的DSO文件的过程,apache提供了一个新工具名叫apxs(APacheeXtenSion)。它可以脱离apache的源码将模块编译成DSO文件。它的实现思路非常简单:在安装Apache时,configure脚本的makeinstall过程会安装Apache的C头文件,并在apxs程序(apxs是一个perl脚本)中对依赖于具体平台的编译器和连接器设置一些标志(Flag),以供创建DSO文件。通过这种方式,用户就可以利用apxs在没有Apache源码树且无需针对当前平台的编译器和连接器进行配置(以生成DSO格式目标文件)的情况下编译Apache模块了。

使用概要说明
创建和安装一个Apache发布的(distributed)模块,比方说将mod_foo.c编译成mod_foo.so:

$./configure--prefix=/path/to/install--enable-foo=shared
$makeinstall

创建和安装一个第三方的Apache模块,比方说将mod_foo.c编译成mod_foo.so:

$./configure--add-module=module_type:/path/to/3rdparty/mod_foo.c--enable-foo=shared
$makeinstall

为以后安装(非HTTPD编译时安装)模块配置Apache:

$./configure--enable-so
$makeinstall

(要编译全部Aapache模块,用./configure--enable-mods-shared=all--with-egd--with-devrandom--enable-so,但对experimental一类的模块,需要特别指定,如./configure--enable-mods-shared=all--with-egd--with-devrandom--enable-so--enable-cache=shared--enable-disk_cache=shared--enable-mem_cache=shared--enable-proxy=shared--enable-proxy_connect=shared--enable-proxy_ftp=shared--enable-proxy_http=shared--enable-file_cache=shared--enable-charset_lite=shared--enable-case_filter=shared--enable-case_filter_in=shared--enable-ssl=shared。具体有哪些模块可以编译而没有打开编译开关,可在前面的那个configure运行的最后看看哪一个是no.)

利用apxs在没有Apache源码树的情况下,创建和安装第三方的Apache模块:

$cd/path/to/3rdparty
$apxs-cmod_foo.c
$apxs-i-a-nfoomod_foo.la

在所有的情况下,当一个模块编译完成后,必须在httpd.conf使用LoadModule命令在告诉Apache激活这个模块.

背景知识
在现代的Unix的派生版本中,有一种非常好的机制,叫做DynamicSharedObjects(DSO)的动态连接/和加载,它提供了一种方法,将一段代码编译成一种特殊格式后可在一个可执行程序运行时将这段程序加载到它的地址空间中。

这种加载通过可以通过两种方式做到:在一个可执行程序开始运行后通过一个叫ld.so的系统程序自动加载,或在可执行程序内部通过Unix加载器(loader)的系统编程接口的系统调用dlopen()/dlsym()来手工加载。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:基于反向代理的Web缓存加速现代理服务器

下一篇:基于NUMA架构的高性能服务器技术(1)