利用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中相关推荐
- 《深入理解Nginx:模块开发与架构解析》一3.3 如何将自己的HTTP模块编译进Nginx...
3.3 如何将自己的HTTP模块编译进Nginx Nginx提供了一种简单的方式将第三方的模块编译到Nginx中.首先把源代码文件全部放到一个目录下,同时在该目录中编写一个文件用于通知Nginx如何编 ...
- 利用C#脚本来处理Excel
废不多,直入正题. 所需环境:安装了Windows操作系统和Office软件的电脑一台. 开发语言:C# 开发需求:1.利用C#脚本读取Excel .xlsx文件 2.将程序中的数据存储到.csv文件 ...
- nginx源码分析configure脚本详解
一.前言 在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的情况下,通过简单的定义宏的方式来实现功能的打开与关闭,但是在n ...
- nginx源码分析——configure脚本
源码:nginx 1.13.0-release 一.前言 在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的情况下,通过简 ...
- eps提取高程点在哪里_利用EPS脚本技术实现管线点高程的自动提取
龙源期刊网 http://www.qikan.com.cn 利用 EPS 脚本技术实现管线点高程的自动 提取 作者:王伟 来源:<硅谷> 2013 年第 01 期 摘 要: 地下管线点的高 ...
- (转)[Android] 利用 ant 脚本修改项目包名
[Android] 利用 ant 脚本修改项目包名在开发android应用项目的时候,经常会有这样的需求,一个应用项目,要求 房价上半年下行 下半年或回暖 在不同的OEM下有不同的包名,不同的资源,不 ...
- configure脚本分析
SRS_WORKDIR="."SRS_OBJS_DIR="objs"SRS_OBJS="${SRS_WORKDIR}/${SRS_OBJS_DIR}& ...
- python windows系统管理_利用Python脚本管理Windows服务
Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32 ...
- python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法
主机参考:服务器测评参考推荐网,专注分享服务器优惠信息!如果您想在本站投放您的广告,点此直达!如果您不想付费,您也可以免费投稿您的产品信息,点此直达!联系我们 部分文章发布时间较久远,可能存在未知因素 ...
最新文章
- 孰优孰劣?Dubbo VS Spring Cloud性能测试大对决!
- 不懂编程可以自学python吗-python教程看完了,还是不会编程?
- toad导入数据_利用TOAD实现EXCEL数据在oracle的导入导出
- 介绍一个Material设计风格的Chrome开发者工具增强扩展
- cmd 调用JLink.exe 下载程序
- java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
- 求1+2+…+n变态问题的两个很棒的解法
- mac服务器 文件无法删除文件夹,macOS 10.15.4 无法删除一个空文件夹
- jquery插件整理篇(六)HTML编辑器插件
- Linux工作笔记024---Centos7 下查看本机公网IP
- Java类加载原理解析(转)
- 图形学笔记1.直线扫描转换与devC的图形库ege扩展
- 高通android logo,高通平台android kernel 开机logo展示和传统linux一样
- WINCC 7.4 SP1 7.5 博图v16 硬件学习补丁
- Windows 系统中 hosts 文件无法修改的问题
- Windows自带照片查看器恢复办法
- 字节跳动+京东+美团+腾讯面试总结,附赠课程+题库
- 米哈游108薪年终奖,假的
- PythonJava版【LeetCode】简单题答案整理01
- 从maven私服(nexus)拉取jar文件,解析项目pom依赖信息
热门文章
- Linux的命令组成
- CodeForces - 897E Willem, Chtholly and Seniorious(珂朵莉树)
- 牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
- HDU - 4990 Reading comprehension(矩阵快速幂,水题)
- cv2 python3.5 linux,ubuntu 16.04 安装 opencv3.2.0 with python 3.5
- Virtual Box中Centos虚拟机设置静态IP
- POJ2594(二分匹配+Floyd求传递闭包)
- VS中MFC访问MySQL的方法
- 通过WM_COPYDATA消息完成进程间通信
- 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数