<-
Apache > HTTP Server > 文件 > 版本 2.4 > 開發人員文件

將 Apache 1.3 模組轉換至 Apache 2.0

可用的語言:  en  |  ja 

這是第一次嘗試寫下我在嘗試將 mod_mmap_static 模組轉換至 Apache 2.0 時學到的教訓。這篇文件絕非權威文件,可能在某些方面也不正確,但這是一個開始。

Support Apache!

請參閱

top

較容易的變更...

清理常式

這些常式現在必須是 apr_status_t 型別,並傳回該型別的值。通常,傳回值會是 APR_SUCCESS,除非有必要在清理時傳送錯誤訊號。請注意,即使您傳送錯誤訊號,仍非所有程式碼都會檢查並處理該錯誤。

初始化常式

這些常式現在應重新命名,更清楚地表示它們在整體處理流程中的位置。因此,名稱從 mmap_init 稍作修改為 mmap_post_config。傳遞的引數已大幅變更,目前看起來如下

資料型別

許多資料型別已移至 APR。這意味著有些型別已經更改名稱,例如上面顯示的型別。以下是您可能需要進行的一些變更簡介。

top

較混亂的變更...

註冊掛鉤

新的架構使用一系列掛鉤來呼叫您的函式。您必須透過新的函式 static void register_hooks(void) 將這些掛鉤新增至模組。一旦您了解需要執行的內容,函式便相當直接。需要在處理要求的某個階段呼叫的各個函式都需要註冊,但處理常式則不必。有許多階段可以新增函式,而且對每個階段,您可以透過高度控制來指定呼叫函式的相對順序。

以下是新增至 mod_mmap_static 的程式碼

static void register_hooks(void)
{
    static const char * const aszPre[]={ "http_core.c",NULL };
    ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
    ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
};

這會註冊兩個需要呼叫的函式,一個在 post_config 階段(幾乎每個模組都需要這個函式),另一個則是在 translate_name 階段。請注意,雖然有不同的函式名稱,但每個函式的格式都相同。那麼格式是什麼?

ap_hook_階段名稱(函式名稱, 先決函式, 後續函式, 位置);

定義了 3 個掛勾位置...

若要定義位置,請使用位置,然後透過先決函式及後續函式修改它。每個修改子都可以是函式清單,應該在執行函式之前 (先決函式) 或執行函式之後 (後續函式) 呼叫。

mod_mmap_static 的情況下,我並不在乎 post_config 階段,但核心模組在完成名稱轉譯後 必須呼叫 mmap_static_xlat,因此使用 aszPre 定義位置 HOOK_LAST 的修改子。

模組定義

現在在建立模組定義時,可擔心的階段已大幅減少。舊的定義如下:

module MODULE_VAR_EXPORT module_name_module =
{
    STANDARD_MODULE_STUFF,
    /* initializer */
    /* dir config creater */
    /* dir merger --- default is to override */
    /* server config */
    /* merge server config */
    /* command handlers */
    /* handlers */
    /* filename translation */
    /* check_user_id */
    /* check auth */
    /* check access */
    /* type_checker */
    /* fixups */
    /* logger */
    /* header parser */
    /* child_init */
    /* child_exit */
    /* post read-request */
};

新的結構更加簡單...

module MODULE_VAR_EXPORT module_name_module =
{
    STANDARD20_MODULE_STUFF,
    /* create per-directory config structures */
    /* merge per-directory config structures  */
    /* create per-server config structures    */
    /* merge per-server config structures     */
    /* command handlers */
    /* handlers */
    /* register hooks */
};

有些可以直接轉移,有些則不行。我將嘗試在以下總計應該執行的作業。

直接轉移的階段

/* dir config creater */
/* 建立每個目錄的組態結構 */
/* 伺服器組態 */
/* 建立每個伺服器的組態結構 */
/* dir merger */
/* 合併每個目錄的組態結構 */
/* 合併伺服器組態 */
/* 合併每個伺服器的組態結構 */
/* 指令表 */
/* 指令 apr_table_t */
/* 處理常式 */
/* 處理常式 */

舊函式的其餘部分應註冊為掛勾。目前定義了以下掛勾階段...

ap_hook_pre_config
進行組態指令處理前執行必要的設定
ap_hook_check_config
檢閱組態指令間的相依性
ap_hook_test_config
僅執行 -t 選項
ap_hook_open_logs
開啟任何指定的記錄
ap_hook_post_config
這是註冊舊的 _init 常式的場所
ap_hook_http_method
從請求中取得 HTTP 方法。(舊式方法)
ap_hook_auth_checker
檢查資源是否需要授權
ap_hook_access_checker
檢查模組特定的限制
ap_hook_check_user_id
檢查使用者 ID 和密碼
ap_hook_default_port
取得伺服器的預設埠號
ap_hook_pre_connection
進行處理前,但在接受後執行必要的設定
ap_hook_process_connection
執行正確的通訊協定
ap_hook_child_init
在啟動子代後盡快呼叫
ap_hook_create_request
??
ap_hook_fixups
產生內容前修改事物的最後機會
ap_hook_handler
產生內容
ap_hook_header_parser
讓模組觀察標頭,並未套用於大多數模組,因為它們會使用 post_read_request 來達成此目的
ap_hook_insert_filter
用於在濾器鏈中插入濾器
ap_hook_log_transaction
記下要求的資訊
ap_hook_optional_fn_retrieve
檢索任何已註冊為選擇性的函式
ap_hook_post_read_request
在讀取要求後呼び出,在任何其他階段前
ap_hook_quick_handler
在任何請求處理之前呼び出,由快取模組使用。
ap_hook_translate_name
將 URI 轉換成檔案名稱
ap_hook_type_checker
確定和/或設定文件類型

可用的語言:  en  |  ja 

top

留言

注意事項
此處並非問答區段。針對此處的意見回饋應著重於改進文件或伺服器的建議,且如果已執行或被視為無效/離題,可能會被我們的管理員移除。如何管理 Apache HTTP 伺服器的問題應導向我們的 IRC 頻道,#httpd,在 Libera.chat,或寄送至我們的 郵寄清單