zoukankan      html  css  js  c++  java
  • 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options

    在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件。这些工作是由自动脚本完成的。和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configure的文件。

    除了configure,其他的自动脚本都在auto目录下。通过分析configure脚本源码,我们可以看到,configure首先运行了auto目录下的几个自动脚本,如下:

    . auto/options
    . auto/init
    . auto/sources
    

    其中通过运行auto/options脚本,来设定配置选项。下面将逐步分析auto/options脚本是如何工作的。

    1 读取configure配置参数

    开始先声明了 N 多变量,然后最主要的部分从这段开始:

    opt=
    
    for option
        do
        ...
    done
    

    这段实际上是处理运行./configure的时候携带的参数选项,for循环每次对应一个参数选项 option。要注意for循环体上面有一个全局的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赋值为参数选项值,如果选项值不与-*=*的模式匹配,则value值为""。接下来的case-esac语句用来匹配参数的类型。

        case "$option" in
            --help)                          help=yes                   ;;
            --prefix=)                       NGX_PREFIX="!"             ;;
            --prefix=*)                      NGX_PREFIX="$value"        ;;
            --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;
            --conf-path=*)                   NGX_CONF_PATH="$value"     ;;
            ...
        esac
    

    各匹配的分支语句中进行配置变量的赋值。这些变量在auto/options脚本的最开始处赋以默认值,其中那些模块配置变量被赋以YES的表示默认开启,赋以NO的表示默认关闭。但它们开启与否由这个auto/options中的case-esac语句来决定。还有一些是安装相关的选项变量也在这里被赋值,比如:

    • prefix参数值被赋予NGX_PREFIX
    • sbin-path参数值被赋予NGX_SBIN_PATH
    • conf-path参数值被赋予NGX_CONF_PATH
    • error-log-path参数值被赋予NGX_ERROR_LOG_PATH
    • pid-path参数值被赋予NGX_PID_PATH
    • lock-path参数值被赋予NGX_LOCK_PATH

    如果option并不符合预设的这些匹配,也就是用户使用configure脚本的时候携带的参数错误,则auto/options会匹配该语句:

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

    从而提示用户参数错误,并使脚本退出运行。经过多次循环,for-do-done就结束。

    2 设定NGX_CONFIGURE变量

    处理完所有option后,opt就如我们上面提到的,成为由空格分割的配置项值,并被赋给NGX_CONFIGURE变量:

    NGX_CONFIGURE="$opt"
    

    3 是否显示configure的帮助信息

    再看下面这句:

    if [ $help = yes ]; then
    cat << END
        …
    END
        exit 1
    fi
    

    默认情况下$help变量值在初始化时就为no。如果configure选项中指定了help参数,则$help参数为yes,则会运行cat命令,显示大段的帮助信息,然后退出。

    4 是否关闭 HTTP 功能

    默认情况下HTTP的一些基本功能是被开启的,如果用户指定了--without-http参数,则变量HTTP会被赋值为NO,则下面这段代码if-fi中的语句会被执行:

    if [ $HTTP = NO ]; then
        HTTP_CHARSET=NO
        HTTP_GZIP=NO
        HTTP_SSI=NO
        HTTP_USERID=NO
        HTTP_ACCESS=NO
        HTTP_STATUS=NO
        HTTP_REWRITE=NO
        HTTP_PROXY=NO
        HTTP_FASTCGI=NO
    fi
    

    5 是否指定运行于 Windows 平台

    如果显式指定了--crossbuild参数,则变量NGX_PLATFORM会被赋予当前for-do-done循环中的"$value"值,也就是--crossbuild的参数值,一般在考虑在Windows平台使用时才会用到,看下面的语句:

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

    如果指定--crossbuild=win32,则NGX_WINE就会被赋值了。

    6 Nginx 配置文件路径

    在加载configure的参数时,如果没有指定了--conf-path参数,则$NGX_CONF_PATH变量是没有值的,则下面的语句会为NGX_CONF_PATH赋以conf/nginx.conf的缺省值。不过我在想老毛子 Igor Sysoev 同学完全可以在auto/options开始处和其他参数一样先指定NGX_CONF_PATH的默认值。

    NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}
    

    然后获取配置文件所在目录的:

    NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH`
    

    如果指定参数--conf-path=/home/michael/nginx/conf/nginx.conf,则NGX_CONF_PREFIX的值就是/home/michael/nginx/conf

    7 Nginx 进程 ID 文件和锁文件路径

    下面是同样的方式初始化NGX_PID_PATHNGX_LOCK_PATH,分别对应configure参数--pid-path--lock-path,其缺省值分别为logs/nginx.pidlogs/nginx.lock

    NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}
    NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}
    

    8 错误日志文件路径

    如果指定了参数--error-log-pathNGX_ERROR_LOG_PATH变量的值会被指定,根据下面的语句,如果指定的是stderr则将NGX_ERROR_LOG_PATH修改为空,即不需要错误日志文件。如果不是标准输出,且其值为空,则设置为缺省值logs/error.log

    if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
        NGX_ERROR_LOG_PATH=
    else
        NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}
    fi
    

    9 HTTP 相关各路径

    NGX_HTTP_LOG_PATH=${NGX_HTTP_LOG_PATH:-logs/access.log}
    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}
    

    10 Perl 模块

    如果指定了--with-perl_modules_path参数,则NGX_PERL_MODULES变量即被设定。如果指定的值为一个绝对路径或未指定(空),则当做相对路径来处理,设定为$NGX_PREFIX/$NGX_PERL_MODULES

    case ".$NGX_PERL_MODULES" in
        ./*)
        ;;
    
        .)
        ;;
    
        *)
            NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES
        ;;
    esac
    

    11 小结

    通过运行auto/options脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。

    -

  • 相关阅读:
    3js深入
    01课js初接触;
    弥合对象/关系之间的鸿沟(一)
    Spiral Matrix——螺旋矩阵
    原来···是不是高手,看try cathch都能看出来···
    Web视频分享处理类库的设计
    每个开发人员现在应该下载的十种必备工具
    使用C#得到局域网内所有主机名,IP地址,MAC地址,使用C# 实现查看所有系统事件
    IIS 错误 :“NETWORK SERVICE does not have write access” 解决办法
    配置Url Remap时发生Parser Error的解决办法
  • 原文地址:https://www.cnblogs.com/breg/p/4043676.html
Copyright © 2011-2022 走看看