<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 程序

apxs - APache eXtenSion 工具

可用语言:  en  |  fr  |  ko  |  tr 

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

因此,要使用此扩展机制,您的平台必须支持 DSO 功能,并且您的 Apache httpd 二进制文件必须使用 mod_so 模块构建。如果情况并非如此,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
[在 /path/to/apache/etc/httpd.conf 中激活 `foo` 模块]
$ apachectl restart
/path/to/apache/sbin/apachectl restart: httpd 未运行,尝试启动
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): 加载模块 foo_module
/path/to/apache/sbin/apachectl restart: httpd 已启动
$ _

文件 参数可以是任何 C 源代码文件 (.c)、目标文件 (.o) 甚至库存档 (.a)。apxs 工具会自动识别这些扩展名,并自动使用 C 源代码文件进行编译,而只使用目标文件和存档文件进行链接阶段。但是,在使用这种预编译的目标文件时,请确保它们是为位置无关代码 (PIC) 编译的,以便能够用于动态加载的共享对象。例如,使用 GCC 时,您只需要使用 -fpic。对于其他 C 编译器,请查阅其手册页或查看 apxs 用于编译目标文件的标志。

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

Support Apache!

另请参阅

top

概要

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

top

选项

常用选项

-n modname
此选项显式设置 -i(安装)和 -g(模板生成)选项的模块名称。使用此选项显式指定模块名称。对于 -g 选项,这是必需的;对于 -i 选项,apxs 工具会尝试从源代码中确定名称,或者至少从文件名中猜测名称。

查询选项

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

使用此选项手动确定用于构建将加载您的模块的 httpd 的设置。例如,使用

INC=-I`apxs -q INCLUDEDIR`

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

配置选项

-S name=value
此选项更改上述 apxs 设置。

模板生成选项

-g
此选项会生成一个名为 name(请参见 -n 选项)的子目录,其中包含两个文件:一个名为 mod_name.c 的示例模块源代码文件,可作为创建您自己的模块的模板,或作为快速入门,用于尝试 apxs 机制。以及一个相应的 Makefile,用于更轻松地构建和安装此模块。

DSO 编译选项

-c
此选项表示编译操作。它首先将 files 中的 C 源代码文件 (.c) 编译成相应的目标文件 (.o),然后通过链接这些目标文件以及 files 中剩余的目标文件 (.o 和 .a) 来构建 dsofile 中的动态共享对象。如果未指定 -o 选项,则输出文件名将从 files 列表中的第一个文件名中猜测,因此通常默认为 mod_name.so
-o dsofile
显式指定创建的动态共享对象的文件名。如果未指定,并且无法从 files 列表中猜测名称,则使用回退名称 mod_unknown.so
-D name=value
此选项会直接传递到编译命令。使用此选项将您自己的定义添加到构建过程中。
-I incdir
此选项会直接传递到编译命令。使用此选项将您自己的包含目录添加到构建过程中的搜索路径中。
-L libdir
此选项会直接传递到链接器命令。使用此选项将您自己的库目录添加到构建过程中的搜索路径中。
-l libname
此选项会直接传递到链接器命令。使用此选项将您自己的库添加到构建过程中的搜索路径中。
-Wc,compiler-flags
此选项会将 compiler-flags 作为附加标志传递到 libtool --mode=compile 命令。使用此选项添加本地编译器特定选项。
-Wl,linker-flags
此选项会将 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
此选项表示编辑操作,可以与 -a-A 选项一起使用,类似于 -i 操作,用于编辑 Apache 的 httpd.conf 配置文件,而不会尝试安装模块。
top

示例

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

然后,您必须更新 Apache 配置,确保存在一个 LoadModule 指令来加载此共享对象。为了简化此步骤,apxs 提供了一种自动方式来将共享对象安装到其“modules”目录中,并相应地更新 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
[在 /path/to/apache/conf/httpd.conf 中激活 `foo` 模块]
$ _

这样,如果配置文件中不存在,就会添加名为

LoadModule foo_module modules/mod_foo.so

的行。如果您希望默认情况下禁用它,请使用 -A 选项,即

$ apxs -i -A mod_foo.c

要快速测试 apxs 机制,您可以通过以下命令创建一个示例 Apache 模块模板以及一个相应的 Makefile。

$ apxs -g -n foo
正在创建 [DIR] foo
正在创建 [FILE] foo/Makefile
正在创建 [FILE] foo/modules.mk
正在创建 [FILE] foo/mod_foo.c
正在创建 [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
[在 /path/to/apache/conf/httpd.conf 中激活 `foo` 模块]
apachectl restart
/path/to/apache/sbin/apachectl restart: httpd 未运行,尝试启动
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): 加载模块 foo_module
/path/to/apache/sbin/apachectl restart: httpd 已启动
$ _

可用语言:  en  |  fr  |  ko  |  tr 

top

评论

注意
这不是问答部分。此处发布的评论应针对改进文档或服务器的建议,如果这些建议已实施或被认为无效/与主题无关,则可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表