天天看點

nginx-如何将自己的HTTP子產品編譯進nginx

上一篇部落格講解了nginx相關的資料結構。

這一篇主要交接如何将自己的子產品編譯進nginx;

  1. 一種常用的簡單方法:

    1)首先把源代碼檔案全部放大一個目錄下,然後在改目錄中編寫一個config用于通知Nginx如何編譯本子產品,這個檔案名必須為config。

  2. 在configure腳本執行時加入參數--add-module=PATH(上面源碼,config的儲存目錄)
  3. 執行正常安裝流程是完成Nginx的編譯工作。

ps:還有一種複雜方式,就是修改configure腳本執行後生成的obj/Makefile和obj/ngx_module.c檔案。

  以後進行講解

-------------------------------------------------------------------------------------------

2.config的寫法:

    其實config就是一個shell腳本,若是隻想開發一個HTTP子產品,需要定義3個變量

    1.ngx_addon_name:僅在configure執行時使用,一般設定為子產品名稱。

    2.HTTP_MODULES:儲存所有HTTP子產品名稱,空格符相連。重新設定時不要覆寫,隻需要添加

    例:&HTTP_MODULES ngx_http_my_test_module

    3.NGC_ADDON_SRCS:用于指定子產品的源代碼,空格符相連。

    ps:設定時可以使用&ngx_addon_dir變量,等價于configure執行時的--add-module=PATH.

    例:

    ngx_addon_name=ngx_http_mytest_module

    HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_modue"

    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"

下面聲明一個重點:

    以上的3個變量并不是唯一可以再config中自定義的部分,如果開發一個HTTP過濾子產品,則需要用HTTP_FILTER_MODULES替代HTTP_MODULES

    $CORE_MODULES:核心子產品。

    $EVENT_MODULES:事件子產品

    $HTTP_MODULES:HTTP子產品

    $HTTP_FILTER_MODULES:HTTP過濾子產品

    $HTTP_HEADERS_FILTER_MODULES:HTTP頭部過濾子產品.

    等。$NGX_ADDON_DEPS:指定子產品依賴路徑。

3.利用configure腳本将制定的子產品加入nginx中

    首先nginx是通過configure生成程式的

    在configure中。

    .auto/modules

    .auto/make

    這2行代碼是講第三方子產品加入到nginx中

 1)configure如何利用config檔案加入nginx中

    --add-module=*)    NGX_ADDONS="$NGX_ADDONS $value" ;;

   在configure指令執行到auto/modules腳本時,将生成ngx_modules.c檔案中加入制定的第三方子產品。

下面是部分源碼:

if test -n "$NGX_ADDONS";then
    
    echo configuring addtional  modules
    
    for ngx_addon_dir in $NGX_ADDONS
    do
        echo "adding module in $ngx_addon_dir"
        
        if test -f $ngx_addon_dir/config; then
            .$ngx_addon_dir/config
            
            echo "+ $nginx_addon_name was configured"
        
        else
            echo "錯誤資訊"
            exit 1
         fi
    done
fi      

當周遊config檔案後。就會在ngx_modules.c中定義一個ngx_module_t *ngx_modules[]數組,通過處理請求時的循環通路數組确定該用哪一個子產品來處理。

最後就是auto/make把相關子產品編譯進nginx。

4.直接修改Makefile檔案

 适用于我們需要重新決定ngx_module* ngx_modules[]數組中各子產品的順序,或者在編譯源代碼時需要加入一些獨特的編譯選項,那麼可以再執行完configure後,對objs/ngx_modules.c和objs/Makefile檔案直接進行修改

首先,當我們要修改ngx_modules.c時候,需要加上一行代碼

    extern ngx_module_t ngx_http_mytypes_module;

然後主動加上ngx_modules數組中

ngx_modules_t *ngx_modules[] = {
    ...
    &ngx_http_upstream_ip_hash_module,
    &ngx_http_mytest_module,
    $ngx_http_write_filter_module,
    ...
    NULL
};      

注意我麼子產品加入的順序十分重要,因為nginx中子產品調用順序是正序所需

obj/addon/httpmodule/ngx_http_mytest_modules.0:$(ADDON_DEPS)\
    ../sample/httpmodule/ngx_http_mytest_modules.c
    $(CC) -c $(CFLAGS) $(ALL_INCS) \
           -o objs/addon/httpmdoule/ngx_http_mytest_module.o\
           ../sample/httpmodule//ngx_http_mytest_module.c      
objs/nginx:   objs/src/core/nginx.o
...
    objs/addon/httpmodule/ngx_http_mytest_module.o\
    objs/ngx_modules.o
    
    $(LINK) -o objs/nginx\
    objs/src/core/nginx.o\
    ...
    objs/addon/httpmodule/ngx_http_mytest_module.o\
    objs/ngx_modules.o\
    -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz      

繼續閱讀