apxs-APache eXtenSion 工具

apxs是用于为 Apache 超文本传输协议(HTTP)服务器构建和安装扩展模块的工具。这是通过从一个或多个源文件或目标文件构建动态共享库(DSO)来实现的,然后可以在运行时通过mod_soLoadModule指令将其加载到 Apache 服务器中。

因此,要使用此扩展机制,您的平台必须支持 DSO 功能,并且必须使用mod_so模块构建您的 Apache httpd二进制文件。如果不是这种情况,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工具会自动识别这些 extensions,并自动将 C 源文件用于编译,而仅将对象文件和归档文件用于链接阶段。但是,当使用此类预编译对象时,请确保将其编译为位置无关代码(PIC),以便能够将其用于动态加载的共享对象。例如,对于 GCC,您始终只需要使用-fpic即可。对于其他 C 编译器,请查阅其手册页或注意apxs用于编译目标文件的标志。

有关 Apache 中 DSO 支持的更多详细信息,请阅读mod_so的文档,或者甚至阅读src/modules/standard/mod_so.c源文件。

Synopsis

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 ...

Options

Common Options

  • -n modname

    • 这将显式设置-i(安装)和-g(模板生成)选项的模块名称。使用它来显式指定模块名称。对于选项-g,这是必需的,对于选项-iapxs工具尝试至少从文件名中猜测源名称来确定名称(或作为备用)。

Query Options

  • -q

    • 查询用于构建httpd的变量和环境设置。在不使用查询参数的情况下调用时,它将打印所有已知变量及其值。可选的-v参数格式化列表输出。

使用它来手动确定用于构建将加载模块的httpd的设置。例如使用

INC = -I''

如果您需要手动访问 Apache 的 C 头文件,请在自己的 Makefile 中使用。

Configuration Options

  • -S name=value

    • 此选项更改上述 apxs 设置。

模板生成选项

  • -g

    • 这将生成一个子目录名称(请参阅选项-n),并有两个文件:名为mod_name.c的示例模块源文件,可以用作创建自己的模块的模板或用作使用 apxs 机制的快速入门。以及相应的Makefile,以便更轻松地构建和安装此模块。

DSO 编译选项

  • -c

    • 这表示编译操作。它首先将文件的 C 源文件(.c)编译为相应的目标文件(.o),然后通过链接这些目标文件以及文件的其余目标文件(.o 和.a)在 dsofile 中构建动态共享的对象。如果未指定-o选项,则从文件中的第一个文件名猜测输出文件,因此通常默认为mod_name.so
  • -o dsofile

    • 明确指定创建的动态共享对象的文件名。如果未指定,并且无法从文件列表中猜测名称,则使用后备名称mod_unknown.so
  • -D name=value

    • 此选项直接传递给编译命令。使用它可以在构建过程中添加自己的定义。
  • -I incdir

    • 此选项直接传递给编译命令。使用它来添加您自己的包含目录以搜索到构建过程。
  • -L libdir

    • 此选项直接传递给链接器命令。使用它来添加您自己的库目录以搜索到构建过程。
  • -l libname

    • 此选项直接传递给链接器命令。使用它来添加您自己的库以搜索到构建过程。
  • -Wc,compiler-flags

    • 此选项将编译器标志作为附加标志传递给libtool --mode=compile命令。使用此选项可添加特定于本地编译器的选项。
  • -Wl,linker-flags

    • 此选项将链接程序标志作为附加标志传递给libtool --mode=link命令。使用此选项可添加特定于本地链接器的选项。
  • -p

    • 此选项使 apxs 链接到 apr/apr-util 库。当编译使用 apr/apr-util 库的帮助程序时,这很有用。

DSO 安装和配置选项

  • -i

    • 这指示安装操作,并将一个或多个动态共享的对象安装到服务器的 modules 目录中。
  • -a

    • 通过自动将相应的LoadModule行添加到 Apache 的httpd.conf配置文件中,或者如果已经存在则启用它来激活该模块。
  • -A

    • 与选项-a相同,但创建的LoadModule伪指令以井号(#)开头,该模块只是为以后的激活做准备,但最初被禁用。
  • -e

    • 这表示编辑操作,可以与-i操作类似地与-a-A选项一起使用,以编辑 Apache 的httpd.conf配置文件,而无需尝试安装模块。

Examples

假设您有一个名为mod_foo.c的 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 $ _