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中模塊調用順序是正序所需

最後就是修改Makefile.

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

然後把目標文件鏈接到Nginx中

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

這個是修改文件,所以不正確的修改可能導致nginx出錯,所以慎用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章