Nginx配置编译脚本篇- 解析配置选项脚本auto/options

Posted 彼方丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx配置编译脚本篇- 解析配置选项脚本auto/options相关的知识,希望对你有一定的参考价值。

1、相关文章

由于学习本文需要Nginx源码及搭建相关的编译环境,所以建议大家按以下文章顺序阅读

2、前言

本文将分析Nginx的解析配置选项脚本auto/options,该脚本是在configure文件中被调用的,要看懂该文件需要一定的Shell编程基础,不过语法不是很难,本文将详细分析里面的内容。
configure文件将在最后一篇关于Nginx脚本配置文件的文章中讲解)

3、auto/options文件详解

3.1、初始化变量

auto/options开头是声明了一堆的变量,大家可以稍微浏览一下定义了哪些变量,其中有一个比较重要的语法,就是CC=${CC:-cc},此句的作用是当CC为空时,在命令行用cc替换CC=${CC:-cc},即当CC为空时,上述命令变为CC=cc,其他类似的指令如下表

命令作用
${var:-string}若变量var为空,则在命令行中用string替换${var:-string},这个过程中并不改变var本身的值
${var:=string}若变量var为空,则在命令行中用string替换${var:=string},并且将var的值也改为string
${var:+string}若变量var不为空,则在命令行中用string替换${var:+string},这个过程中并不改变var本身的值
${var:?string}若变量var为空,则把string输出到标准错误去,并从脚本中退出,若var不为空,则在命令行中用var替换${var:?string}

3.2、读取传入配置参数

因为auto/options是在configure中被调用的,所以解析的参数也就是用户在执行configure脚本所传入的参数。其中最重要的部分是从这段开始的,代码如下:

opt=

for option
do
...
done

代码有所省略,这段主要的作用是循环解析我们运行configure时传入的参数选项,for循环每次对应一个参数选项option,例如./configure --user=haha --group=hehe,则会循环两次,第一次是–user=haha,第二次是–group=hehe,要注意的是最上面有一个全局变量opt,这个循环体内的第一个语句是最重要的,如下:

opt="$opt `echo $option | sed -e \\"s/\\(--[^=]*=\\)\\(.* .*\\)/\\1'\\2'/\\"`"

循环运行完该语句后,opt的值就变成一个以空格来分隔的参数列表,即我们传入的参数列表。

接下来是一个case-esac语句,用来获取参数值,如下:

case "$option" in
    -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
       *) value="" ;;
esac

可以看到如果选项值不与-=模式匹配,则value的值设为空。

接下来的case-esac语句用来匹配参数的类型,如下:

case "$option" in
    --help)                          help=yes                   ;;

    --prefix=)                       NGX_PREFIX="!"             ;;
    --prefix=*)                      NGX_PREFIX="$value"        ;;
    --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;
    --modules-path=*)                NGX_MODULES_PATH="$value"  ;;
    --conf-path=*)                   NGX_CONF_PATH="$value"     ;;
    --error-log-path=*)              NGX_ERROR_LOG_PATH="$value";;
    --pid-path=*)                    NGX_PID_PATH="$value"      ;;
    --lock-path=*)                   NGX_LOCK_PATH="$value"     ;;
    --user=*)                        NGX_USER="$value"          ;;
    --group=*)                       NGX_GROUP="$value"         ;;
    ...
esac

可以看到,各匹配的分支语句中进行配置变量的赋值,这些变量在auto/options最开始处已经被赋予默认值了,在这里再根据脚本的传入参数对这些进行赋值。需要注意的是,如果option并不匹配这些任意一个,也就是用户使用configure脚本的时候传入的参数错误,则会匹配以下语句:

    *)
        echo "$0: error: invalid option \\"$option\\""
        exit 1
    ;;

从而提示用户参数错误,并使脚本退出。如果没有出现错误,进过多次循环,就结束for-do-done

3.3、设置NGX_CONFIGURE变量的值

处理完全部option之后,上面提到的那个opt就被赋值到NGX_CONFIGURE变量里去了,代码如下:

NGX_CONFIGURE="$opt"

3.4、显示帮助信息

根据前面的help变量的值选择是否显示帮助信息,help变量是在前面的for-do-done里面设置的,代码如下:

if [ $help = yes ]; then

cat << END

  --help                             print this message

  --prefix=PATH                      set installation prefix
  --sbin-path=PATH                   set nginx binary pathname
  --modules-path=PATH                set modules path
  --conf-path=PATH                   set nginx.conf pathname
  --error-log-path=PATH              set error log pathname
  --pid-path=PATH                    set nginx.pid pathname
  --lock-path=PATH                   set nginx.lock pathname

  --user=USER                        set non-privileged user for
                                     worker processes
  --group=GROUP                      set non-privileged group for
                                     worker processes
  ...
END

    exit 1
fi

3.5、设置NGX_WINE变量的值

如果前面显示指定了–crossbuild参数,则变量NGX_PLATFORM会被赋予传入的参数值,一般考虑在Windows平台使用时才会用到该参数,如下:

if [ ".$NGX_PLATFORM" = ".win32" ]; then
    NGX_WINE=$WINE
fi

3.6、设置各类文件路径

接下来会设置部分参数,这些参数都是和文件路径相关的,只有当我们前面没有指定这些参数值时,才会根据下面的内容去设置,代码如下,注释里面介绍了各个路径的用途(需要注意的是这些路径是相对于安装路径的,而不是绝对路径的)

NGX_SBIN_PATH=${NGX_SBIN_PATH:-sbin/nginx}      # 设置nginx可执行文件的路径
NGX_MODULES_PATH=${NGX_MODULES_PATH:-modules}   # 设置nginx模块文件路径
NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} # 设置nginx配置文件路径
NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`        # 获取nginx配置文件所在目录
NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}    # 设置nginx PID文件路径
NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock} # 设置nginx锁文件路径

# 设置错误日志文件路径
if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
    NGX_ERROR_LOG_PATH=
else
    NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}
fi

NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log} # 设置日志文件路径
# HTTP相关各路径设置
NGX_HTTP_CLIENT_TEMP_PATH=${NGX_HTTP_CLIENT_TEMP_PATH:-client_body_temp}
NGX_HTTP_PROXY_TEMP_PATH=${NGX_HTTP_PROXY_TEMP_PATH:-proxy_temp}
NGX_HTTP_FASTCGI_TEMP_PATH=${NGX_HTTP_FASTCGI_TEMP_PATH:-fastcgi_temp}
NGX_HTTP_UWSGI_TEMP_PATH=${NGX_HTTP_UWSGI_TEMP_PATH:-uwsgi_temp}
NGX_HTTP_SCGI_TEMP_PATH=${NGX_HTTP_SCGI_TEMP_PATH:-scgi_temp}

# perl模块路径设置
case ".$NGX_PERL_MODULES" in
    ./*)
    ;;

    .)
    ;;

    *)
        NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES
    ;;
esac

4、总结

通过运行auto/options脚本,所有的配置项已经就被正确解析并加载到相应的配置变量中了。因为我们在执行configure文件时,传入的配置项都是在这个文件处理的,所以当我们需要开启某一功能又不知道怎么配置时,可以先不急着百度,来这个文件找一找也是可以的。

以上是关于Nginx配置编译脚本篇- 解析配置选项脚本auto/options的主要内容,如果未能解决你的问题,请参考以下文章

Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf

Nginx编译配置脚本篇- 模块配置脚本auto/modules

Nginx编译配置脚本篇- 工具型脚本系列

Nginx编译配置脚本最终篇 - configure脚本

Nginx编译配置脚本篇- 系统环境相关脚本

Nginx编译配置脚本篇(10)- Makefile相关脚本