在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中相关推荐

  1. 《深入理解Nginx:模块开发与架构解析》一3.3 如何将自己的HTTP模块编译进Nginx...

    3.3 如何将自己的HTTP模块编译进Nginx Nginx提供了一种简单的方式将第三方的模块编译到Nginx中.首先把源代码文件全部放到一个目录下,同时在该目录中编写一个文件用于通知Nginx如何编 ...

  2. 利用C#脚本来处理Excel

    废不多,直入正题. 所需环境:安装了Windows操作系统和Office软件的电脑一台. 开发语言:C# 开发需求:1.利用C#脚本读取Excel .xlsx文件 2.将程序中的数据存储到.csv文件 ...

  3. nginx源码分析configure脚本详解

    一.前言 在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的情况下,通过简单的定义宏的方式来实现功能的打开与关闭,但是在n ...

  4. nginx源码分析——configure脚本

    源码:nginx 1.13.0-release 一.前言 在分析源码时,经常可以看到类似 #if (NGX_PCRE) .... #endif 这样的代码段,这样的设计可以在不改动源码的情况下,通过简 ...

  5. eps提取高程点在哪里_利用EPS脚本技术实现管线点高程的自动提取

    龙源期刊网 http://www.qikan.com.cn 利用 EPS 脚本技术实现管线点高程的自动 提取 作者:王伟 来源:<硅谷> 2013 年第 01 期 摘 要: 地下管线点的高 ...

  6. (转)[Android] 利用 ant 脚本修改项目包名

    [Android] 利用 ant 脚本修改项目包名在开发android应用项目的时候,经常会有这样的需求,一个应用项目,要求 房价上半年下行 下半年或回暖 在不同的OEM下有不同的包名,不同的资源,不 ...

  7. configure脚本分析

    SRS_WORKDIR="."SRS_OBJS_DIR="objs"SRS_OBJS="${SRS_WORKDIR}/${SRS_OBJS_DIR}& ...

  8. python windows系统管理_利用Python脚本管理Windows服务

    Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32 ...

  9. python登录交换机执行命令_利用Python脚本登录交换机实现自动配置备份的方法

    主机参考:服务器测评参考推荐网,专注分享服务器优惠信息!如果您想在本站投放您的广告,点此直达!如果您不想付费,您也可以免费投稿您的产品信息,点此直达!联系我们 部分文章发布时间较久远,可能存在未知因素 ...

最新文章

  1. 孰优孰劣?Dubbo VS Spring Cloud性能测试大对决!
  2. 不懂编程可以自学python吗-python教程看完了,还是不会编程?
  3. toad导入数据_利用TOAD实现EXCEL数据在oracle的导入导出
  4. 介绍一个Material设计风格的Chrome开发者工具增强扩展
  5. cmd 调用JLink.exe 下载程序
  6. java 判断请求为 ajax请求_Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求...
  7. 求1+2+…+n变态问题的两个很棒的解法
  8. mac服务器 文件无法删除文件夹,macOS 10.15.4 无法删除一个空文件夹
  9. jquery插件整理篇(六)HTML编辑器插件
  10. Linux工作笔记024---Centos7 下查看本机公网IP
  11. Java类加载原理解析(转)
  12. 图形学笔记1.直线扫描转换与devC的图形库ege扩展
  13. 高通android logo,高通平台android kernel 开机logo展示和传统linux一样
  14. WINCC 7.4 SP1 7.5 博图v16 硬件学习补丁
  15. Windows 系统中 hosts 文件无法修改的问题
  16. Windows自带照片查看器恢复办法
  17. 字节跳动+京东+美团+腾讯面试总结,附赠课程+题库
  18. 米哈游108薪年终奖,假的
  19. PythonJava版【LeetCode】简单题答案整理01
  20. 从maven私服(nexus)拉取jar文件,解析项目pom依赖信息

热门文章

  1. Linux的命令组成
  2. CodeForces - 897E Willem, Chtholly and Seniorious(珂朵莉树)
  3. 牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
  4. HDU - 4990 Reading comprehension(矩阵快速幂,水题)
  5. cv2 python3.5 linux,ubuntu 16.04 安装 opencv3.2.0 with python 3.5
  6. Virtual Box中Centos虚拟机设置静态IP
  7. POJ2594(二分匹配+Floyd求传递闭包)
  8. VS中MFC访问MySQL的方法
  9. 通过WM_COPYDATA消息完成进程间通信
  10. 给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数