Heim  >  Artikel  >  Backend-Entwicklung  >  Anatomie des automatischen Nginx-Skripts (1) Parsen des Konfigurationsoptionsskripts auto/options

Anatomie des automatischen Nginx-Skripts (1) Parsen des Konfigurationsoptionsskripts auto/options

WBOY
WBOYOriginal
2016-08-08 09:19:561044Durchsuche
解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options
  • Author: Poechant
  • Blog: blog.CSDN.net/Poechant
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Date: March 4th, 2012
  • Copyright ? 柳大·Poechant
  • 在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件。这些工作是由自动脚本完成的。和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configure的文件。除了configure,其他的自动脚本都在auto目录下。通过分析configure脚本源码,我们可以看到,configure首先运行了auto目录下的几个自动脚本,如下:
    <code>. auto/options
    . auto/init
    . auto/sources
    </code>
    其中通过运行auto/options脚本,来设定配置选项。下面将逐步分析auto/options脚本是如何工作的。1 读取configure配置参数开始先声明了 N 多变量,然后最主要的部分从这段开始:
    <code>opt=
    
    for option
        do
        ...
    done
    </code>
    这段实际上是处理运行./configure的时候携带的参数选项,for循环每次对应一个参数选项 option。要注意for循环体上面有一个全局的opt变量。这个循环体内的第一个语句是最重要是,它是:
    <code>opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"
    </code>
    通过循环运行该语句后,opt的值就是一个由空格来分隔的参数列表。然后在循环体中接下来是一个case-esac,用来得到参数值,如下:
    <code>case "$option" in
        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
           *) value="" ;;
    esac
    </code>
    其含义是将value赋值为参数选项值,如果选项值不与-*=*的模式匹配,则value值为""。接下来的case-esac语句用来匹配参数的类型。
    <code>    case "$option" in
            --help)                          help=yes                   ;;
            --prefix=)                       NGX_PREFIX="!"             ;;
            --prefix=*)                      NGX_PREFIX="$value"        ;;
            --sbin-path=*)                   NGX_SBIN_PATH="$value"     ;;
            --conf-path=*)                   NGX_C     ;;
            ...
        esac
    </code>
    各匹配的分支语句中进行配置变量的赋值。这些变量在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会匹配该语句:
    <code>*)
        echo "$0: error: invalid option \"$option\""
        exit 1
    </code>
    从而提示用户参数错误,并使脚本退出运行。经过多次循环,for-do-done就结束。2 设定NGX_CONFIGURE变量处理完所有option后,opt就如我们上面提到的,成为由空格分割的配置项值,并被赋给NGX_CONFIGURE变量:
    <code>NGX_C
    </code>
    3 是否显示configure的帮助信息再看下面这句:
    <code>if [ $help = yes ]; then
    cat << END
        …
    END
        exit 1
    fi
    </code>
    默认情况下$help变量值在初始化时就为no。如果configure选项中指定了help参数,则$help参数为yes,则会运行cat命令,显示大段的帮助信息,然后退出。4 是否关闭 HTTP 功能默认情况下HTTP的一些基本功能是被开启的,如果用户指定了--without-http参数,则变量HTTP会被赋值为NO,则下面这段代码if-fi中的语句会被执行:
    <code>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
    </code>
    5 是否指定运行于 Windows 平台如果显式指定了--crossbuild参数,则变量NGX_PLATFORM会被赋予当前for-do-done循环中的"$value"值,也就是--crossbuild的参数值,一般在考虑在Windows平台使用时才会用到,看下面的语句:
    <code>if [ ".$NGX_PLATFORM" = ".win32" ]; then
        NGX_WINE=$WINE
    fi
    </code>
    如果指定--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的默认值。
    <code>NGX_C/nginx.conf}
    </code>
    然后获取配置文件所在目录的:
    <code>NGX_C $NGX_CONF_PATH`
    </code>
    如果指定参数--conf-path=/home/michael/nginx/conf/nginx.conf,则NGX_CONF_PREFIX的值就是/home/michael/nginx/conf7 Nginx 进程 ID 文件和锁文件路径下面是同样的方式初始化NGX_PID_PATHNGX_LOCK_PATH,分别对应configure参数--pid-path--lock-path,其缺省值分别为logs/nginx.pidlogs/nginx.lock
    <code>NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}
    NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}
    </code>
    8 错误日志文件路径如果指定了参数--error-log-pathNGX_ERROR_LOG_PATH变量的值会被指定,根据下面的语句,如果指定的是stderr则将NGX_ERROR_LOG_PATH修改为空,即不需要错误日志文件。如果不是标准输出,且其值为空,则设置为缺省值logs/error.log
    <code>if [ ".$NGX_ERROR_LOG_PATH" = ".stderr" ]; then
        NGX_ERROR_LOG_PATH=
    else
        NGX_ERROR_LOG_PATH=${NGX_ERROR_LOG_PATH:-logs/error.log}
    fi
    </code>
    9 HTTP 相关各路径
    <code>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}
    </code>
    10 Perl 模块如果指定了--with-perl_modules_path参数,则NGX_PERL_MODULES变量即被设定。如果指定的值为一个绝对路径或未指定(空),则当做相对路径来处理,设定为$NGX_PREFIX/$NGX_PERL_MODULES
    <code>case ".$NGX_PERL_MODULES" in
        ./*)
        ;;
    
        .)
        ;;
    
        *)
            NGX_PERL_MODULES=$NGX_PREFIX/$NGX_PERL_MODULES
        ;;
    esac
    </code>
    11 小结通过运行auto/options脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。-转载请注明来自“柳大的CSDN博客”:blog.csdn.net/Poechant-

    Das Obige hat die Anatomie des automatischen Nginx-Skripts (1) vorgestellt, das die Konfigurationsoptionen des Skripts auto/options analysiert, einschließlich einiger Aspekte des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die an PHP-Tutorials interessiert sind.

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn