apache模組開發之helloworld
學習apache模組開發已經快兩個星期了,感覺搞apache模組開發挺有意思的,下面來講講apache模組開發的helloworld,非常簡單。
Apache 模組開發主要採用掛鉤子的方法來實現模組開發的,這和linux核心模組開發有點像,說白了就是加一個回撥函式。下面我們來講 這個例子吧。
首先來介紹下apache的一個工具apxs。apxs是一個為Apache HTTP伺服器編譯和安裝擴充套件模組的工具,用於編譯一個或多個源程式或目的碼檔案為動態共享物件,使之可以用由mod_so提供的LoadModule指令在執行時載入到Apache伺服器中。
1.apxs -g -n helloworld
上面的命令可以幫助我們產生一個模組名字為helloworld的模板。
我們來看下helloworld_module這個結構體,它沒個成員的具體作用請看註釋。
它最關鍵的引數為最後一個,這個引數是一個註冊鉤子函式指標,也就是說當我們把模組加入到apache裡面去的時候,他會執行這個註冊函式。在這個函式裡面我們將會註冊我們所要新增的鉤子。
本例子中我們用的是
這個處理函式,這個處理函式註冊了helloworld_handler這個函式。這個函式用於處理我們的請求。
我們來講下執行的順序,模組載入-》執行helloworld_register_hooks函式-》註冊helloworld_handler這個函式到鉤子上去。
這樣一來:當一個http請求來的時候,我們就會自動去執行helloworld_handler這個函式。本例子是一個非常簡單的內容生成器。
下面我們將來進行編譯
執行:apxs -c mod_helloworld.c
執行成功以後我們可以發現在.libs下面會出現mod_helloworld.so這個模組檔案。這就是我們所需要的,對於apache一些自帶的模組一般都放在安裝目錄的modules/下面。
下面我們來對其進行配置
Ok ,重啟apache 然後輸入 http://loacalhost/helloworld 就可以看到
The sample page from mod_helloworld.c
當然這裡這裡只是輸出一句話,我們也可以列印很多html資訊,就類似於servlet一樣。
這樣一來一個簡單的apache內容生成器模組已經開發好了,當然應用比較廣泛的是過濾器模組的開發,最近專案主要也是用過濾器來實現的。
apache 可以開發出一些功能非常強大的模組來,可以為我們定製更好的apache,比如容器中應用的流量統計,cpu統計等。
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統計等。
相關文章
- Helloworld 驅動模組載入
- apache新增php模組ApachePHP
- 使用typescript開發angular模組(編寫模組)TypeScriptAngular
- 模組化開發(二)
- 前端模組化開發前端
- Python模組之urllib模組Python
- python模組之collections模組Python
- FASM之HelloWorldASM
- 快速開始HelloWorld和Python之禪Python
- Apache Kafka各Api模組說明ApacheKafkaAPI
- Apache檢測某模組是否生效Apache
- 如何檢視 Apache 模組是否正常Apache
- Substrate 區塊鏈應用開發之存證模組的功能開發區塊鏈
- python開發學習之如何更好的引用Python模組?Python
- 智慧硬體開發之WIFI模組訊號測試WiFi
- 模組學習之hashlib模組
- 模組學習之logging模組
- 淺談模組化開發
- 模組化開發淺析
- 聊聊前端模組化開發前端
- ModStartCMS模組開發介紹
- Flutter外掛開發《iOS原生模組開發》FlutteriOS
- Laravel-Module 模組開發一:評論模組實現Laravel
- Vuex之模組Vue
- python之模組Python
- TypeScript 之模組TypeScript
- 【Node】Addon C++模組開發C++
- 上傳模組開發總結
- 評論模組開發總結
- Javascript模組化開發基礎JavaScript
- Js模組化開發的理解JS
- Android模組化開發實踐Android
- phpstudy中apache設定跨域(頭部請求模組開啟)PHPApache跨域
- python–模組之random隨機數模組Pythonrandom隨機
- python–模組之os操作檔案模組Python
- 微信小遊戲開放域之helloworld遊戲
- 前端開發之ES6模組化和node.js,2020.12.09前端Node.js
- 元件化開發和模組化開發概念辨析元件化
- 函式計算-HelloWorld應用開發函式