上一篇博客講解了nginx相關的數據結構。
這一篇主要交接如何將自己的模塊編譯進nginx;
一種常用的簡單方法:
1)首先把源代碼文件全部放大一個目錄下,然後在改目錄中編寫一個config用於通知Nginx如何編譯本模塊,這個文件名必須爲config。
在configure腳本執行時加入參數--add-module=PATH(上面源碼,config的保存目錄)
執行正常安裝流程是完成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出錯,所以慎用