Ubuntu 下apache2 增加新的module


http://andrew913.iteye.com/blog/398648

 

首先來介紹下apache的一個工具apxs。apxs是一個為Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件為動態共享對象,使之可以用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。 

 

注意在Ubuntu apache2下 apxs為apxs2,另外非源碼包安裝的apache2 是不帶有apxs2 的。

解決辦法:
apt-get install apache2-prefork-dev


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,才能成功,否則會出現錯誤

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM