簡單介紹一下 Apache Module 的架構。這對於開始寫 Apache Module 會很有幫助!

 
  • Apache 2.0 模組架構
    如下圖,這是 Apache 2.0 的模組架構。其中需要幾個重要的模組,其中包括
     * Configuation: 用來讀取設定檔,包括 virtual host/directory 以及 global 的設定。
     * register_hooks:跟 Apache 系統註冊你的模組,其中包含三種型式:
        1. hook-handlers:這主要是註冊一個 content-type,當遇到某種 content-type 的時候,Ex: *.mp4,則會呼叫你的模組。
        2. filters:這與資料的行為較有關係,可以註冊一個專門用來修改 header 的模組,Ex: mod_expires。
        3. opt. funcs:其他會用到的相關函數。
    handlers、optional functions、filters:指向你的模組函式的 handler、function 與 filters。
  • 而內部模組以及訊息傳遞的流程如下:
  • 把你的模組 hook 到 Apache 中
    如下圖,只要使用 ap_hook_handler() 這個 function 就可以向 Apache 註冊你的 function 了。值得注意的是,可以跟系統要求 hook 在不同的地方,HOOK_FIRST, HOOK_LAST, HOOK_REALLY_FIRST, HOOK_REALLY_LAST,要看你所製作的功能來決定囉。
     
  • 管理資料的輸入和輸出
    如果你要做的模組是處理資料的輸入或輸出時,這樣你就需要註冊 filter。可以用 ap_register_output_filter 或 ap_register_input_filter 。一個是處理輸入,一個是處理輸出。
    同樣的,註冊 Filter 也有不同的參數可選擇:AP_FTYPE_RESOURCE, AP_FTYPE_CONTENT_SET, AP_FTYPE_PROTOCOL, AP_FTYPE_TRANSCODE, AP_FTYPE_CONNECTION, AP_FTYPE_NETWORK。
     
  • 需要注意的是,Apache 是把資料拆分成許多 Bucket,然後許多Bucket 包裝成一個 Brigade。如下圖所示:
     
  • 所以註冊好你的 function 之後,需要注意的是你抓到的是一整個 Bridage,如果要處理資料內容的話,則必須從 Bridage 的結構中去找出一個一個 Bucket 處理。
    其中可用 APR_BRIGADE_FIRST() 去抓出第一個 Bucket ,處理好之後記得呼叫 ap_pass_brigade,把你處理過的資料丟給下一個 filter。
  • Apache Server 處理 HTTP Request 流程
    從下圖可以清楚看出,一個模組如何被建立,以及在系統中如何被運作。
  • 後記
    雖然看起來挺複雜的,但是整體來說,Apache Module 架構寫得很清楚,只要多看一下別人寫的 Module 就可以了。
    現在的工作是需要 Implement 一個 MP4 的 Streaming Module,然後要加上頻寬限制功能。也就是說,當有 user 跟 apache 要 MP4 檔案時,在丟出前可以判斷 MP4 檔案,並且可讓 USER 隨意跳選不同的 MOOV 與 TRAK。更重要的是頻寬管理,就是根據該 MP4 的實際 bps 來送出。行為大約是,在開始的初期會先全速送出 5 秒的 Buffer,然後再以 bps 的 1.2~1.5 被速度調整頻寬。
    這樣做的好處是,對 USER 來說有 quick start 的感覺,然後在看影片的時候又有足夠的 buffer 不用等待資料傳過來。更重要的是,節省伺服器的頻寬,畢竟有如同 Google 一般頻寬的公司不多,能省就省囉!
Facebook 討論區載入中...