# apxs - Apache 擴展工具
`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
$ _
```
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航