http://andrew913.iteye.com/blog/398648html
首先來介紹下apache的一個工具apxs。apxs是一個爲Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件爲動態共享對象,使之能夠用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。 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這個函數。本例子是一個很是簡單的內容生成器。 spa
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內容生成器模塊已經開發好了,固然應用比較普遍的是過濾器模塊的開發,最近項目主要也是用過濾器來實現的。 rest
Ubuntu apache2下默認的模塊都在 /usr/lib/apache2/modules/下面,code
重啓apache時,須要sudo /etc/init.d/apache2 restart,才能成功,不然會出現錯誤htm