apache模組開發之helloworld

Just4life發表於2013-07-19
學習apache模組開發已經快兩個星期了,感覺搞apache模組開發挺有意思的,下面來講講apache模組開發的helloworld,非常簡單。
Apache  模組開發主要採用掛鉤子的方法來實現模組開發的,這和linux核心模組開發有點像,說白了就是加一個回撥函式。下面我們來講 這個例子吧。
首先來介紹下apache的一個工具apxs。apxs是一個為Apache HTTP伺服器編譯和安裝擴充套件模組的工具,用於編譯一個或多個源程式或目的碼檔案為動態共享物件,使之可以用由mod_so提供的LoadModule指令在執行時載入到Apache伺服器中。

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內容生成器模組已經開發好了,當然應用比較廣泛的是過濾器模組的開發,最近專案主要也是用過濾器來實現的。

apache 可以開發出一些功能非常強大的模組來,可以為我們定製更好的apache,比如容器中應用的流量統計,cpu統計等。

相關文章