Apache HTTP Server 版本2.2
apxs
是一個(gè)為Apache HTTP服務(wù)器編譯和安裝擴(kuò)展模塊的工具,用于編譯一個(gè)或多個(gè)源程序或目標(biāo)代碼文件為動(dòng)態(tài)共享對(duì)象,使之可以用由mod_so
提供的LoadModule
指令在運(yùn)行時(shí)加載到Apache服務(wù)器中。
因此,要使用這個(gè)擴(kuò)展機(jī)制,你的平臺(tái)必須支持DSO特性,而且Apache httpd
必須內(nèi)建了mod_so
模塊。apxs
工具能自動(dòng)探測是否具備這樣的條件,你也可以自己用這個(gè)命令手動(dòng)探測:
$ httpd -l
該命令的輸出列表中應(yīng)該有mod_so
模塊。如果所有這些條件均已具備,則可以很容易地借助apxs
安裝你自己的DSO模塊以擴(kuò)展Apache服務(wù)器的功能:
$ 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
$ _
其中的參數(shù)files可以是任何C源程序文件(.c)、目標(biāo)代碼文件(.o)、甚至是一個(gè)庫(.a)。apxs
工具會(huì)根據(jù)其后綴自動(dòng)編譯C源程序或者連接目標(biāo)代碼和庫。但是,使用預(yù)編譯的目標(biāo)代碼時(shí),必須保證它們是地址獨(dú)立代碼(PIC),使之能被動(dòng)態(tài)地加載。如果使用GCC編譯,則應(yīng)該使用 -fpic
參數(shù);如果使用其他C編譯器,則應(yīng)該查閱其手冊,為apxs
使用相應(yīng)的編譯參數(shù)。
有關(guān)Apache對(duì)DSO的支持的詳細(xì)信息,可以閱讀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
(模板生成)選項(xiàng)的模塊名稱。對(duì) -g
選項(xiàng),它是必須的;對(duì) -i
選項(xiàng),apxs
工具會(huì)根據(jù)源代碼判斷,或(在失敗的情況下)按文件名推測出這個(gè)模塊的名稱。-q
apxs
設(shè)置的信息。該選項(xiàng)的query參數(shù)可以是下列一個(gè)或多個(gè)字符串:CC
, CFLAGS
, CFLAGS_SHLIB
, INCLUDEDIR
, LD_SHLIB
, LDFLAGS_SHLIB
, LIBEXECDIR
, LIBS_SHLIB
, SBINDIR
, SYSCONFDIR
, TARGET
。
這個(gè)參數(shù)用于手動(dòng)查詢某些設(shè)置。比如,要手動(dòng)處理Apache的C頭文件,可以在Makefile中使用:
INC=-I`apxs -q INCLUDEDIR`
-S name=value
-g
-n
)和其中的兩個(gè)文件:一個(gè)是名為mod_name.c
的樣板模塊源程序,可以用來建立你自己的模塊,或是學(xué)習(xí)使用apxs機(jī)制的良好開端;另一個(gè)則是對(duì)應(yīng)的Makefile
,用于編譯和安裝此模塊。-c
-o
選項(xiàng),則此輸出文件名由files中的第一個(gè)文件名推測得到,也就是默認(rèn)為mod_name.so
。-o dsofile
mod_unknown.so
。-D name=value
-I incdir
-L libdir
-l libname
-Wc,compiler-flags
libtool --mode=compile
中附加compiler-flags ,以增加編譯器特有的選項(xiàng)。-Wl,linker-flags
libtool --mode=link
中附加linker-flags ,以增加連接器特有的選項(xiàng)。-i
-a
LoadModule
行到httpd.conf
文件中,以激活此模塊,或者,如果此行已經(jīng)存在,則啟用之。-A
-a
選項(xiàng)類似,但是它增加的LoadModule
命令有一個(gè)井號(hào)前綴(#
),即此模塊已經(jīng)準(zhǔn)備就緒但尚未啟用。-e
-a
和 -A
選項(xiàng)配合使用,與 -i
操作類似,修改Apache的httpd.conf
文件,但是并不安裝此模塊。假設(shè)有一個(gè)擴(kuò)展Apache功能的模塊mod_foo.c
,使用下列命令,可以將C源程序編譯為共享模塊,以在運(yùn)行時(shí)加載到Apache服務(wù)器中:
$ 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的配置,以確保有一個(gè)LoadModule
指令來加載此共享對(duì)象。為了簡化這一步驟,apxs
可以自動(dòng)進(jìn)行該操作,以安裝此共享對(duì)象到"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]
$ _
如果配置文件中尚不存在,會(huì)增加下列的行:
LoadModule foo_module modules/mod_foo.so
如果你希望默認(rèn)禁用此模塊,可以使用 -A
選項(xiàng),即:
$ apxs -i -A mod_foo.c
要快速測試apxs機(jī)制,可以建立一個(gè)Apache模塊樣板及其對(duì)應(yīng)的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
$ _
然后,立即可以編譯此樣板模塊為共享對(duì)象并加載到Apache服務(wù)器中:
$ 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
$ _