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
工具尝试至少从文件名中猜测源名称来确定名称(或作为备用)。-q
httpd
。在没有查询参数的情况下调用时,它将打印所有已知变量及其值。可选-v
参数格式化列表输出。
使用它来手动确定用于构建
httpd
将加载模块的设置。例如使用
INC=-I`apxs -q INCLUDEDIR`
如果您需要手动访问Apache的C头文件,请在自己的Makefile中使用。
-S name=value
-g
-n
),并有两个文件:一个名为的示例模块源文件
,可以用作创建自己的模块的模板或用作使用apxs机制的快速入门。以及一个相应的模块,用于更轻松地构建和安装该模块。mod_name.c
Makefile
-c
-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
-i
-a
LoadModule
行添加到Apache的httpd.conf
配置文件或激活该模块(如果已经存在)来
激活该模块
。-A
-a
但所创建的LoadModule
指令的前缀为井号(#
),即,该模块仅准备用于以后的激活,但最初被禁用。-e
-a
和-A
选项一起使用,
类似于在
不尝试安装模块的情况下-i
编辑Apache的httpd.conf
配置文件的
操作。假设您有一个名为mod_foo.c
available 的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
$ _