Apache HTTP Server 版本 2.4
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
源代码文件。
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
工具会尝试从源代码中确定名称,或者至少从文件名中猜测名称。-q
httpd
的变量和环境设置。在没有 query 参数的情况下调用时,它会打印所有已知变量及其值。可选的 -v
参数会格式化列表输出。使用此选项手动确定用于构建将加载您的模块的 httpd
的设置。例如,使用
INC=-I`apxs -q INCLUDEDIR`
在您自己的 Makefile 中,如果您需要手动访问 Apache 的 C 头文件。
-S name=value
-g
-n
选项)的子目录,其中包含两个文件:一个名为 mod_name.c
的示例模块源代码文件,可作为创建您自己的模块的模板,或作为快速入门,用于尝试 apxs 机制。以及一个相应的 Makefile
,用于更轻松地构建和安装此模块。-c
-o
选项,则输出文件名将从 files 列表中的第一个文件名中猜测,因此通常默认为 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
-i
-a
LoadModule
行添加到 Apache 的 httpd.conf
配置文件,或通过启用它(如果它已经存在),来激活模块。-A
-a
选项相同,但创建的 LoadModule
指令前面带有井号 (#
),即模块只是为以后激活做好准备,但最初处于禁用状态。-e
-a
和 -A
选项一起使用,类似于 -i
操作,用于编辑 Apache 的 httpd.conf
配置文件,而不会尝试安装模块。假设您有一个名为 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 已启动
$ _