日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

利用configure脚本将定制的模块加入到Nginx中

發布時間:2024/2/28 Nginx 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用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中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。