apxs是用于为Apache超文本传输协议(HTTP)服务器构建和安装扩展模块的工具。这是通过从一个或多个源文件或目标文件构建动态共享库(DSO)来实现的,然后可以在运行时通过LoadModule
    from指令将其加载到Apache服务器中mod_so。
因此,要使用此扩展机制,您的平台必须支持DSO功能,并且httpd必须使用该mod_so模块构建Apache 二进制文件
     。apxs如果不是这种情况,该工具会自动进行投诉。您可以通过手动运行命令自己检查
      $ httpd -l
    
该模块mod_so应该是显示列表的一部分。如果满足了这些要求,则可以借助此apxs工具通过使用DSO机制安装自己的模块来轻松扩展Apache服务器的功能:
      $ apxs -i -a -c mod_foo.c
      gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
      ld -Bshareable -o mod_foo.so mod_foo.o
      cp mod_foo.so /path/to/apache/modules/mod_foo.so
      chmod 755 /path/to/apache/modules/mod_foo.so
      [activating module `foo' in /path/to/apache/etc/httpd.conf]
      $ apachectl restart
      /path/to/apache/sbin/apachectl restart: httpd not running, trying to start
      [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
      /path/to/apache/sbin/apachectl restart: httpd started
      $ _
    
参数文件可以是任何C源文件(.c),目标文件(.o)或库归档文件(.a)。该apxs工具会自动识别这些扩展名,并自动将C源文件用于编译,而仅将对象文件和归档文件用于链接阶段。但是,使用此类预编译对象时,请确保将其编译为位置无关代码(PIC),以便能够将其用于动态加载的共享对象。例如,对于GCC,您始终只需要使用即可-fpic。对于其他C编译器,请查阅其手册页或关注标志apxs用于编译目标文件的信息。
有关Apache中DSO支持的更多详细信息,请阅读
     mod_so甚至可能阅读
     src/modules/standard/mod_so.c源文件的文档。
apxs -g
    [ -S name=value ]
    -n modname
apxs -q
    [ -v ]
    [ -S name=value ]
    query ...
apxs -c
    [ -S name=value ]
    [ -o dsofile ]
    [ -I incdir ]
    [ -D name=value ]
    [ -L libdir ]
    [ -l libname ]
    [ -Wc,compiler-flags ]
    [ -Wl,linker-flags ]
    files ...
apxs -i
    [ -S name=value ]
    [ -n modname ]
    [ -a ]
    [ -A ]
    dso-file ...
apxs -e
    [ -S name=value ]
    [ -n modname ]
    [ -a ]
    [ -A ]
    dso-file ...
-n modname-i(安装)和-g(模板生成)选项的模块名称。使用它来显式指定模块名称。对于选项,-g这是必需的,对于选项,-i该apxs工具尝试至少从文件名中猜测源名称来确定名称(或作为备用)。-qhttpd。在没有查询参数的情况下调用时,它将打印所有已知变量及其值。可选-v
      参数格式化列表输出。
      使用它来手动确定用于构建
       httpd将加载模块的设置。例如使用
        INC=-I`apxs -q INCLUDEDIR`
      
如果您需要手动访问Apache的C头文件,请在自己的Makefile中使用。
-S name=value-g-n),并有两个文件:一个名为的示例模块源文件
       ,可以用作创建自己的模块的模板或用作使用apxs机制的快速入门。以及一个相应的模块,用于更轻松地构建和安装该模块。mod_name.cMakefile-c-o指定选项,则从文件中的第一个文件名猜测输出文件,因此通常默认为。mod_name.so-o dsofilemod_unknown.so则使用后备名称。-D name=value-I incdir-L libdir-l libname-Wc,compiler-flagslibtool --mode=compile命令。使用此选项可添加特定于本地编译器的选项。-Wl,linker-flagslibtool --mode=link命令。使用它来添加特定于本地链接器的选项。-p-i-aLoadModule行添加到Apache的httpd.conf配置文件或激活该模块(如果已经存在)来
       激活该模块
       。-A-a但所创建的LoadModule指令的前缀为井号(#),即,该模块仅准备用于以后的激活,但最初被禁用。-e-a和-A选项一起使用,
       类似于在
      不尝试安装模块的情况下-i编辑Apache的httpd.conf配置文件的
       操作。假设您有一个名为mod_foo.cavailable 的Apache模块,该模块应该扩展Apache的服务器功能。为此,您首先必须通过以下命令将C源代码编译为适合在运行时加载到Apache服务器的共享库中:
      $ apxs -c mod_foo.c
      /path/to/libtool --mode=compile gcc ... -c mod_foo.c
      /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
      $ _
    
然后,您必须通过确保LoadModule存在用于加载此共享库的指令来更新Apache配置
     。为了简化此步骤,apxs提供了一种自动方法,将共享对象安装在其“模块”目录中,并相应地更新httpd.conf文件。这可以通过运行:
      $ apxs -i -a mod_foo.la
      /path/to/instdso.sh mod_foo.la /path/to/apache/modules
      /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
      ...
      chmod 755 /path/to/apache/modules/mod_foo.so
      [activating module `foo' in /path/to/apache/conf/httpd.conf]
      $ _
    
这样一条线叫
      LoadModule foo_module modules/mod_foo.so
    
如果仍然不存在,则会将其添加到配置文件。如果要默认禁用此功能,请使用该-A选项,
     即
      $ apxs -i -A mod_foo.c
    
为了快速测试apxs机制,您可以通过以下方法创建示例Apache模块模板以及相应的Makefile:
      $ apxs -g -n foo
      Creating [DIR]  foo
      Creating [FILE] foo/Makefile
      Creating [FILE] foo/modules.mk
      Creating [FILE] foo/mod_foo.c
      Creating [FILE] foo/.deps
      $ _
    
然后,您可以立即将此示例模块编译为共享对象,并将其加载到Apache服务器中:
      $ cd foo
      $ make all reload
      apxs -c mod_foo.c
      /path/to/libtool --mode=compile gcc ... -c mod_foo.c
      /path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
      apxs -i -a -n "foo" mod_foo.la
      /path/to/instdso.sh mod_foo.la /path/to/apache/modules
      /path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
      ...
      chmod 755 /path/to/apache/modules/mod_foo.so
      [activating module `foo' in /path/to/apache/conf/httpd.conf]
      apachectl restart
      /path/to/apache/sbin/apachectl restart: httpd not running, trying to start
      [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
      /path/to/apache/sbin/apachectl restart: httpd started
      $ _