On this page
apxs-APache eXtenSion 工具
apxs
是用于为 Apache 超文本传输协议(HTTP)服务器构建和安装扩展模块的工具。这是通过从一个或多个源文件或目标文件构建动态共享库(DSO)来实现的,然后可以在运行时通过mod_so的LoadModule指令将其加载到 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
,这是必需的,对于选项-i
,apxs
工具尝试至少从文件名中猜测源名称来确定名称(或作为备用)。
- 这将显式设置
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
。
- 这表示编译操作。它首先将文件的 C 源文件(.c)编译为相应的目标文件(.o),然后通过链接这些目标文件以及文件的其余目标文件(.o 和.a)在 dsofile 中构建动态共享的对象。如果未指定
-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
配置文件中,或者如果已经存在则启用它来激活该模块。
- 通过自动将相应的LoadModule行添加到 Apache 的
-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 $ _