上一篇部落格講解了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中子產品調用順序是正序所需
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