解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
2012-03-07 00:49
2166 查看
解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options
Author: PoechantBlog: blog.CSDN.net/Poechant
Email: zhongchao.ustc#gmail.com (#->@)
Date: March 4th, 2012
Copyright © 柳大·Poechant
在安装
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_PATH和
NGX_LOCK_PATH,分别对应
configure参数
--pid-path和
--lock-path,其缺省值分别为
logs/nginx.pid和
logs/nginx.lock。
NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}
8 错误日志文件路径
如果指定了参数--error-log-path则
NGX_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脚本,所有的配置项已经被正确解析并加载到相应的配置变量中了。-转载请注明来自“柳大的CSDN博客”:blog.csdn.net/Poechant-
相关文章推荐
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖 Nginx ·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
- 解剖 Nginx ·自动脚本篇(2)设置初始变量脚本 auto/init
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name
- 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init
- 解剖Nginx·自动脚本篇(3)源码相关变量脚本 auto/sources
- 解剖 Nginx ·自动脚本篇(3)源码相关变量脚本 auto/sources
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name
- 解剖Nginx·自动脚本篇(5)编译器相关主脚本
- 解剖Nginx·自动脚本篇(4)工具型脚本系列
- 解剖Nginx·自动脚本篇(4)工具型脚本系列
- 解剖Nginx·自动脚本篇(7)类型相关脚本系列
- 解剖Nginx·自动脚本篇(7)类型相关脚本系列
- 解剖Nginx·模块开发篇(6)配置文件config入门
- 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name