apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由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
[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
$ _
其中的参数files可以是任何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 [ -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
查询某种apxs设置的信息。该选项的query参数可以是下列一个或多个字符串:CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET 。
这个参数用于手动查询某些设置。比如,要手动处理Apache的C头文件,可以在Makefile中使用:
INC=-I`apxs -q INCLUDEDIR`
配置选项
-S name=value
此选项可以改变apxs的上述设置。
模板生成选项
-g
此选项生成一个名为name的子目录(见选项 -n)和其中的两个文件:一个是名为mod_name.c的样板模块源程序,可以用来建立你自己的模块,或是学习使用apxs机制的良好开端;另一个则是对应的Makefile ,用于编译和安装此模块。
DSO编译选项
-c
此选项表示需要执行编译操作。它首先会编译C源程序(.c)files为对应的目标代码文件(.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
此选项用于向编译命令 libtool --mode=compile 中附加compiler-flags ,以增加编译器特有的选项。
-Wl,linker-flags
此选项用于向连接命令 libtool --mode=link 中附加linker-flags ,以增加连接器特有的选项。
DSO的安装和配置选项
-i
此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-a
此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-A
与 -a 选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
-e
表示需要执行编辑操作,它可以与 -a 和 -A 选项配合使用,与 -i 操作类似,修改Apache的httpd.conf文件,但是并不安装此模块。
举例
假设有一个扩展Apache功能的模块mod_foo.c ,使用下列命令,可以将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
[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
这里讲一个实例 如何安装mod_perl模块
现在网上已经有大量的关于成功运行mod_perl模块的介绍, 该模块可以让Perl程序员更
好地控制 Apache服务器。一旦Apache服务器中内置了mod_perl的Perl解释器, Perl脚
本就可以快速执行,使得你的网页的访问者无需等待。
如果你打算扩展Apache Web server的功能,你可以试试mod_perl模块的威力。模块是个集成到一起的程序集合,可以让网络开发者扩展其服务器的功能,而无需修改服务器软件自身。一旦有了模块,你就可以增强服务器的功能,例如在指定的时间段内,可以重定向URL,或者也可以对你的服务器进行优化,以便让Perl脚本运行得更快。
现已经有大量功能强大的mod_perl模块的例子, 该模块可以让Perl程序员更好地控制其
Apache服务器。Apache服务器中内置了mod_perl的Perl解释器, 使得Perl脚本可以快
速执行,你的网页的访问者就无需等待。
我将介绍两个关于安装模块的例子,其中第二个例子将介绍mod_perl模块。一旦你了
解了这个过程,你就可以为Apache网络服务器配置其它各种不同的模块。请看
Apache Module Registry,了解一下可以下载哪些增强的功能。
模块入门
扩展使用模块的Apache是相当方便的, 只要下载打算要用的模块。要了解如何
安装和使用模块,我用如下一个简单的例子来阐明:当服务器接收到一个给定页面
的请求时,服务器返回"Hello World"。
假设你已经完成如下工作:在Apache安装时,已经带有了编译过的 mod_so模块,如果
已经完成该步,就可以添加新模块到Apache中,而无须再编译。为了判断是否已经安装
编译过的 mod_so模块,可以运行/httpd -l , 看看是否有mod_so。 如果没有,
请阅读Dynamic Shared Object的中有关技术资料,重新配制你的服务器,以便包含mod_so。
要运行Hello World模块, 先要下载mod_hello_world.c 文件,该.c文件是用来编译
成.so文件的,你要使用apxs命令来进行编译,可以把编译后的文件保存在任何地方,
你可以执行类似如下的命令:
apxs -c -o mod_babble.so mod_babble.c
为了让Hello World模块能够在你的服务器上运行,就要编译mod_hello_world,之
后,就会创建一个名为mod_hello_world.so的文件,把该文件复制到Apache的libexec目
录中,此时,我们已经完成了一半的任务,我们现在只要修改conf目录中的httpd.conf
文件:打开httpd.conf文件,找到LoadModule 行,在该部分的最后一行后面,添加如下行:
LoadModule hello_world_module libexec/mod_hello_world.so
如果你有ClearModuleList,在你的配置文件中就会有AddModule部分,(如果你
没有ClearModuleList,你可以跳过此步)在AddModule部分的末尾,添加如下行:
AddModule mod_hello_world.c
最后,在配置文件的AddModule部分后面的任何一处,添加如下内容:
SetHandler hello_world
该行告诉Apache,任何对名为"/hello"的页面的请求,将会被转到
hello_world模块,现在,重新启动网络服务器,发出请求: .
你将在你的浏览器中看到"Hello World!" 。
选择合适的模块
我们现在遇到的最大问题是:在构造模块时,只用到C语言编写的模块, 为了让这
些程序能够在特定的服务器上运行,这些源程序在编译时还必须带上正确的编译开关。
在每次安装Apache时,都必须重新编译这些源程序。要了解使用哪些编译开关的问题,
可以通过运行Apache附带的apxs脚本来获得,但是每次在新的服务器上运行时,都得重
新编译该模块,重新编译始终是个问题。
有个模块可以解决这些问题,而且该模块还带有更多其他的功能,这就是mod_perl模块,
其功能很强大,本文只能为大家作一些该模块的简单介绍。
为什么使用mod_perl?
mod_perl 模块的提供的一个特色是:可以用Perl语言来编写Apache 模块,Perl 是
解释性语言,其优缺点并存。解释性语言的一个主要优点是:每次安装服务器时,不必重新
编译这个模块。缺点是需要一个解释器来阅读和执行实际的程序,这会降低服务器的运行速度,
通过在启动Apache服务器的同时,启动Perl解释器,这样mod_perl就克服了运行速度减慢的问题。
Perl解释器还可以对服务器上的Perl代码进行预先解释,并可以随时捕捉到它,以便一旦
要用到该段代码时,能够快速执行。
使用mod_perl
mod_perl可以从mod_perl中下载得到 。对于mod_perl的安装和编译的介绍,超出了本文的篇幅,
在网上和mod_perl模块中就提供了不少技术参考资料。为了向大家演示Perl模块的使用,
我下载并复制了Hello.pm,这是个用Perl语言写的Hello World模块。你可以在Perl 5 Module List中找到更多的Perl模块。
现在,我们需要设置Apache服务器,以便它可以找到我们希望使用的模块。一开始,
要使用mod_perl,我们需要创建一个名为startup.pl 的文件,该文件将为mod_perl所使用,
将会告诉mod_perl所有已安装程序的位置。我们将创建一个最小的startup.pl 文件,可以
用它来访问要运行的Hello World模块,要使得其他模块来说,也能够正常工作,就需要
修改startup.pl 文件。在你的startup.pl 文件中,应包含如下内容:
# Always a good thing to put at the top of every mod_perl script. This will
# save many headaches as you work.
use strict;
# Tell mod_perl where to find Hello.pm module
use lib qw(path/to/module)
# The name of the module to load using mod_perl
use Apache::Hello;
# This script must return TRUE, and this line accomplishes that, and conveniently
# also checks to ensure that we are actually running mod_perl with our version
# of Apache.
$ENV{MOD_PERL} or die "not running under mod_perl!";
下一步,要使得Hello World模块可以运行,就要对Apache服务器进行配置,以便
使用 mod_perl。在前面的例子中,我们使用了作为
访问用C语言编写的模块的请求。 对于Perl模块,我们使用hello_perl。要设置得正确,
就需要编辑httpd.conf 文件。在AddModule行后面的某处添加如下内容:
PerlRequire /path/to/startup.pl.
.
SetHandler perl-script.
PerlHandler Apache::Hello.
.
PerlRequire行告诉mod_perl到何处去寻找我们先前已经创建的startup.pl文件。
标记为Location 的一节将告诉Apache服务器,对/hello_perl的请求应该用一个特殊
的方式进行处理。在该节里,存在两个指示语:SetHandler和PerlHandler。
SetHandler指示语将告诉Apache,把所有的访问请求发送到mod_perl,之后PerlHandler
就指示mod_perl应该把这些请求转发到Hello World的Perl模块。
仅剩下最后一个步骤了:把Hello.pm文件复制到适当的位置。一旦创建了startup.pl文件,
我们就规定好了Hello.pm模块的位置。我们需要在那个位置创建一个目录,把Hello.pm文件
复制到该Apache目录中,所以,如果要在startup.pl 文件中把path/to/module设置
为/usr/local/apache/perl/modules,就可以执行如下命令:
mkdir /usr/local/apache/perl/modules/Apache
cp Hello.pm
/usr/local/apache/perl/modules/Apache
这就把Hello World模块放到Apache名称空间中,确保没有其他的Perl脚本同它冲突。
此时, Apache和mod_perl都已经设置好,可以运行Hello World了。我们可以重启动服务器。
一旦服务器重启动之后,在你的浏览器位置栏打入 ,你可以看到如下信息:
Hello, I see you see me with Lynx/2.8.3dev.8 libwww-FM/2.14
本文介绍了如何添加外部模块到现有的Apache服务器中, 在网上,除了用C语言
和Perl语言编写的模块之外,也有一些用 Python 语言写的模块可供你下载,并配置到Apache服务器中,
本文也介绍如何自己编写模块,并配置到Apache服务器中的资料。