利用configure脚本将定制的模块加入到Nginx中
在1.6節提到的configure執行流程中,其中有兩行腳本負責將第三方模塊加入到Nginx中,如下所示。
. auto/modules
. auto/make
下面完整地解釋一下configure腳本是如何與3.3.1節中提到的config文件配合起來把定制的第三方模塊加入到Nginx中的。
在執行configure --add-module=PATH命令時,PATH就是第三方模塊所在的路徑。在configure中,通過auto/options腳本設置了NGX_ADDONS變量:
--add-module=*)????????????????? NGX_ADDONS="$NGX_ADDONS $value" ;;
在configure命令執行到auto/modules腳本時,將在生成的ngx_modules.c文件中加入定制的第三方模塊。
if test -n "$NGX_ADDONS"; then
??? echo configuring additional modules
??? for ngx_addon_dir in $NGX_ADDONS
??? do
??????? echo "adding module in $ngx_addon_dir"
??????? if test -f $ngx_addon_dir/config; then
??????????? #在這里執行自定義的config腳本
??????????? . $ngx_addon_dir/config
??????????? echo " + $ngx_addon_name was configured"
??????? else
??????????? echo "$0: error: no $ngx_addon_dir/config was found"
??????????? exit 1
??????? fi
??? done
fi
可以看到,$NGX_ADDONS可以包含多個目錄,對于每個目錄,如果其中存在config文件就會執行,也就是說,在config中重新定義的變量都會生效。之后,auto/modules腳本開始創建ngx_modules.c文件,這個文件的關鍵點就是定義了ngx_module_t *ngx_modules[]數組,這個數組存儲了Nginx中的所有模塊。Nginx在初始化、處理請求時,都會循環訪問ngx_modules數組,確定該用哪一個模塊來處理。下面來看一下auto/modules是如何生成數組的,代碼如下所示:
modules="$CORE_MODULES $EVENT_MODULES"
if [ $USE_OPENSSL = YES ]; then
??? modules="$modules $OPENSSL_MODULE"
??? CORE_DEPS="$CORE_DEPS $OPENSSL_DEPS"
??? CORE_SRCS="$CORE_SRCS $OPENSSL_SRCS"
fi
if [ $HTTP = YES ]; then
??? modules="$modules $HTTP_MODULES $HTTP_FILTER_MODULES \
???????????? $HTTP_HEADERS_FILTER_MODULE \
???????????? $HTTP_AUX_FILTER_MODULES \
???????????? $HTTP_COPY_FILTER_MODULE \
???????????? $HTTP_RANGE_BODY_FILTER_MODULE \
???????????? $HTTP_NOT_MODIFIED_FILTER_MODULE"
??? NGX_ADDON_DEPS="$NGX_ADDON_DEPS \$(HTTP_DEPS)"
fi
首先,auto/modules會按順序生成modules變量。注意,這里的$HTTP_MODULES等已經在config文件中重定義了。這時,modules變量是包含所有模塊的。然后,開始生成ngx_modules.c文件:
cat << END??????????????????????????????????? > $NGX_MODULES_C
#include <ngx_config.h>
#include <ngx_core.h>
$NGX_PRAGMA
END
for mod in $modules
do
??? echo "extern ngx_module_t? $mod;"???????? >> $NGX_MODULES_C
done
echo????????????????????????????????????????? >> $NGX_MODULES_C
echo 'ngx_module_t *ngx_modules[] = {'??????? >> $NGX_MODULES_C
for mod in $modules
do
??? #向ngx_modules數組里添加Nginx模塊
??? echo "??? &$mod,"???????????????????????? >> $NGX_MODULES_C
done
cat << END??????????????????????????????????? >> $NGX_MODULES_C
??? NULL
};
END
這樣就已經確定了Nginx在運行時會調用自定義的模塊,而auto/make腳本負責把相關模塊編譯進Nginx。
在Makefile中生成編譯第三方模塊的源代碼如下:
if test -n "$NGX_ADDON_SRCS"; then
??? ngx_cc="\$(CC) $ngx_compile_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"
??? for ngx_src in $NGX_ADDON_SRCS
??? do
??????? ngx_obj="addon/`basename \`dirname $ngx_src\``"
??????? ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \
??????????? | sed -e "s/\//$ngx_regex_dirsep/g"`
??????? ngx_obj=`echo $ngx_obj \
??????????? | sed -e
????????????? "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
????????????????? -e
????????????? "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
????????????????? -e
????????????? "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
????????????????? -e
????????????? "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
??????? ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
??????? cat << END??????????????????????????????????????????? >> $NGX_MAKEFILE
$ngx_obj:?\$(ADDON_DEPS)$ngx_cont$ngx_src
?$ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
END
???? done
fi
下面這段代碼用于將各個模塊的目標文件設置到ngx_obj變量中,緊接著會生成Makefile里的鏈接代碼,并將所有的目標文件、庫文件鏈接成二進制程序。
for ngx_src in $NGX_ADDON_SRCS
do
??? ngx_obj="addon/`basename \`dirname $ngx_src\``"
??? test -d $NGX_OBJS/$ngx_obj || mkdir -p $NGX_OBJS/$ngx_obj
??? ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \
??????? | sed -e "s/\//$ngx_regex_dirsep/g"`
??? ngx_all_srcs="$ngx_all_srcs $ngx_obj"
done
…
cat << END??????????????????????????????????????????????????? >> $NGX_MAKEFILE
$NGX_OBJS${ngx_dirsep}nginx${ngx_binext}:?
?$ngx_deps$ngx_spacer \$(LINK)
?${ngx_long_start}${ngx_binout}$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link
?$ngx_rcc
${ngx_long_end}
END
綜上可知,第三方模塊就是這樣嵌入到Nginx程序中的。
總結
以上是生活随笔為你收集整理的利用configure脚本将定制的模块加入到Nginx中的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ngx_http_discard_req
- 下一篇: nginx源码分析configure脚本