http://andrew913.iteye.com/blog/398648
首先來介紹下apache的一個工具apxs。apxs是一個為Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件為動態共享對象,使之可以用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。
注意在Ubuntu apache2下 apxs為apxs2,另外非源碼包安裝的apache2 是不帶有apxs2 的。
1.apxs -g -n helloworld
上面的命令可以幫助我們產生一個模塊名字為helloworld的模板。
上面的命令會產生以下代碼
#include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "ap_config.h" /* The sample content handler */ static int helloworld_handler(request_rec *r) { if (strcmp(r->handler, "helloworld")) { return DECLINED; } r->content_type = "text/html"; if (!r->header_only) ap_rputs("The sample page from mod_helloworld.c\n", r); return OK; } static void helloworld_register_hooks(apr_pool_t *p) { ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA helloworld_module = { STANDARD20_MODULE_STUFF, //用於編譯后的模塊產生版本信息 NULL, /* 創建目錄配置結構*/ NULL, /* 合並目錄配置結構 */ NULL, /* 創建主機配置結構 */ NULL, /* 合並主機配置結構 */ NULL, /* 為模塊配置相關指令 */ helloworld_register_hooks /* 注冊模塊的鈎子函數 */ };
我們來看下helloworld_module這個結構體,它沒個成員的具體作用請看注釋。
它最關鍵的參數為最后一個,這個參數是一個注冊鈎子函數指針,也就是說當我們把模塊加入到apache里面去的時候,他會執行這個注冊函數。在這個函數里面我們將會注冊我們所要添加的鈎子。
本例子中我們用的是
ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);
這個處理函數,這個處理函數注冊了helloworld_handler這個函數。這個函數用於處理我們的請求。
我們來講下執行的順序,模塊加載-》執行helloworld_register_hooks函數-》注冊helloworld_handler這個函數到鈎子上去。
這樣一來:當一個http請求來的時候,我們就會自動去執行helloworld_handler這個函數。本例子是一個非常簡單的內容生成器。
if (strcmp(r->handler, "helloworld")) {//判斷是否是這個helloworld handler return DECLINED;// } r->content_type = "text/html"; if (!r->header_only) ap_rputs("The sample page from mod_helloworld.c\n", r);//內容生成 return OK;
下面我們將來進行編譯
執行:apxs -c mod_helloworld.c
執行成功以后我們可以發現在.libs下面會出現mod_helloworld.so這個模塊文件。這就是我們所需要的,對於apache一些自帶的模塊一般都放在安裝目錄的modules/下面。
下面我們來對其進行配置
打開httpd.conf文件,添加以下信息
LoadModule helloworld_module *****// 指定.so文件的路徑。 <Location /helloworld> setHandler helloworld </Location>
Ok ,重啟apache 然后輸入 http://loacalhost/helloworld 就可以看到
The sample page from mod_helloworld.c
當然這里這里只是輸出一句話,我們也可以打印很多html信息,就類似於servlet一樣。
這樣一來一個簡單的apache內容生成器模塊已經開發好了,當然應用比較廣泛的是過濾器模塊的開發,最近項目主要也是用過濾器來實現的。
Ubuntu apache2下默認的模塊都在 /usr/lib/apache2/modules/下面,
重啟apache時,需要sudo /etc/init.d/apache2 restart,才能成功,否則會出現錯誤