Ubuntu 下apache2 增長新的module

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

 

首先來介紹下apache的一個工具apxs。apxs是一個爲Apache HTTP服務器編譯和安裝擴展模塊的工具,用於編譯一個或多個源程序或目標代碼文件爲動態共享對象,使之能夠用由mod_so提供的LoadModule指令在運行時加載到Apache服務器中。 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這個函數。本例子是一個很是簡單的內容生成器。 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

相關文章
相關標籤/搜索