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

在Apache HTTPD中使用DSO(编译)

阅读更多

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

实现


  Apache HTTPD对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(APache eXtenSion)。它可以脱离apache的源码将模块编译成DSO文件。它的实现思路非常简单: 在安装Apache时,configure脚本的 make install 过程会安装Apache的C头文件,并在apxs程序(apxs是一个perl脚本)中对依赖于具体平台的编译器和连接器设置一些标志(Flag),以供 创建DSO文件。通过这种方式,用户就可以利用apxs在没有Apache源码树且无需针对当前平台的编译器和连接器进行配置(以生成DSO格式目标文 件)的情况下编译Apache模块了。

使用概要说明

 

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

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

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

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

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

    $ ./configure --enable-so
    $ make install
    (要编译全部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.)

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

    $ cd /path/to/3rdparty
    $ apxs -c mod_foo.c
    $ apxs -i -a -n foo mod_foo.la


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

背景知识


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

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

  在第一种方式中,DSO通常被叫作共享库或DSO库,以libfoo.so或libfoo.so.1.2的形式命名。它们被存放在系统目录中 (通常是/usr/lib),它们与可执行程序的联系是在编译这个可执行程序时,通过传递给连接器一个-lfoo参数来建立的。这里对库的引用直接编码在 可执行程序中,因而在程序运行时,Unix加载器会通过以下途径寻找libfoo.so:在系统目录/usr/lib下,在通过-R连接参数传递给连接器 后被编码在可执行程序中的路径中,在通过环境变量LD_LIBRARY_PATH指定的目录中。加载器会解析出来那些在可执行程序中使用但是在DSO定义 的标志(symbol)。

  可执行程序中的标志,通常不会被DSO引用(因为它是一个可重用的基本代码库),因而就不再进行进一步的解析。可执行程序自己不需要做任何事情 就可以使用来自DSO的标志,因为Unix加载器已经做了相关的解析工作。(实际上,加载ld.so的代码是使用动态库的可执行程序启动代码的一部分). 动态加载基本代码库的优点是很明显的:库的代码只需在一个系统库(如libc.so)中保存一次,这样可以节省每个程序的磁盘空间。

  在第二种方式中,DSO通常被叫作共享对象或DSO文件,命名它们时可以使用任意的扩展名,虽然规范的命名是foo.so的样子。这些文件通常 存放在程序所在的目录(或子目录)中,它们与执行它们的程序没有自动建立的联系。相反,可执行程序在运行时通过dlopen手工将DSO加载。此时,来自 DSO供执行程序用的标志没有被解析。相反,Unix加载器自动解析所有DSO中使用的来自可执行程序和它已经加载的DSO 库的标志(尤其是来自无处不在的libc.so的所有标志)。在这种方式中,DSO取得可执行程序的标志集合的信息,就象是被静态地连接到可执行程序中一 样。

  最后,为利用DSO's API,可执行程序须通过dlsym()来解析来自DSO的特定标志,供在以后的分派表等处使用。也就是说:可执行程序要想使用来自DSO的标志,须手工 解析它。这样一种机制的优点,不需要的程序段不必加载(因而可以节省内存的使用) ,直到我们讨论的程序需要它时。当需要时,这些程序段可以被动态的加载,来扩展基本程序的功能。

  虽然DSO机制听起来简单,用起来只少有一个比较困难的步骤,就是当用DSO来扩展程序的功能时(第二种方式)时,对来自可执行程序、供DSO 使用的标志的解析。为什么呢? 因为"反向解析" DSO 使用的来自可执行程序标志集合的标志是与函数库的设计相逆的 (函数库没有任何关于那些使用它的程序的信息),而且没有平台提供这种功能,这也不是一个标准化的功能。实际上,可执行程序的全局标志常常不能再次输出, 因而也无法供DSO使用。要利用DSO来动态扩展一个程序的功能,找到一种方法来强制连接器输出所有全局标志是必须解决的主要问题。

  共享库的方法就是一个典型,因为它是DSO机制最初设计的目标,因而它被用于操作系统提供的几乎所有类型的函数库中。从另一方面来说,利用共享对象来扩展功能的程序并不是很多。

  到1998年,只有很少的软件包在程序运行时利用DSO机制来扩展它们的功能:Perl 5(通过它的XS机制和DynaLoader模块), Netscape Server,等。从版本1.3开始, Apache 也加入了这个群体,因为Apache早就用模块的概念来扩展它的功能,且在内容利用基于分派链(dispatch-list-based )的方法来将外部的模块连接到Apache的核心功能中。因此,Apache实际上注定要用DSO来在运行时加载模块的。

长处和不足


上述的基于DSO的功能有以下优点:

  • 服务器在运行时更加灵活,因为实际的服务器进程可以通过配置文件的LoadModule命令动态的组配,而不必在编译时通过配置参数指 定。例如,通过这种方式,虽然只安装了一次,但服务器可以以多种形态运行(如标准版本或SSL版本,简化版本或增强版本[含mod_perl,php3 等])

  • 即使在安装完成后,服务器仍可以很方便地用第三方的模块进行功能扩展。这至少对销售商的软件支持有帮助,他们可以创建一个apache的核心程序包,和一个包含PHP3, mod_perl, mod_fastcgi等扩展功能的扩展包。

  • 更容易地开发 Apache模块原型,因为借用DSO和apxs,你可以脱离Apache的源码而只需apxs -i命令就可以开发和编译模块,利用apachectl restart 命令,就可以让新开发的模块在在apache服务器中运行。

DSO 也有下列不足::

  • DSO并不是在任何平台都可以使用,因为有一些平台不支持动态将一段代码加载到另一个程序的地址空间中

  • 服务器在启动时慢大约20%,因为加载器要作标志解析。

  • 在运行时,在有些平台上服务器大约慢5%,因为PIC( position independent code )代码需要更复杂的组配技巧来解决相对地址的问题,而对绝对地址的情况没有这种开销所以会快一些。

  • 因为并不是所有的平台都支持DSO模块连接(ld -lfoo)其它基于DSO的库(如基于out的平台通常不提供这个功能而基于ELF的平台则可以),所以不能将DSO机制用于所有类型的模块。换句话 说,可以编译为DSO文件的模块限制为那些:引用的标志只来自apache内核、来自C函数库(libc)、来自其它的Aapche内核使用的动态或静态 库、或含有PIC代码的静态库文件(libfoo.a)。使用其它代码的唯一机会,要么确定apache内核已经对此引用,要能自己通过dlopen() 加载代码。

参考文献:
Dynamic Shared Object (DSO) Support

分享到:
评论

相关推荐

    关于Delphi7的IntraWeb编译的Apache(DSO)模块

    - 编译完成后会得到一个名为`IWDSOProject.so`的文件,该文件将在Apache服务器中作为DSO模块被加载。 3. **配置Apache服务器**: - 修改Apache的配置文件`httpd.conf`,加入以下内容: ```apacheconf ...

    如何配置静/动态编译Apache+Php+MySQL

    Apache+PHP+MySQL 的配置涉及三个关键组件:Apache HTTP 服务器、PHP 解释器和 MySQL 数据库管理系统。...在生产环境中,推荐使用预编译的二进制包或者软件包管理器进行安装,以简化维护和更新流程。

    编译安装httpd-2.4.251

    编译安装httpd-2.4.25是指在Linux系统中安装Apache HTTP Server的过程。Apache HTTP Server是一个开源的Web服务器软件,广泛应用于Web开发和生产环境中。下面是编译安装httpd-2.4.25的详细步骤和相关知识点: 一、...

    Linux系统上把PHP编译进Apache静态内核

    在编译Apache时,需要使用`./configure`命令,并通过`--disable-module=all`禁用所有默认模块,然后启用基本模块如access、log_config、dir和mime。若选择DSO模式,应添加`--enable-module=so`选项。但在这里,我们...

    Apache2.2.15安装及配置过程

    在本文中,我们将详细阐述如何安装这个特定版本的Apache,并介绍反向代理配置的基本步骤。 首先,要安装Apache 2.2.15,你需要从Apache官方主页下载对应的安装文件,通常是`.tar.gz`格式的压缩包。下载完成后,通过...

    编译Apache配置

    - 编译Apache时,使用`./configure`命令指定安装路径和其他选项,如`--enable-modules=so`和`--enable-rewrite`,前者启用DSO模式安装,后者开启URL重写功能。 6. **启动Apache**:安装完成后,通过`/usr/local/...

    系统中的配置

    【系统中的配置】——Linux环境下Apache+PHP+MySQL三合一安装步骤详解 在Linux系统中,构建一个基于Apache、PHP和MySQL的环境是常见的需求,主要用于网页...在生产环境中,通常推荐使用DSO编译,以便于管理和维护。

    Apache-WebLogic plub-in插件的安装

    此命令会将`mod_wl.so`复制到`APACHE_HOME/libexec`目录,并在`httpd.conf`配置文件中添加`LoadModule`指令,以加载weblogic_module。 为了使Apache-WebLogic Plugin正常工作,还需要在`httpd.conf`中设置一些参数...

    Apache技术文档

    “动态共享对象(DSO)支持”将解释Apache HTTP Server如何使用DSO模块来动态加载和链接模块,而不是在编译时就静态地链接这些模块。 “内容协商”部分将涵盖Apache HTTP Server如何根据客户端的偏好和能力来提供最...

    linux下集成Apache与weblogic

    3. 存在目录`APACHE_HOME/wwwpps/upload/province`,此目录将在配置过程中使用。 #### 二、具体配置步骤 ##### 2.1 在Apache下安装支持WebLogic的SO模块 在`WEBLOGIC_HOME/weblogic81/server/lib/linux/i686`目录下...

    linux下安装apache

    在本文中,我们将详细介绍 Linux 下安装 Apache 遇到的问题,以及解决办法。 一、安装前准备 在安装 Apache 之前,需要将源文件存放在 /usr/local/src 目录下面。 Apache 的版本为 2.4.10,Mysql 的版本为 5.5.35...

    Apache HTTP Server Version 2.2 文档(2013.4.10最新)

    在Microsoft Windows中使用Apache 在Microsoft Windows上编译Apache ab - Apache HTTP服务器性能测试工具 apachectl - Apache HTTP服务器控制接口 apxs - Apache 扩展工具 configure - 配置源代码树 dbmmanage - ...

    linux下集成Apache与weblogic.pdf

    此外,你可以在`httpd.conf`文件中配置Apache-WebLogic插件的参数,这些参数应该包含在`<IfModule mod_weblogic.c></IfModule>`标签内。例如,`WebLogicHost`和`WebLogicPort`是两个重要的参数: - `WebLogicHost`:...

    Apache 服务器的配置

    在这个例子中,配置命令包括设置配置文件路径、数据文件路径、日志文件路径,启用常用模块,并以DSO(Dynamic Shared Object)模式编译,这样可以方便地添加或移除模块而无需重新编译整个服务器。 配置脚本执行后,...

    用Apache架设Web服务器(详解).docx

    Apache HTTP Server 是一款开源、免费且广泛使用的Web服务器软件,尤其在Linux系统中非常常见。在本文档中,我们将深入探讨如何在Linux环境下安装和配置Apache服务器。 首先,安装Apache涉及以下几个步骤: 1. 从...

    apache doc

    - **3.8 相关问题**:讨论在配置和使用虚拟主机过程中可能遇到的问题及解决方案。 以上内容总结了 Apache HTTP Server 文档中的关键知识点,涵盖了从基本的安装配置到高级功能如 URL 重写、虚拟主机配置等。这些...

    Apache优化全面详细教程

    为了充分利用Zend Performance Suite的功能,建议将PHP编译进Apache或使用DSO(Dynamic Shared Object,动态共享对象)模式而非CGI方式。DSO模式能够显著提高效率,因为Apache采用了模块化设计,能够支持多种服务器...

    linux下resin与apache整合.pdf

    确保Apache支持DSO模块,可以运行`/usr/local/apache/bin/httpd -l`查看编译进Apache的模块列表。 为了配置Apache支持JSP,我们需要在`conf/httpd.conf`中的`DirectoryIndex`后面添加`index.jsp`,这样Apache就会...

Global site tag (gtag.js) - Google Analytics